junit4和junit5的區別

一、JUnit是什麼

JUnit指的是Java單元測試框架,它有助於在開發過程中解決各種應用程序的異常,確保最終交付的代碼質量。JUnit測試用例用於驗證類的行為是否符合預期結果,確保代碼正確運行。

二、JUnit 4和JUnit 5的主要區別

1.測試引擎(Test Engines)

JUnit 4使用的測試引擎是JUnit 4.x runner。JUnit 5中,Test Runner和Test Engine被分開了。JUnit 5引入了一個全新JUnit Platform,這個新的平台可以支持多種Test Engine。這意味著有多種方式可以運行測試用例。

2.註解

在JUnit 4中,所有註解都位於org.junit包下。在JUnit 5中,JUnit Jupiter的註解都位於org.junit.jupiter.api包下。JUnit Vintage的註解都位於org.junit.vintage包下。

Preconditions and assumptions: @Before, @After, @BeforeClass, @AfterClass.
Assertions: @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate, @TestInstance, @Nested, @DisplayName, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll, @Tag, @Disabled.

3.斷言(Assertions)

JUnit 4使用org.junit.Assert斷言類中的靜態方法進行編寫測試用例的斷言。JUnit 5中對JUnit Jupiter進行了改進,斷言不再是在Assert類上調用靜態方法,並且JUnit Jupiter支持Hamcrest和AssertJ等附加斷言庫。

例如:

@Test
void testNegativeNumber() {
    int num = -1;
    assertTrue(num < 0);
}

JUnit Jupiter的斷言可以選擇不止一種:

@Test
void testNegativeNumber() {
    int num = -1;
    assertTrue(num  0, "The number " + num + " must not be positive");
 
    assertEquals(-1, num);
}

4.擴展(Extensions)

JUnit 5的擴展模型更加強大,它支持所有測試級別的擴展以及底層的擴展(如TestInstancePreDestroyCallback)。JUnit Jupiter的擴展API是由用於創建JUnit 5測試擴展的註解組成的。

例如:

@ExtendWith(TimingExtension.class)
class TimeExecutionLoggerTest {
 
    @Test
    void testLogExecutionTime() {
        // This test can be run multiple times
    }
}

5.數據提供者(Data Providers)

JUnit 5與JUnit 4不同,JUnit 5通過@ParamterizedTest註解支持參數化測試,以及通過@ValueSource、@EnumSource、@CsvSource、@CsvFileSource、@MethodSource、@ArgumentsSource等提供了更多方式為測試用例提供參數。JUnit 4向用戶提供了JUnitParams庫來進行一些參數化測試,但是需要另外下載安裝,而JUnit 5將它集成在框架中。

例如:

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testWithValueSource(int argument) {
    assertNotNull(argument);
}

6.測試實例生命周期(Test Instance Lifecycle)

JUnit 5為測試實例引入了生命周期,並用@TestInstance註解表示。@TestInstance註解被用來標註單元測試類中@Test方法和@TestFactory方法之上或是整個測試類上,作為指定測試類作為新建實例或單例模式的標識。

例如:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTestClass {
 
    private int sum = 0;
 
    @Test
    void testSum() {
        sum = sum + 1;
        assertEquals(1, sum);
    }
 
    @Test
    void testSum2() {
        sum = sum + 1;
        assertEquals(2, sum);
    }
}

三、總結

JUnit 5與JUnit 4相比,具有更多的新特性,支持多種運行引擎,更加靈活的擴展支持,參數化測試和添加了測試實例生命周期等特性。可以根據需要選擇使用JUnit 4或者JUnit 5中的特性,來達到更好的測試效果。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/239089.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:14
下一篇 2024-12-12 12:14

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字元命令行的語言…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟體開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • Python與C語言的區別和聯繫

    Python與C語言是兩種常用的編程語言,雖然兩者都可以用於編寫軟體程序,但是它們之間有很多不同之處。本文將從多個方面對Python與C語言的區別和聯繫進行詳細的闡述。 一、語法特…

    編程 2025-04-28
  • Python中深拷貝和淺拷貝的區別

    本文將從以下幾個方面對Python中深拷貝和淺拷貝的區別做詳細的闡述,包括:拷貝的含義、變數和對象的區別、淺拷貝的示例、深拷貝的示例、可變對象和不可變對象的區別、嵌套的數據結構以及…

    編程 2025-04-28

發表回復

登錄後才能評論