自动化测试感觉很像重复测试逻辑,我做得对吗?

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:我想我会用我的实际源代码在另一个问题中重新制定这个问题.

Edm*_*ppe 5

如果您的目标是为现有代码构建自动化测试,那么您可能做错了.希望你知道frobozz.Gonkulate()的结果是什么应该是各种输入,并可以编写测试来检查Gonkulate()返回正确的东西.如果你必须复制Gonkulate()的复杂逻辑来找出答案,你可能想要问自己,你对逻辑开始的理解程度如何.

如果你正在尝试进行测试驱动的开发,那你肯定做错了.TDD包含许多快速周期:

  1. 写一个测试
  2. 看着它失败了
  3. 让它通过
  4. 必要时进行重构以改进整体设计

第1步 - 首先编写测试- 是TDD的重要组成部分.我从你的问题推断出你正在编写代码并稍后进行测试.


sau*_*aus 5

因此,例如,如果单位只是使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)

如果您不知道结果应该是什么,那么您的单元测试就没用了.如果你需要计算预期的结果,那么你要么使用与函数相同的逻辑,要么使用替代算法来计算结果.在第一种情况下,如果你复制的逻辑不正确,你的测试仍然是通过!在第二种情况下,您将引入另一个发生错误的地方.如果测试失败,您将需要确定它是否失败,因为测试中的函数有错误,或者您的测试方法有错误.

  • @Petruza:你不应该检查函数的整个支持.那不是测试,而是一个完整的规范.如果不重写,则无法在其全部输入范围内检查该功能.测试仅包含一些示例和极端情况,以确保逻辑正常工作. (2认同)
  • "使用逻辑进行测试" - 没有.因为如果你的逻辑不正确,你的测试仍然会通过.使用要测试的逻辑进行测试比完全不测试更有害,因为除了不测试逻辑的正确性之外,您误导了任何负责维护代码的人. (2认同)