如何自动生成Guava单元测试?


31

番石榴具有自动生成的单元测试用例:

番石榴的单元测试数量惊人:截至2012年7月,番石榴测试包包括286,000多个单独的测试用例。其中大多数都是自动生成的,而不是手工编写的,但是Guava的测试覆盖面非常全面,尤其是对于com.google.common.collect。

它们是如何产生的?使用了哪些技术和技术来设计和生成它们?


我记得曾经见过某个Google花花公子的演讲触及了这个话题。虽然没有关于名称线索,会谈是在一些Java约定,我认为
Zavior

3
com.google.common.collect.testing包中有许多类的名称中带有“ Generator”的类-使其看起来像是用于生成测试的框架。也有子包,其类记录为测试的“骨架”或“基类” ...
gnat 2012年

1
@gnat是的,我确定我在某个地方看到它。例如,com.google.common.collect.testing.features显示集合类应满足的特征/约束,而测试用例则是它们的组合。这样他们就可以参数化测试
dzieciou 2012年


这个问题引起了社区的广泛关注,但到目前为止还没有合理的答案,因此我遵循了Martin的建议并将其放在此处:sqa.stackexchange.com/questions/5214/…
dzieciou 2012年

Answers:


8

大量测试中的很大一部分是针对Guava集合实现的。他们编写了通用测试,全面测试了集合接口,并且每个实现都会生成一个套件。见,例如,类叫CollectionAddAllTesterListIndexOfTester

所有这些都由名为testlib的库提供支持,该库作为Guava的一部分提供。这是很通用的。它支持为任何接口(不仅是集合)编写通用测试。您可以指定Feature可能的实现并进行测试(例如,如果您的集合不可修改,您期望从中获得不同的结果set.add()),并且在运行测试时,请指定实现支持的功能。

它基于JUnit 3,而不是4。通常,您有一个扩展TestCase了名为的方法的类testSomething(),并且JUnit反射地运行它们。testlib库挂接了这些测试的运行,因此生命周期如下所示:

  • 对于您要测试的每个实现
  • 对于每种(适用的)测试方法
  • 创建TestCase实例
  • 初始化TestSubjectGenerator–这是您在实际创建测试主题时扩展的testlib接口
  • 反思地运行测试方法。在此方法期间,getSubjectGenerator()可以访问测试对象

关键是额外的初始化步骤,使他们可以将特定的测试对象注入通用测试用例中。

写了一篇关于如何为自己的接口编写testlib生成套件的文章。

(也已在sqa网站上发布了相同的问题。)


6

有单元测试生成器。例如,在.NET世界中,诸如Microsoft Pex之类的工具可以做到这一点。

例如,Microsoft Pex尝试基于代码分析尝试将所有可能的值用作方法的参数。期望一些参数使该方法引发异常。这样的事情可以自动测试创建。静态值(例如在某些情况下返回的空字符串)也可以自动进行测试。


2
这是一个随机测试,仅对否定路径测试有用(异常,无效输入,崩溃-es,超时)。我相信他们也为顺利进行而生成了测试,这需要更多的设计,而不仅仅是启动静态分析工具。
dzieciou 2012年

而且我知道有一些方法和工具可以生成幸福道路的测试(例如,参见此答案),但是我对在番石榴的特殊情况下如何完成测试很感兴趣
dzieciou 2012年
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.