自动生成的代码的单元测试:自动还是手动?
作者:互联网
我知道以前曾问过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个测试),我是否应该继续编写测试生成函数,仔细检查一下并希望它能正常工作?还是我应该只测试一组单位(米,厘米,dm,公里,纳米,微米和米的所有其他倍数),仅足以确保单位生成功能似乎正常工作?或者是其他东西?
解决方法:
您应该确定自动生成测试用例的弱点.测试的实用性来自采取两种不同的途径(您的代码和您自己的思维方式)得出应该是相同答案的方法-如果两次都使用相同的途径,则不会进行任何测试.
总结:切勿编写自动生成的测试,除非生成测试结果的算法比您要测试的算法简单得多. (排序算法的测试是自动生成测试何时的一个示例,因为它很容易验证数字列表是否已排序.另一个好的示例是注释中的难题解决程序as suggested by ChrisW.在这两种情况下,自动生成都是有意义的,因为验证给定解决方案的正确性比生成正确的解决方案要容易得多.
我对您的情况的建议:手动测试可能性较小的代表性子集.
[说明:某些类型的自动化测试是适当的并且非常有用,例如fuzzing.我的意思是自动为生成的代码生成单元测试是无益的.]
标签:unit-testing,code-generation,python 来源: https://codeday.me/bug/20191107/2003918.html