Guava的测试集合实现
我目前正在为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();
}
特征
指定正确的功能很重要。 查看两个枚举CollectionSize
和CollectionFeatures
以查看存在哪些可能性来描述您的集合的行为。
请注意,创建的测试会同时验证功能! 例如,如果ALLOWS_NULL_VALUES
,构建器将生成测试,以验证向集合添加null会抛出NullPointerException
。
抑制测试
通过在构建器上调用suppressing
,可以指定将不会运行的测试方法。 当这些功能不足以精确指定行为时,它似乎是最后的手段。 我没有使用它。
设置与拆卸
如果您必须在每次测试之前或之后运行代码,则可以将其作为Runnable
分别withTearDown
给withSetUp
或withTearDown
(都可以在构建器上调用)。
可用的测试套件
当然,您也可以为其他接口生成测试套件。 乍一看就产生了以下可能性:
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的测试集合实现相关推荐
- guava集合操作类的使用_使用Guava进行测试集合的实现
guava集合操作类的使用 我目前正在为LibFX添加一项新功能,为此我创建了一些类似于Java Collections Framework的自定义集合. 我一直在寻找可以与之对抗的测试,并很高兴发现 ...
- scala集合转java_Java,Scala,Guava和Trove集合-它们可以容纳多少数据?
scala集合转java 关于我们的数据结构的一个有趣的事情是,即使我们非常熟悉它们,但对于我们来说,仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目. 我们可能会在学校, ...
- Java,Scala,Guava和Trove集合-它们可以容纳多少数据?
关于我们的数据结构,令人着迷的事情之一是,即使我们对它们非常熟悉,我们仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目. 我们可能会在学校,高级开发人员那里学到这一点,或者 ...
- junit集成Hamcrest测试集合中某个属性是否包含特定值
junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit< ...
- Guava中针对集合的 filter和过滤功能
Guava中针对集合的 filter和过滤功能 博客分类: JAVA相关 在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子: Java代码 ...
- Guava 2.2-新集合类型
Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...
- 测试服务器最大链接数_JMeter压力测试集合点教程
基本公式 线程数=QPS*time 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间 故QPS*time就是所有请求完成响应所需要的总时间,如果需要在一秒完成所有请求的响应, ...
- Guava 实用操作集合
guava 是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等. 大家平时经常遇到某些相同的问题,自己写代码也都能解决. ...
- 【Java技术专题】「Guava技术系列」Guava-Collections实战使用相关Guava不一般的集合框架
Google Guava Collections 使用介绍 简介 Google Guava Collections 是一个对 Java Collections Framework 增强和扩展的一个开源 ...
最新文章
- mysql myisam转innodb_Mysql MyISAM数据库批量转换表引擎为Innodb
- python opencv cv.applyColorMap()函数(颜色映射)ColormapTypes【将Intel Realsense D435深度图的黑白图映射为彩色图】
- android高级篇收录
- 详解MySQL中EXPLAIN解释命令
- BCGSoft Demo示例展示:对话框示例
- 40岁的程序员还能找到工作吗_学会了Vue就能找到前端工作吗
- 图神经网络(一)--综述
- clickhouse分布式查询
- iOS自定义SearchBar样式
- 基于ENVI/IDL实现国产卫星影像批处理功能
- Linux组件封装(一)中互斥锁MutexLock的封装
- fiddler4+雷电模拟器4.0.82抓包设置
- js打开新窗口的方法总结
- 机器视觉可以应用到哪些领域,你都知道吗?
- 联想电脑无法调节屏幕亮度
- Direcshow中视频捕捉和参数设置报告
- 东南大学破格保研挂科_东南大学破格保研挂科_兜兜转转终入四牌楼——东南大学保研心得...
- 常见的Web服务器、应用服务器(Apache、tomcat、jetty、Nginx)简介及优缺点总结
- Flask构建微信订餐小程序②-全站统计
- 用MATLAB分析电能质量,基于matlab仿真的电能质量研究.doc
热门文章
- 学习心得——李嫣然、逯广捷
- java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)
- php中时间轴,PHP时间轴函数
- 转-Kafka【第一篇】Kafka集群搭建
- XML——文档类型定义(DTD-Document Type Definition)
- orm提取指定列_使用ORM提取数据很容易! 是吗?
- hibernate删除记录_Hibernate记录:常见问题的提示和解决方案
- jvm7 jvm8_我们真的仍然需要32位JVM吗?
- gradle 构建应用流程_使用Gradle构建和应用AST转换
- docker集群_使用Docker,Chef和Amazon OpsWorks进行集群范围的Java / Scala应用程序部署...