unit-testing - 自动化测试感觉很像复制被测试的逻辑,我做对了吗?

标签 unit-testing testing language-agnostic tdd

我正在使用 C++ 中的 CppUTest 实现自动化测试。
我意识到我最终几乎是在测试本身上复制和粘贴要测试的逻辑,这样我就可以检查预期的结果。
我做对了吗?不应该吗?

编辑:我会尝试更好地解释:
被测单元接受输入A,进行一些处理并返回输出B
因此,除了进行一些黑框检查,比如检查输出是否在预期范围内,我还想看看我得到的输出 B 是否是输入 A 的正确结果如果逻辑按预期工作。
因此,例如,如果该单元只是使 A 乘以 2 以产生 B,那么在测试中,除了再次计算 A 之外,我没有其他检查方法 次 2 来检查 B 以确保一切正常。
这就是我所说的重复。

// Actual function being tested:  
int times2( int a )
{
  return a * 2;
}

.

// 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 );

.

PS:我想我会在另一个问题中用我的实际源代码重新表述这一点。

最佳答案

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

如果您尝试进行测试驱动开发,那么您肯定做错了。 TDD 由许多快速循环组成:

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

第 1 步 - 首先 编写测试 - 是 TDD 的重要组成部分。我从您的问题中推断您是先编写代码,然后再编写测试。

关于unit-testing - 自动化测试感觉很像复制被测试的逻辑,我做对了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7827432/

相关文章:

sql - 哪种语言有好的 SQL 解析库?

javascript - Jasmine 测试 knockout ObservableArray

html - 如何使用 vw 单位在 css 中创建响应圈?

perl selenium:Test::Exception、正确用法和好的代码示例?

java - Alexa BDD 测试

ruby-on-rails-3 - Rails 3 功能测试 : Can't mass-assign protected attributes: controller, 操作

php - 模拟多个接口(interface)

c# - 如何模拟 WebOperationContext 进行单元测试?

java - 为什么 (.*)* 进行两个匹配并且在 $1 组中没有选择任何内容?

language-agnostic - 如何学习多线程并行编程?