Answers:
您的策略和框架非常重要地取决于要生成的测试类型,所需的覆盖范围以及所使用的语言/环境。
编写测试生成器相当简单,对于C或Java之类的语言,它可以读取类签名并自动生成针对标准极端情况的测试(将0、2个随机值,MAX_INT,MIN_INT传递给整数参数,将null表示可空值等)。然后,您可以运行生成的测试,记录每个测试的结果,并手动筛选它们以删除不相关的测试,批准通过的测试可接受的结果(以便它们可以从此自动通过),并将其标记为无效的失败。
您可以通过标记/注释/重构类来增强此功能,以帮助生成器提供额外的提示。您可能有一个标记,其中列出了允许方法调用引发的所有可能的异常,或者为整数参数提供了较小范围的有效整数。将它们视为必须自己编写测试的捷径。
因此,这是您要查看的一些组件:
有很多测试框架,其中已经包括针对各种语言和平台的大量功能。尽管您自己开始进行这项工作并在内部有机地发展这种框架是相当容易的,但这也是一个无尽的长期项目,可能会重复现有的工作。我建议您花大量时间先看看可用的内容,然后再决定是否值得花时间去探索。
我还没有机会在大小或复杂性有意义的应用程序上使用它,但是有包括Google的CodePro AnalytiX在内的工具可以自动为Java应用程序生成单元测试。我还发现了商用产品Parasoft的C ++ Test,它似乎可以生成C ++单元测试。
这些应用程序使用启发式方法生成测试用例。我不确定是否可以使用一个框架来生成框架,但是可以找到一些结构。我倾向于关注循环,条件语句(if
块,switch
/ case
语句)和异常,并创建测试用例以强制执行不同的执行路径。
我不会专注于通过尝试创建框架或模板来加快测试的编写速度,而是通过改进对规范和/或实现的分析以及编写高质量的测试来加快测试的编写速度。能够及早发现哪些测试可以带来最大的价值,编写这些测试,然后在以后填补空白,将对生产率和质量产生更大的影响。
为了提供更多的宣传,Falcon在一个项目上试用了CodePro,并对他的经历进行了一些描述。
几年前,我写了一个生成器来加快.NET项目的单元测试。有一个很大的代码库,没有任何单元测试,它旨在快速增加基本覆盖范围。以下是一些可能有帮助的说明:
data-driven testing
如果您的代码库允许,使用会有所帮助。测试框架为每个单元测试创建了一个数据库表来存储测试数据,因此该表中的每一行都是一个单独的测试,并且不需要其他代码(表示规则)。从那时起,可以轻松地自动创建或手动输入实际测试。smoke test
至少可以用作。对于较高风险的区域,编写了其他手动测试。总而言之,我同意通用解决方案是不切实际的(如果可能的话)。我相信,如果代码库适合于测试生成并且测试框架可以利用其结构,则机会会更好。
(作为旁注,有Pex,但它是针对.NET的)