自动生成代码的单元测试:自动还是手动?

时间:2009-05-10 19:06:44

标签: python unit-testing code-generation

我知道similar questions之前曾被问过,但他们并不真正掌握我正在寻找的信息 - 我不是在询问如何生成单元测试的机制,而是它是否是一个好主意

我在Python中编写了一个模块,其中包含表示物理常数和测量单位的对象。通过在基本单元上添加前缀来形成许多单元 - 例如,来自m我得到cmdmmmhmumnmpm,同样适用于sgC等。当然,我已经编写了一个函数来执行此操作,因为最终结果是超过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多个测试),我是否应该继续编写测试生成函数,请仔细检查并希望它正常工作?或者我应该只测试一系列单位(mcmdmkmnmum和仪表的所有其他倍数),足以确保单位生成功能似乎正常工作?或其他什么?

4 个答案:

答案 0 :(得分:1)

如果您自动生成测试:

  • 您可能会发现读取所有测试(检查它们的正确性)会更快,而不是手动编写它们。

  • 它们可能也更易于维护(如果您想稍后编辑它们,则更容易编辑)。

答案 1 :(得分:1)

您正确地认识到自动生成测试用例的弱点。测试的有用性来自于采用两种不同的路径(您的代码和您自己的心理推理)来得出应该是相同的答案 - 如果您同时使用相同的路径,则不会测试任何内容。

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

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

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

答案 2 :(得分:1)

我想说最好的方法是对单元进行单元测试,并且作为单元测试的一部分,您可以采用样本生成结果(仅适用于测试测试的地方,您会认为这些内容与其他方案有显着差异)并将其置于单元测试下以确保生成正常。除此之外,以自动方式定义每个场景几乎没有单元测试值。在进行一些功能测试时可能存在功能测试价值,这些功能测试执行生成的代码以执行您的任何目的,以便为各种潜在单元提供更广泛的覆盖。

答案 3 :(得分:1)

只编写足够的测试以确保您的代码生成正常(足以驱动命令式代码的设计)。声明性代码很少破坏。你应该只测试可能破坏的东西。使用探索性测试可以更好地发现声明性代码中的错误(例如您的情况和用户界面布局),因此为它们编写大量的自动化测试是浪费时间。