簡體   English   中英

我可以讓 JUnit 更詳細嗎?

[英]Can I make JUnit more verbose?

我想讓它在斷言語句成功時大喊萬歲,或者至少讓它顯示遇到的成功斷言語句的數量。

我正在使用 JUnit4。

有什么建議?

如果您想查看每個成功斷言的輸出,另一種不需要外部依賴項或源代碼的簡單方法是定義您自己的 Assert 類,該類將所有方法委托給標准 JUnit Assert 類,並記錄成功的斷言( JUnit 類將照常報告失敗的斷言)。

然后,您對來自“org.junit.Assert”=>“com.myco.test.Assert”的測試類運行全局搜索和替換,這應該修復所有常規和靜態導入語句。

然后,您還可以輕松地將您的方法遷移到更安靜的營地,並更改包裝類以僅報告每個測試或每個類等通過的斷言總數。

添加一些信息,當我希望 JUnit 更詳細並偶然發現這個問題時,這些信息會對我有所幫助。 也許它會在未來幫助其他測試人員。

如果您正在從 Ant 運行 JUnit,並想查看正在運行的測試,您可以將以下內容添加到您的任務中:

<junit showoutput="true" printsummary="on" enabletestlistenerevents="true" fork="@{fork}" forkmode="once" haltonfailure="no" timeout="1800000">

請注意,showoutput、printsummary 和 enabletestlistenerevents 是有幫助的,而不是其他任務屬性。 如果你設置這些,你會得到如下輸出:

Running com.foo.bar.MyTest
junit.framework.TestListener: tests to run: 2
junit.framework.TestListener: startTest(myTestOne)
junit.framework.TestListener: endTest(myTestOne)
junit.framework.TestListener: startTest(myTestTwo)
junit.framework.TestListener: endTest(myTestTwo)
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.495 sec

當我的測試超時並且我不確定哪些測試實際上花費了太長時間時,這對我很有用,哪些測試被取消,因為它們很不幸在時間到了時運行。

您可以使用 AOP(使用 Spring 或 AspectJ)在 junit.framework.Assert 類中的所有斷言方法上定義切入點。 使用 spring,您可以在返回建議后實現自己的類( http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-advice-after-returning) ,它只會被調用如果 assert 方法通過(否則它會拋出異常: junit.framework.AssertionFailedError )。 在您自己的課程中,您可以實現一個簡單的計數器並在最后打印它。

你真的對成功的斷言感興趣嗎? 通常,唯一有趣的斷言是失敗的斷言。

作為一個狂熱的 JUnit 擁護者,我嘗試使測試的輸出盡可能安靜,因為它在某些事情沒有通過時提高了信噪比。 最好的測試運行是一切都通過並且沒有來自標准輸出的窺視。

您可以一直進行單元測試,直到它成功並運行“grep Assert test.java | wc -l”。 :-)

很難做到。 所有斷言方法都是類 Assert 的靜態成員,這意味着 RunNotifier(計算成功和失敗的測試)不在范圍內。

如果你不克制一個丑陋的黑客:從 JUnit 獲取源代碼,在運行測試時修補它們以將當前通知程序存儲在 Assert 的靜態字段中,以便靜態方法可以向此通知程序報告成功的斷言。

我很確定你可以創建一個自定義的 TestRunner 來做到這一點。 我們最終在我們自制的單元測試框架(NUnit 的克隆)中得到了類似的結果。

哦,等等 - 現在我正在再次閱讀你的問題,如果你真的想要每個成功斷言的輸出,你將不得不更多地挖掘管道。 TestRunner 只在每個測試用例開始/結束時被調用一次,所以它會計算通過和失敗的測試,而不是斷言。

這對我來說不是什么大問題,因為通常我傾向於每個測試一個斷言。

我不認為,JUnit 的目標是計算匹配的斷言或打印出更詳細的信息。 如果測試是原子的,您將在那里獲得大部分信息。 所以我會回顧我的測試。

您還可以在 JUnit 中建立一個 LogFile。 這是可能的,但它會降低測試執行性能......

這不是問題的直接答案,實際上是對 junit 功能的誤用,但是如果您需要調試斷言中使用的某些值,則可以臨時添加如下內容:

Assume.assumeTrue(interestingData, false);

這不會使構建失敗,但會將測試標記為已忽略,強制將值包含在測試報告輸出中。

❗️確保完成后刪除語句。 或者,作為替代方案,您可以將語句更改為Assume.assumeTrue(interestingData, true) ,以防您將來想再次調試它。

很久以前就問過這個問題,但只是補充一下:

build文件夾下獲取生成為html的報告並在每次測試后刷新瀏覽器不是更好嗎?

使用 Gradle(因為它提供了對 Junit 的開箱即用的支持以及用於集成的插件)我可以在我的項目中的build/reports/tests/test/index.html打開文件並檢查每個包中的結果、每個類和每個方法基礎。

示例關系睾丸

PS:您可以在瀏覽器中安裝一個擴展程序來刷新頁面,如果它變得煩人。

如果限制適用,希望這對某人有所幫助。

在這里這里這里您可以找到更多關於如何為 Junit 測試結果生成報告的信息。

不幸的是,junit 的 javadoc 說只記錄失敗的斷言( http://junit.sourceforge.net/javadoc_40/index.html

所以這似乎是不可能的

你能考慮嗎?

1)下載junit源碼
2) 修改類 org.junit.Assert 以進行您正在尋找的任何修改

暫無
暫無

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

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