【发布时间】:2019-04-09 19:34:46
【问题描述】:
一位同事正在审查我的一些关于某个字符串生成的单元测试代码,这引发了一场冗长的讨论。他们说预期的结果都应该是硬编码的,并且担心我的很多测试用例都在使用正在测试的东西来进行测试。
假设有一个简单的函数返回带有一些参数的字符串。
generate_string(name, date) # Function to test
result 'My Name is {name} I was born on {date} and this isn't my first rodeo'
----Test----
setUp
name = 'John Doe'
date = '1990-01-01'
test_that_generate_string_function
...
expected = 'My Name is John Doe I was born on 1990-01-01 and this isn't my first rodeo'
assertEquals(expected, actual)
我的同事马上就认为预期结果应该始终是硬编码的,因为它不再有任何机会让实际结果影响预期结果。
test_date_hardcoded_method
...
date = 1990-01-01
actual = generate_string(name, date)
expected = 'My Name is John Doe I was born on 1990-01-01 and this isn't my first rodeo'
因此,如果他们想确保日期完全符合要求,他们会传入一个日期值并对预期结果进行硬编码。对我来说,这是有道理的,但也似乎是多余的。该函数已经进行了测试,以确保整个字符串符合预期。任何偏离都会导致测试失败。我的方法是获取实际结果,对其进行解构,对特定内容进行硬编码,然后将其重新组合在一起以用作预期结果。
test_date_deconstucted_method
...
date = get_date()
actual = generate_string(name, date)
actual_deconstructed = actual.split(' ')
actual_deconstructed[-7] = '1990-01-01' # Hard code small expected change
expected = join.actual_deconstructed
assertEquals(expected, actual)
我最终使用每种方法创建了两个测试单元,看看我是否能理解它们的来源,但我就是看不到。当所有预期结果都被硬编码时,任何微小的变化都会使绝大多数测试失败。如果“不是”需要是“不是”,hardcoed_method 将失败,直到有人手动更改内容。 Whist deconstructed_method 只关心日期并且仍然会通过它的测试。只有当日期发生意外情况时,它才会失败。在其他人进行更改后只有少数测试失败,因此很容易准确地确定出了什么问题,我认为这就是单元测试的全部意义所在。
我还处于我第一份编程工作的第一个月内。我的同事比我更有经验。我对自己的信念为零,通常只接受别人的意见作为真理,但这对我来说更有意义。我理解他们的想法,即从实际结果中获取预期结果可能很糟糕,但我相信所有其他测试会形成一个通知测试网络。字符串格式、标记值和格式都包括在内,以及检查任何不正确的硬编码测试。
是否应该对每个测试的预期结果进行硬编码?一旦基础工作已经过测试,使用实际结果来告知预期结果是否不好?
【问题讨论】:
-
对于标题
Is it bad practice to base expected results off actual results in unit testing?,我的回答是肯定的,这是不好的做法。 -
For
My co-worker was instant that the expected result should always be hard-coded, as it stops there being any chance that the actual result can influence the expected result.听起来你在转述。我并不总是对我的结果进行硬编码,而是使用生成测试和结果的生成器,它不使用被测试代码中的任何方法或基本方法。这通常很困难,因为很多时候我不得不跳过铁环重新发明轮子,当我想不出办法时,我会对结果进行硬编码。 -
对于
The function already has a test to make sure the entire string is as expected.编程和证明不是一回事。很少有程序能够证明某些事情。对于I trust all the other tests to form a web of informing tests;相信我,我有一个bridge for sale。
标签: unit-testing language-agnostic hardcode