python - 自动生成代码 : automatic or manual? 的单元测试

标签 python unit-testing code-generation

我知道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, nmum 和所有其他米的倍数),是否足以确保单位生成功能似乎正常工作?还是别的?

最佳答案

您指出自动生成测试用例的弱点是正确的。测试的用处在于采用两条不同的路径(您的代码和您自己的心理推理)来得出应该是相同的答案——如果您两次使用相同的路径,则不会测试任何内容。

总结:永远不要编写自动生成的测试,除非用于生成测试结果的算法比您正在测试的算法简单得多。 (排序算法的测试是自动生成测试是一个好主意的例子,因为验证数字列表是否按排序顺序很容易。另一个很好的例子是解谜程序 as suggested by ChrisW 在评论。在这两种情况下,自动生成都是有意义的,因为验证给定解决方案是否正确比生成正确解决方案要容易得多。)

我对你的案例的建议:手动测试一小部分有代表性的可能性。

[澄清:某些类型的自动化测试是合适且非常有用的,例如fuzzing .我的意思是,为生成的代码自动生成单元测试没有帮助。]

关于python - 自动生成代码 : automatic or manual? 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845887/

相关文章:

python - python 单元测试中的 Neo4j 临时数据库

compiler-construction - BNF的BNF是什么?即我们如何定义 BNF 元语法?

python - 无法从 QWidget 更改 QSlider 的值

python - 错误 :Reverse for 'password_reset_confirm' not found. 'password_reset_confirm' 不是有效的 View 函数或模式名称

python - 将带有前导零整数的字符串转换为 json

java - 使用 Mockito 捕获两个参数

python - 如何对不返回任何内容的函数进行单元测试?

c - 为什么 Clang 的汇编器输出是有条件跳转到无条件跳转?

c - 68000,可移植JIT库

python - Opencv - 灰度模式与灰度颜色转换