探索JUnit4擴充套件 Runner

2021-09-02 06:36:34 字數 2261 閱讀 3918

參加敏捷培訓時,教練提到junit4的runner和rule,於是特上網查一下,發現很多都講的太理論,或者是舉的例子實在是太牽強。多搜尋了幾下,搜尋到兩篇我覺得寫的非常好的文章。

在使用junit的過程中,大家可能會對junit進行一些擴充套件。本文中的示例為junit4定義了乙個新的annotation,並相應地對已有的runner進行擴充套件,使其能夠解析新引入的annotation。

本文臆造了乙個示例,會在執行單元測試方法之前,自動地為單元測試方法列印日誌。該示例會為junit定義乙個新的annotation用於指定要列印的日誌內容,並對junit預設提供的runner實現blockjunit4classrunner進行擴充套件,使其能夠識別這個新的annotation。

1. 定義annotation

testlogger是乙個作用於方法的annotation,它只有乙個屬性,用於指定日誌的內容,其**如下所示:

@target()

@retention(retentionpolicy.runtime)

public @inte***ce testlogger

2. 擴充套件runner

junit提供了若干個runner的實現,如blockjunit4classrunner,suite,其中blockjunit4classrunner用來執行單個測試用例類。loggedrunner將擴充套件blockjunit4classrunner,覆寫其中的methodblock()方法。新的methodblock()方法會在一開始試圖獲取被執行測試方法中的testlogger annotation,如果存在的話,就會列印出指定的日誌,每行日誌以當時的執行時間與完整方法名作為字首。該類的**如下所示:

public class loggedrunner extends blockjunit4classrunner 

@override

protected statement methodblock(frameworkmethod method)

return super.methodblock(method);

}}

3. 應用程式

calculator是乙個簡單的應用程式,其中定義了乙個除法方法,**如下所示:

public class calculator 

}

4. 單元測試程式

calculatortest是乙個簡單的單元測試程式,它會使用兩種方式對calculator中的divide()方法進行單元測試。其**如下所示:

@runwith(loggedrunner.class)

public class calculatortest

@test

@testlogger(log = "a ****** division.")

public void ******divide()

@test(expected = arithmeticexception.class)

@testlogger(log = "divided by zero, and an arithmeticexception thrown.")

public void dividedbyzero()

}

值得注意的是,calculatortest特別指定loggedrunner作為測試執行器(@runwith(loggedrunner.class));同時,每個單元測試方法,******divide()與dividedbyzero(),都使用了annotation testlogger,為其指定日誌內容。當執行上述單元測試時,會自動地列印出如下形式的日誌內容:

2014-09-23_23:02:33_890 com.bijian.study.calculatortest#******divide: a ****** division

2014-09-23_23:02:33_890 com.bijian.study.calculatortest#dividedbyzero: divided by zero, and an arithmeticexception thrown.

5. 小結

通過對blockjunit4classrunner的擴充套件,可以讓junit在執行測試用例時做一些額外的工作。但這種直接修改預設test runner的方式並不被提倡,可使用test rule來達到相同的擴充套件目的。

Junit4學習(五)Junit4測試套件

一,背景 1,隨著開發規模的深入和擴大,專案或越來越大,相應的我們的測試類也會越來越多 那麼就帶來乙個問題,假如測試類很多,就需要多次執行,造成測試的成本增加 此時就可以使用junit批量執行測試類的功能,junit test suite,測試套件 每次執行測試類,只需要執行一次測試套件類就可以執行...

JUnit4常用注釋

常用注釋 解釋 test 定義乙個要測試的方法 before 在每乙個測試之前,都會被執行的方法,這個方法常常被用來進行一些測試環境的初始化 after 與 before進行對應,在測試結束後,做一些清理工作 beforeclass 在所有測試開始之前執行,這個方法在類執行的時候執行,而且只會執行一...

junit4常用註解

test 將乙個普通的方法修飾成乙個測試方法 test expected exception.class 若測試時改方法丟擲 exception異常則測試成功 test timeout 毫秒 超出該時間則停止執行 beforeclass 它會在該測試類的所有方法執行前執行,static修飾,只執行一...