Pet*_*uza 3 language-agnostic testing tdd unit-testing
我正在用C++中的CppUTest实现自动化测试.
我意识到我最终几乎要复制并粘贴要在测试中测试的逻辑,所以我可以检查预期的结果.
我做得对吗?应该不是吗?
编辑:我会尝试更好地解释:
正在测试的单元接受输入A,进行一些处理并返回输出B
因此,除了进行一些黑盒检查,比如检查输出是否在可预期的范围内,我还想如果逻辑按预期工作,看看我得到的输出B是输入A IE 的正确结果.
因此,例如,如果单位只是使A乘以2得到B,那么在测试中我没有其他检查方式,而是再次计算A次2来检查B以确保它没有问题.
这就是我所说的重复.
// Actual function being tested:
int times2( int a )
{
return a * 2;
}
Run Code Online (Sandbox Code Playgroud)
.
// Test:
int test_a;
int expected_b = test_a * 2; // here I'm duplicating times2()'s logic
int actual_b = times2( test_a );
CHECK( actual_b == expected_b );
Run Code Online (Sandbox Code Playgroud)
.
PS:我想我会用我的实际源代码在另一个问题中重新制定这个问题.
如果您的目标是为现有代码构建自动化测试,那么您可能做错了.希望你知道frobozz.Gonkulate()的结果是什么应该是各种输入,并可以编写测试来检查Gonkulate()返回正确的东西.如果你必须复制Gonkulate()的复杂逻辑来找出答案,你可能想要问自己,你对逻辑开始的理解程度如何.
如果你正在尝试进行测试驱动的开发,那你肯定做错了.TDD包含许多快速周期:
第1步 - 首先编写测试- 是TDD的重要组成部分.我从你的问题推断出你正在编写代码并稍后进行测试.
因此,例如,如果单位只是使A乘以2得到B,那么在测试中我没有其他检查方式,而是再次计算A次2来检查B以确保它没有问题.
是的你是!您知道如何计算A乘以2,因此您不需要在代码中执行此操作.如果A是4那么你就知道答案是8.所以你可以把它当作预期值.
CHECK( actual_b == 8 )
Run Code Online (Sandbox Code Playgroud)
如果你担心魔法数字,不要.没有人会对以下行中硬编码数字的含义感到困惑:
CHECK( times_2(4) == 8 )
Run Code Online (Sandbox Code Playgroud)
如果您不知道结果应该是什么,那么您的单元测试就没用了.如果你需要计算预期的结果,那么你要么使用与函数相同的逻辑,要么使用替代算法来计算结果.在第一种情况下,如果你复制的逻辑不正确,你的测试仍然是通过!在第二种情况下,您将引入另一个发生错误的地方.如果测试失败,您将需要确定它是否失败,因为测试中的函数有错误,或者您的测试方法有错误.