ruby - 单元测试应该复制功能还是测试输出?

标签 ruby unit-testing testing tdd

我曾多次遇到这种困境。我的单元测试是否应该复制他们正在测试的方法的功能以验证其完整性?或者单元测试是否应该努力用大量手动创建的输入和预期输出实例来测试该方法?

我主要针对以下情况提出问题:您正在测试的方法相当简单,并且可以通过浏览代码一分钟来验证其正确操作。

简化示例( ruby ):

def concat_strings(str1, str2)
  return str1 + " AND " + str2
end

上述方法的简化功能复制测试:

def test_concat_strings
  10.times do
    str1 = random_string_generator
    str2 = random_string_generator
    assert_equal (str1 + " AND " + str2), concat_strings(str1, str2)
  end
end

我知道大多数情况下,您正在测试的方法不够简单,不足以证明这样做是合理的。但我的问题仍然存在; 在某些情况下这是一种有效的方法吗(为什么或为什么不)

最佳答案

使用相同的实现来测试功能,不会测试任何东西。如果其中一个有错误,另一个也会有。

但是通过与替代实现进行比较来进行测试是一种有效的方法。例如,您可以通过将迭代(快速)方法与计算斐波那契数的简单递归但速度较慢的相同方法的实现进行比较来测试它。

它的一个变体是使用一个只适用于特殊情况的实现。当然,在这种情况下,您只能将其用于此类特殊情况。

在选择输入值时,大多数情况下使用随机值并不是很有效。我更喜欢任何时候精心选择的值(value)观。在您给出的示例中,想到了空值和极长的值,这些值在连接时不适合 String 。

如果您使用随机值,请确保您有办法使用相同的随机值重新创建准确的运行,例如通过记录种子值,并有办法在开始时设置该值。

关于ruby - 单元测试应该复制功能还是测试输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482373/

相关文章:

testing - NoMethodError 对 rspec 使用 has_selector

javascript - 是否可以在 Express.js 中运行 TestCafe 测试?

ruby-on-rails - 如何验证 Rails 中的虚拟属性?

ruby - 验证带有扩展名的电话号码格式

ruby-on-rails - 将多个对象合并在一起的更有效方法

ruby-on-rails - 我应该使用什么数据类型在 Rails 中的 SQLite 中存储大型文本文件和二进制数据

python - 在类中模拟类实例

unit-testing - 谁负责在非初始化依赖注入(inject)方案中附加监听器?

c# - 使用 `ShouldBeEquivalentTo` 、 `ShouldAllBeEquivalentTo` 和 `BeEquivalentTo`

c++ - gcov 忽略源文件中的行