在单元测试中,我经常在代码中抛出任意值以查看其作用。例如,如果我知道foo(1, 2, 3)
应该返回17,则可以这样写:
assertEqual(foo(1, 2, 3), 17)
这些数字纯粹是任意的,没有更广泛的含义(例如,它们不是边界条件,尽管我也对此进行了测试)。我很难为这些数字想出好名字,而写类似的东西const int TWO = 2;
显然是无济于事的。这样编写测试是否可以,还是应该将数字分解为常量?
在中,所有魔幻数字是否都相同?,我们了解到,如果从上下文可以明显看出含义,则魔术数字是可以的,但是在这种情况下,数字实际上根本没有任何意义。
const int TWO = 2;
比仅使用更糟糕2
。它违反了规则的精神,旨在违反其精神。
foo
,它就没有任何含义,因此也就没有参数了。但在现实中,我敢肯定的功能不具有名称和参数没有名字bar1
,bar2
和bar3
。举一个更实际的示例,其中的名称具有 含义,然后讨论测试数据值是否也需要名称就更有意义了。
1, 2, 3
3D数组索引是您先前存储值的地方17
,那么我认为此测试会很花哨(只要您也有一些否定的测试)。但是,如果这是计算的结果,则应确保阅读此测试的任何人都将理解为什么foo(1, 2, 3)
应该这样做17
,并且幻数可能不会达到该目标。