我目前正在为LibFX添加一个新功能,为此我创建了一些类似于Java Collections Framework的自定义集合。 我一直在寻找可以针对它们进行测试的测试,并很高兴发现Google的Guava包含了我所需要的:一个庞大的测试套件,它针对JDK和Guava的所有集合接口验证了我实现的每个细节。

让我们快速浏览一下。

总览

这篇文章将首先展示如何设置项目,然后再着手进行实际测试。

我没有创建专门的示例,但是您可以看到我如何在LibFX中使用它 。

设定

为此,我们需要JUnit,Guava-Testlib和一些样板代码。

获取JUnit

如果您尚未在项目中使用JUnit,请在此处获取。 如果您使用Maven或Gradle:

Maven的依赖项信息

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

Gradle的依赖项信息

testCompile 'junit:junit:4.12'

获取番石榴

我们实际上需要的不是Guava本身,而是Guava-Testlib 。 您可以从中央存储库下载它, 该存储库还包含不同管理者的依赖项信息。

为了您的方便:

Maven的依赖项信息

<dependency><groupId>com.google.guava</groupId><artifactId>guava-testlib</artifactId><version>18.0</version><scope>test</scope>
</dependency>

Gradle的依赖项信息

testCompile 'com.google.guava:guava-testlib:18.0'

写一些样板

假设您要编写一个MySet和相应的MySetTest

通过JUnit-3.8.x方式,创建一个方法public static Test suite();. JUnit查找此方法,并使用它来识别将为该类运行的所有测试。 在该方法内,创建一个TestSuite并添加我们将要进一步编写的测试:

MySetTest中的样板

public class MySetTest {public static Test suite() {return new MySetTest().allTests();}public Test allTests() {TestSuite suite =new TestSuite("package.name.of.MySetTest");suite.addTest(testForOneToWayUseMySet());suite.addTest(testForAnotherWayToUseMySet());return suite;}}

(我没有尝试使用JUnit 4的注释来执行此操作。如果您这样做了,请ping通,然后将其包含在此处。)

放置好样板后,您可以使用JUnit运行此类,例如,从IDE内部或CI服务器上运行。

测试您的实施

至此,我们可以开始为实现实际创建测试了。 或者,更准确地说,告诉番石榴如何为我们做到这一点。 这是一个分为两部分的过程:一个为集合中的元素和被测单元创建一个生成器,另一个使用Guava的测试套件构建器之一来创建针对实现量身定制的全面测试集。

我们将继续测试Set的实现。 在下面,我们将看到可用的其他接口测试套件。

元素生成器和被测单元

测试套件生成器要求您允许在集合中创建样本元素并实例化集合。 为此,您必须实现TestSetGenerator<E> (其中E是元素的类型)。

这很简单, order(List<E>)是可能需要考虑的唯一方法。 请注意,与文档相反,即使未报告CollectionFeature.KNOWN_ORDER ,testlib(18.0)的当前版本也确实调用了此方法(有关功能的详细信息,请参见下文)。 就我而言 ,返回插入顺序就足够了。

测试套件生成器

现在,这才是真正的魔术发生。 您从上方获取生成器,将其传递给正确的测试套件生成器,指定您的集合具有哪些功能,它将创建定制的全面测试套件:

使用“ SetTestSuiteBuilder”创建测试

public Test testForOneToWayUseMySet() {return SetTestSuiteBuilder.using(new MySetGenerator()).named("one way to use MySet").withFeatures(CollectionSize.ANY,CollectionFeature.ALLOWS_NULL_VALUES,CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION,CollectionFeature.SUPPORTS_ADD,CollectionFeature.SUPPORTS_ITERATOR_REMOVE,CollectionFeature.SUPPORTS_REMOVE,).createTestSuite();
}

特征

指定正确的功能很重要。 查看两个枚举CollectionSizeCollectionFeatures以查看存在哪些可能性来描述您的集合的行为。

请注意,创建的测试会同时验证功能! 例如,如果ALLOWS_NULL_VALUES ,构建器将生成测试,以验证向集合添加null会抛出NullPointerException

抑制测试

通过在构建器上调用suppressing ,可以指定将不会运行的测试方法。 当这些功能不足以精确指定行为时,它似乎是最后的手段。 我没有使用它。

设置与拆卸

如果您必须在每次测试之前或之后运行代码,则可以将其作为Runnable分别withTearDownwithSetUpwithTearDown (都可以在构建器上调用)。

可用的测试套件

当然,您也可以为其他接口生成测试套件。 乍一看就产生了以下可能性:

Java的集合:

  • 采集
  • 迭代器
  • 清单
  • 地图
  • 导航地图
  • 导航集
  • 队列
  • SortedMap
  • SortedSet

番石榴的收藏:

  • 双图
  • ListMultimap
  • 多图
  • 多集
  • SetMultimap
  • SortedMultiset
  • SortedSetMultimap

* TestSuiteBuilder (注意通配符)进行类型搜索会生成一些其他生成器。 我没有调查它们,但是有可能将其用于其他情况下的测试。

为了使用它们,只需实现相应的Test...Generator并将其交给相应的...TestSuiteBuilder

反射

我们已经看到了如何使用Guava的Testlib测试集合的实现:如何将其和JUnit包含在我们的项目中,运行它所需的样板以及对生成器和测试套件生成器的概述。 后者是发生所有魔术的地方,它可以创建全面的测试,以适合我们对实现及其功能的描述。

翻译自: https://www.javacodegeeks.com/2015/03/test-collection-implementations-with-guava.html

Guava的测试集合实现相关推荐

  1. guava集合操作类的使用_使用Guava进行测试集合的实现

    guava集合操作类的使用 我目前正在为LibFX添加一项新功能,为此我创建了一些类似于Java Collections Framework的自定义集合. 我一直在寻找可以与之对抗的测试,并很高兴发现 ...

  2. scala集合转java_Java,Scala,Guava和Trove集合-它们可以容纳多少数据?

    scala集合转java 关于我们的数据结构的一个有趣的事情是,即使我们非常熟悉它们,但对于我们来说,仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目. 我们可能会在学校, ...

  3. Java,Scala,Guava和Trove集合-它们可以容纳多少数据?

    关于我们的数据结构,令人着迷的事情之一是,即使我们对它们非常熟悉,我们仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目. 我们可能会在学校,高级开发人员那里学到这一点,或者 ...

  4. junit集成Hamcrest测试集合中某个属性是否包含特定值

    junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit< ...

  5. Guava中针对集合的 filter和过滤功能

    Guava中针对集合的 filter和过滤功能 博客分类:  JAVA相关 在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子: Java代码   ...

  6. Guava 2.2-新集合类型

    Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...

  7. 测试服务器最大链接数_JMeter压力测试集合点教程

    基本公式 线程数=QPS*time 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间 故QPS*time就是所有请求完成响应所需要的总时间,如果需要在一秒完成所有请求的响应, ...

  8. Guava 实用操作集合

    guava 是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.         大家平时经常遇到某些相同的问题,自己写代码也都能解决. ...

  9. 【Java技术专题】「Guava技术系列」Guava-Collections实战使用相关Guava不一般的集合框架

    Google Guava Collections 使用介绍 简介 Google Guava Collections 是一个对 Java Collections Framework 增强和扩展的一个开源 ...

最新文章

  1. mysql myisam转innodb_Mysql MyISAM数据库批量转换表引擎为Innodb
  2. python opencv cv.applyColorMap()函数(颜色映射)ColormapTypes【将Intel Realsense D435深度图的黑白图映射为彩色图】
  3. android高级篇收录
  4. 详解MySQL中EXPLAIN解释命令
  5. BCGSoft Demo示例展示:对话框示例
  6. 40岁的程序员还能找到工作吗_学会了Vue就能找到前端工作吗
  7. 图神经网络(一)--综述
  8. clickhouse分布式查询
  9. iOS自定义SearchBar样式
  10. 基于ENVI/IDL实现国产卫星影像批处理功能
  11. Linux组件封装(一)中互斥锁MutexLock的封装
  12. fiddler4+雷电模拟器4.0.82抓包设置
  13. js打开新窗口的方法总结
  14. 机器视觉可以应用到哪些领域,你都知道吗?
  15. 联想电脑无法调节屏幕亮度
  16. Direcshow中视频捕捉和参数设置报告
  17. 东南大学破格保研挂科_东南大学破格保研挂科_兜兜转转终入四牌楼——东南大学保研心得...
  18. 常见的Web服务器、应用服务器(Apache、tomcat、jetty、Nginx)简介及优缺点总结
  19. Flask构建微信订餐小程序②-全站统计
  20. 用MATLAB分析电能质量,基于matlab仿真的电能质量研究.doc

热门文章

  1. 学习心得——李嫣然、逯广捷
  2. java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)
  3. php中时间轴,PHP时间轴函数
  4. 转-Kafka【第一篇】Kafka集群搭建
  5. XML——文档类型定义(DTD-Document Type Definition)
  6. orm提取指定列_使用ORM提取数据很容易! 是吗?
  7. hibernate删除记录_Hibernate记录:常见问题的提示和解决方案
  8. jvm7 jvm8_我们真的仍然需要32位JVM吗?
  9. gradle 构建应用流程_使用Gradle构建和应用AST转换
  10. docker集群_使用Docker,Chef和Amazon OpsWorks进行集群范围的Java / Scala应用程序部署...