我已经遇到这个困境了好几次.我的单元测试是否重复了他们测试的方法的功能以验证其完整性?或者单位测试是否尝试通过大量手动创建的输入和预期输出实例来测试该方法?
我主要提出的问题是,您正在测试的方法是相当简单的,并且正确的操作可以通过扫视代码一分钟来验证.
简化例子(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
我明白,大多数情况下,您测试的方法不会简单到足以证明这样做.但我的问题依然存在;在某些情况下,这是一种有效的方法(为什么或为什么不)?
解决方法
这是一个有争议的立场,但我相信
unit testing using Derived Values远远优于使用任意硬编码的输入和输出.
问题是,由于算法变得更加复杂,如果用硬编码的值表示,则输入和输出之间的关系变得模糊.单位测试最终是一个假设.它可能在技术上工作,但是由于导致了Obscure Tests,它会损害测试的可维护性.
使用Derived Values测试结果可以确定测试输入与预期输出之间的更清晰的关系.
这个没有测试任何东西的论据根本不是真的,因为任何测试用例只会运行通过SUT的路径的一部分,所以没有一个测试用例将重现整个被测试的算法,但测试的组合将会所以.
另外一个好处就是你可以在use fewer unit tests to cover the desired functionality,甚至让他们更多的交流在同一时间.最终的结果是更简单和更可维护的单元测试.