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的测试集合实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国外备案域名(国外备案)
- 下一篇: linux的home目录在哪(linux