自动化单元测试创​​建


11

有哪些策略可用于自动创建单元测试用例?为了能够至少生成一个不错的测试用例框架,您需要在每个类中研究哪些方面?

我意识到综合的自动解决方案不切实际,但是我想至少通过创建一个骨架来加快测试的创建速度。我不是在寻找代码示例,而只是在寻找一些从何处开始的建议或在何处进行过类似的示例,这样我就可以了解他们如何实现它以及可能的实现方式。

我对在PHP中创建单元测试框架的方法特别感兴趣,该方法没有提供其他语言提供的所有工具,例如完整的类型提示


最新的Visual Studio是您所需要的...
乔布

Answers:


5

您的策略和框架非常重要地取决于要生成的测试类型,所需的覆盖范围以及所使用的语言/环境。

编写测试生成器相当简单,对于C或Java之类的语言,它可以读取类签名并自动生成针对标准极端情况的测试(将0、2个随机值,MAX_INT,MIN_INT传递给整数参数,将null表示可空值等)。然后,您可以运行生成的测试,记录每个测试的结果,并手动筛选它们以删除不相关的测试,批准通过的测试可接受的结果(以便它们可以从此自动通过),并将其标记为无效的失败。

您可以通过标记/注释/重构类来增强此功能,以帮助生成器提供额外的提示。您可能有一个标记,其中列出了允许方法调用引发的所有可能的异常,或者为整数参数提供了较小范围的有效整数。将它们视为必须自己编写测试的捷径。

因此,这是您要查看的一些组件:

  • 自动解析源代码/功能签名/手动注释,生成标准测试用例或等待您完成输入的测试用例的大纲/签名的组件。
  • 标记/注释/注释的不断增长/改变的语言,可以达到任何级别的粒度(方法/类/签名/ while循环/等),以表示自动测试生成器的提示。理想情况下,您应该能够使用这种语言,而无需重新编码框架或其中的任何块
  • 自动测试运行程序,能够识别新/旧测试,并针对每个测试记录“可接受的”答案/进行测试。理想情况下,该跑步者将建立一个数据库,用于测试运行,每个测试接受/拒绝的结果以及当前可接受的结果。
  • 给定类名和名称->值映射的自动“对象伪造者”可以生成模仿该类的对象,返回用于函数调用,访问器,公共数据槽等的可自定义数据。

有很多测试框架,其中已经包括针对各种语言和平台的大量功能。尽管您自己开始进行这项工作并在内部有机地发展这种框架是相当容易的,但这也是一个无尽的长期项目,可能会重复现有的工作。我建议您花大量时间先看看可用的内容,然后再决定是否值得花时间去探索。


5

我还没有机会在大小或复杂性有意义的应用程序上使用它,但是有包括Google的CodePro AnalytiX在内工具可以自动为Java应用程序生成单元测试。我还发现了商用产品Parasoft的C ++ Test,它似乎可以生成C ++单元测试。

这些应用程序使用启发式方法生成测试用例。我不确定是否可以使用一个框架来生成框架,但是可以找到一些结构。我倾向于关注循环,条件语句(if块,switch/ case语句)和异常,并创建测试用例以强制执行不同的执行路径。

我不会专注于通过尝试创建框架或模板来加快测试的编写速度,而是通过改进对规范和/或实现的分析以及编写高质量的测试来加快测试的编写速度。能够及早发现哪些测试可以带来最大的价值,编写这些测试,然后在以后填补空白,将对生产率和质量产生更大的影响。


为了提供更多的宣传,Falcon在一个项目上试用了CodePro,并对他的经历进行了一些描述


Google的CodePro Analytix听起来很有趣。但是“ Quis custodiet ipsos custodes?” 谁测试测试?这只能用于通过单元测试备份现有项目,并且可能无法检测到故障,而是假设缺陷是正确的。
猎鹰

@Falcon您不能盲目相信任何工具-这样做只会引起更多的麻烦。我认为实用程序员的技巧“关心您的手艺”在这里适用。CodePro确实包含一个测试编辑器,以使其很容易查看传入的值和预期结果,然后对其进行更改(然后更新生成的测试代码以反映这些更改)。
Thomas Owens

我只是想知道在这种情况下,人机还是机器更可靠。我认为这些生成的测试比手动编写的测试会引起更多的头痛。理想情况下,无论如何都应该首先编写测试。但是我一定会尝试的。我很乐意看到一个可以根据正式要求和一些元数据胶生成测试的工具,以便有一天与系统接口。
猎鹰

@Falcon是的,理想情况下,应该首先编写一些测试,但是直到有了实现并可以进行白盒测试为止,您不一定会看到实现后就可以看到的所有不同情况。如果您有机会使用CodePro的测试生成功能,可以将您的想法发布到某个地方,并以某种方式获得我的链接吗?我很想知道它的效果以及其他人的使用经验。
Thomas Owens

下周,我将使用中等大小的J2EE应用程序(120 klocs)对其进行测试,该应用程序包含一些非常严格的业务规则,并在此向您介绍我的经验。
猎鹰

1

几年前,我写了一个生成器来加快.NET项目的单元测试。有一个很大的代码库,没有任何单元测试,它旨在快速增加基本覆盖范围。以下是一些可能有帮助的说明:

  • 我的机会是,在其基础上开发项目的核心框架提供了标准操作和类命名。如果您想编写自己的代码,那么像这样的标准结构将大有帮助。
  • data-driven testing如果您的代码库允许,使用会有所帮助。测试框架为每个单元测试创​​建了一个数据库表来存储测试数据,因此该表中的每一行都是一个单独的测试,并且不需要其他代码(表示规则)。从那时起,可以轻松地自动创建或手动输入实际测试。
  • 生成的单元测试很简单,但smoke test至少可以用作。对于较高风险的区域,编写了其他手动测试。

总而言之,我同意通用解决方案是不切实际的(如果可能的话)。我相信,如果代码库适合于测试生成并且测试框架可以利用其结构,则机会会更好。

(作为旁注,有Pex,但它是针对.NET的)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.