我知道similar questions之前有人问过,但他们并没有真正拥有我正在寻找的信息 - 我不是在问如何生成单元测试的机制,而是问这是否是个好主意。
我用 Python 编写了一个模块,其中包含表示物理常数和测量单位的对象。许多单位是通过在基本单位上添加前缀而形成的——例如从 m
我得到 cm
, dm
, mm
, hm
, um
, nm
, pm
, 等 s
, g
, 也是一样>C
等。当然,我已经编写了一个函数来执行此操作,因为最终结果超过 1000 个单独的单元,手动将它们全部写出来将是一个很大的痛苦;-) 它的工作方式类似于这个(不是实际的代码):
def add_unit(name, value):
globals()[name] = value
for pfx, multiplier in prefixes:
globals()[pfx + name] = multiplier * value
add_unit('m', <definition of a meter>)
add_unit('g', <definition of a gram>)
add_unit('s', <definition of a second>)
# etc.
当我想为这些单元编写单元测试(没有双关语意)以确保它们都具有正确的值时,问题就来了。如果我编写自动为每个单元单独生成测试用例的代码,单元生成函数中的任何问题也可能会出现在测试生成函数中。但是考虑到替代方案(手动写出所有 1000 多个测试),我是否应该继续编写一个测试生成函数,非常仔细地检查它并希望它正常工作?或者我应该只测试一系列单位 (m
, cm
, dm
, km
, nm
、um
和所有其他米的倍数),是否足以确保单位生成功能似乎正常工作?还是别的?
最佳答案
您指出自动生成测试用例的弱点是正确的。测试的用处在于采用两条不同的路径(您的代码和您自己的心理推理)来得出应该是相同的答案——如果您两次使用相同的路径,则不会测试任何内容。
总结:永远不要编写自动生成的测试,除非用于生成测试结果的算法比您正在测试的算法简单得多。 (排序算法的测试是自动生成测试是一个好主意的例子,因为验证数字列表是否按排序顺序很容易。另一个很好的例子是解谜程序 as suggested by ChrisW 在评论。在这两种情况下,自动生成都是有意义的,因为验证给定解决方案是否正确比生成正确解决方案要容易得多。)
我对你的案例的建议:手动测试一小部分有代表性的可能性。
[澄清:某些类型的自动化测试是合适且非常有用的,例如fuzzing .我的意思是,为生成的代码自动生成单元测试没有帮助。]
关于python - 自动生成代码 : automatic or manual? 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845887/