我知道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
和仪表的所有其他倍数),足以确保单位生成功能似乎正常工作?或其他什么?
答案 0 :(得分:1)
如果您自动生成测试:
您可能会发现读取所有测试(检查它们的正确性)会更快,而不是手动编写它们。
它们可能也更易于维护(如果您想稍后编辑它们,则更容易编辑)。
答案 1 :(得分:1)
您正确地认识到自动生成测试用例的弱点。测试的有用性来自于采用两种不同的路径(您的代码和您自己的心理推理)来得出应该是相同的答案 - 如果您同时使用相同的路径,则不会测试任何内容。
总结:从不编写自动生成的测试,除非用于生成测试结果的算法比您正在测试的算法简单得多。 (排序算法的测试是自动生成测试的一个例子,因为很容易验证数字列表是否按顺序排列。另一个很好的例子是拼图解决方案as suggested by ChrisW在这两种情况下,自动生成都很有意义,因为验证给定解决方案是否正确比生成正确的解决方案要容易得多。)
我对你的案例的建议:手动测试一小部分代表性的可能性。
[澄清:某些类型的自动化测试是合适且非常有用的,例如: fuzzing。我的意思是,为生成的代码自动生成单元测试是无益的。]
答案 2 :(得分:1)
我想说最好的方法是对单元进行单元测试,并且作为单元测试的一部分,您可以采用样本生成结果(仅适用于测试测试的地方,您会认为这些内容与其他方案有显着差异)并将其置于单元测试下以确保生成正常。除此之外,以自动方式定义每个场景几乎没有单元测试值。在进行一些功能测试时可能存在功能测试价值,这些功能测试执行生成的代码以执行您的任何目的,以便为各种潜在单元提供更广泛的覆盖。
答案 3 :(得分:1)
只编写足够的测试以确保您的代码生成正常(足以驱动命令式代码的设计)。声明性代码很少破坏。你应该只测试可能破坏的东西。使用探索性测试可以更好地发现声明性代码中的错误(例如您的情况和用户界面布局),因此为它们编写大量的自动化测试是浪费时间。