簡體   English   中英

JUnit Jupiter中的參數化測試執行(JUnit5)

[英]Parameterised Test Execution in JUnit Jupiter(JUnit5)

有沒有辦法在JUnit JupiterJunit5 )中進行參數化測試?

@RunWith(Parameterized.class)

背景:

我經歷了如何編寫接口的junit測試? 並希望實施測試用例在這里找到答案使用JUnit5。 但是在Jupiter包中找不到相同的類/ es。

嘗試:

進一步尋找替代品,我發現Extensions將替換@RunWith,如遷移提示中所述

@RunWith不再存在; 被@ExtendWith取代。

我嘗試定義這里的示例中提供的CustomExtension - MockitoExtension但是無法成功使用參數化類的實例。

期待有關如何使用在JUnit5實現它的類的參數化實例測試接口的建議。

JUnit 5 M4剛剛發布,現在支持參數化測試。

這是“Hello World”示例:

@ParameterizedTest
@ValueSource(strings = { "Hello", "World" })
void testWithStringParameter(String argument) {
    assertNotNull(argument);
}

有關完整文檔和其他示例,請參閱“ 用戶指南”

隨着2017年1月9日的,JUnit的5不支持參數測試本身,而是該功能的工作正在進行中 請注意,您可以通過動態測試實現類似的功能

也就是說,我會考慮兩種不好的方法來實現接口測試,而JUnit Jupiter提供了兩種更好的方法:

  1. 將執行 @Test注釋的接口默認方法。 因此,如果您有一個生產界面Interface您可以編寫一個接口InterfaceTest ,它使用默認方法來測試您想要的所有內容。 對於每個Impl implements Interface您可以編寫ImplTest implements InterfaceTest
  2. 如果您需要更多的靈活性並希望在抽象類AbstractInterfaceTest實現Interface的測試,您也可以這樣做,然后在ImplTest中有一個擴展AbstractInterfaceTest嵌套測試類

這兩種方法都確保接口測試不會知道實現接口的類,這是您鏈接答案的一個巨大缺點。

您可以使用動態測試

@TestFactory
Stream<DynamicTest> params() {

        return Stream.of(new double[][]{{2d, 4d}, {3d, 9d}, {4d, 16d}}).
                map(i ->
                        dynamicTest("Square root test " + Arrays.toString(i),
                                () -> assertEquals(i[0], Math.sqrt(i[1]))
                        )
                );
}

在我的項目中,我一直在使用這個庫:

https://github.com/TNG/junit-dataprovider/

為了給我的JUnit測試添加參數化。 我一直在使用版本4.x,但從未成為它提供的嵌入式參數化的粉絲。 如果您熟悉TestNg的@DataProvider,那么這個擴展名沒有太大區別。

檢查一下,看看它對我和我的團隊是否有任何好處。 坦率地說,我無法想象現在沒有它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM