JUnit 4.9(測試版3)中的規則

不久前, David Saff宣布了JUnit 4.9的beta版 。 因此,我認為現在是研究該版本中的新增功能的好時機。

JUnit領域中最有用的創新之一是Rule。 我在這里寫了有關規則的文章 。 我在這里寫了有關JUnit規則的用例 。 規則很棒。 借助JUnit 4.9,它們變得更好。

您可以將規則視為將測試的設置和拆卸封裝在一個類中而不是兩個方法中的一種方法。 但是規則也是一種修改執行測試方式的方法。 您可以多次運行測試,而不是一次。 或在二十個不同的線程中。 有趣的是,只有單個測試規則。 因此,如果您要堅持進行設置和拆卸的比較, 那么@Before@After則在Rule中沒有等效的@BeforeClass@AfterClass

現在情況已經改變。 現在,您可以標注類型TestRule的公共靜態字段與@ClassRule,它會表現就像是一整個測試類,而不是一個單一的測試定義的規則。 因此,對于需要為所有測試設置一次而不是為每個測試設置一次的東西而言,它是完美的選擇。 讓我們來看一個例子。

規則的實現可能如下所示:

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;public class LoggingRule implements TestRule {public class LoggingStatement extends Statement {private final Statement statement;public LoggingStatement(Statement aStatement, String aName) {statement = aStatement;}@Overridepublic void evaluate() throws Throwable {System.out.println("before: " + name);statement.evaluate();System.out.println("after: " + name);}}private final String name;public LoggingRule(String aName) {name = aName;}@Overridepublic Statement apply(Statement statement, Description description) {System.out.println("apply: " + name);return new LoggingStatement(statement, name);}}

大多數實現將由兩部分組成: TestRule接口的實現和Statement接口的實現。

TestRule替換了以前不推薦使用的MethodRule接口。 這是因為新接口同時支持類級別和方法級別的Rule,因此必須進行一些更改。 TestRule有一個應用apply方法,該方法接受一條Statement并返回一條Statement 。 在執行Rule范圍內的任何測試之前,將調用此方法。 傳入的Statement實際上是可能執行的測試。 這里需要注意兩件事:如果您的Rule與@ClassRule批注一起使用,則Statement可能并且將代表多個測試; 調用apply并不意味著Statement實際上會被執行。 由于您的規則返回的任何內容都可能傳遞給其他規則,因此在實際執行所包含的測試之前,可能會以各種方式對語句進行處理。 apply方法中要做的典型事情是將Statement包裹在一個新的Statement中 ,它將執行您所需的邏輯。

Statement接口具有單個方法評估 ,在正常情況下應執行一個測試或一堆測試。 因此,如果采用上述典型方法,則需要包含的Statement 進行一些設置調用評估 ,并進行拆卸。 在上面提供的示例中,我在控制臺上打印內容,以便可以看到以什么順序調用內容。 該語句還傳遞了一個描述 ,其中包含有關測試的有用的元信息。 它包含名稱,定義測試的類,方法名稱并提供注釋。 因此,您的“規則/聲明”可以根據其操作所依據的測試方法來微調其行為。

使用此規則的測試類可能如下所示:

import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;public class RuleTest {@ClassRulepublic static LoggingRule classRule = new LoggingRule("classrule");@Rulepublic static LoggingRule rule = new LoggingRule("rule");@Testpublic void testSomething() {System.out.println("In TestSomething");assertTrue(true);}@Testpublic void testSomethingElse() {System.out.println("In TestSomethingElse");assertTrue(true);}
}

對JUnit4.8規則的唯一更改是@ClassRule批注的存在。 請注意,同一類與@ClassRule@Rule批注一起使用。
執行后,測試類的輸出如下所示:

apply: classrule
before: classrule
apply: rule
before: rule
In TestSomething
after: rule
apply: rule
before: rule
In TestSomethingElse
after: rule
after: classrule

如您所見,首先將應用類級別的Rule并評估結果Statement 。 僅作為評估的一部分,才應用方法級別的“規則”并評估結果“ 語句” ,每次測試一次。
提醒您一句:小心在“規則”中使用正確的修飾符。 它們必須是公共的,并且類級別的規則必須是靜態的。 取決于您做錯了什么(以及您在什么環境中工作),導致的錯誤可能并不完全有用。 這被認為是一個錯誤,并且正在修復。

參考:來自Schauderhaft博客的JCG合作伙伴 Jens Schauder的 JUnit 4.9(測試版3)中的規則 。

相關文章 :

  • Java工具:源代碼優化和分析
  • 框架使開發人員愚蠢嗎?
  • 每個程序員都應該知道的事情
  • JDK中的設計模式
  • Java最佳實踐

翻譯自: https://www.javacodegeeks.com/2011/09/rules-in-junit-49-beta-3.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374474.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡-終端

我們常用的電腦來說,外圍設備就是終端。 外圍設備包括顯示器、鼠標、鍵盤等等。 負責向主機輸入數據的就叫輸入終端,比如鼠標、鍵盤、麥克風、攝像頭; 負責接收主機輸出數據的設備就被稱作輸出終端,比如顯示器、耳機。 注意一點…

為什么我喜歡Java的細節

他們說,Java太冗長了。 您可以找到Hello World程序的比較結果,這些程序在ruby中使用2行,在Java中使用10行,要讀取文件,您需要使用Java 20行和php中1行。 盡管示例經常被夸大(例如,計算導入次數&…

dll 源碼_【技術分享】 | 一個JAVA內存馬的源碼分析

前言偶然接觸到了這樣一個JAVA內存馬,其作者也是冰蝎的作者,項目地址:https://github.com/rebeyond/memShell正好最近在接觸JAVA,借此機會學習下大佬的代碼,對自己的編程思路也有了一定的提升。當然筆者只是一個腳本小…

ThunderSearch(閃電搜索器)_網絡空間搜索引擎工具_信息收集

文章目錄 ThunderSearch簡介1 項目地址2 使用方式2.1 配置文件config.json說明2.2 構建和運行 3 使用式例 ThunderSearch簡介 ThunderSearch(閃電搜索器)是一款使用多個(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake網絡空間搜索引擎】網絡空間搜索引…

字符串匹配方法

介紹兩種字符串匹配方法1.暴力匹配母串用s表示,長度為m子串用p表示,長度為n時間復雜度為:(m-n1)n算法:從s串的第一個字符開始匹配,若匹配,繼續根據p向后匹配,若后續的不匹配,s右移重新匹配p 2.K…

區分幾進制的標志

自己總是記不住進制的開頭標記,就寫下來忘了就看看 1.二進制:Binary,數字以0b 、0B開頭 2.八進制:octal number system,數字自然以0打頭 3.十六進制:hexadecimal,以0x、0X開頭

每個人都知道MVC…

從一個最近的博客中,您可能已經了解到我最近一直在進行一些采訪,因為他們是針對Web應用程序開發人員的,所以我問的一個問題是“您能解釋一下MVC模式是什么嗎?”,值得稱贊的是,每個候選人知道答案。 對于不認…

php無限分類

無限循環 1.需要套2個foreach 2.2個foreach結構一樣 純代碼獲取數據 public function CycleData($parent_id0){$where[parent_id] $parent_id;$res $this->m->where($where)->field(id,name)->select();foreach($res as $k>$v){$result[$v[id]][id] $v[id];$r…

動態網頁數據的采集方案

我在上一篇文章中介紹了使用ScrapySharp快速從網頁中采集數據,這種方式是通過直接發送的Http請求來獲取的原始頁面信息,對于靜態網頁非常有效,但還有許多網站中的頁面內容并非全部存放在原始的頁面中,很多內容是通過javascript來動…

r語言ggplot2 多線圖繪制圖例_plotnine: Python版的ggplot2作圖庫

騰訊課堂 | Python網絡爬蟲與文本數據分析同樣的基本作圖任務,plotnine比matplotlib和seaborn代碼量少,更美觀。所以我又重新發一遍,大家可以先收藏起來,后面總有用到的時候~R語言的ggplot2繪圖能力超強,python雖有mat…

單元和集成測試的代碼覆蓋率

我最近在一個寵物項目中著手構建自動化的UI(集成)測試以及普通的單元測試。 我想將所有這些集成到我的Maven構建中,并提供代碼覆蓋率報告,以便我可以了解測試覆蓋率不足的區域。 我不僅發布了項目的源代碼,還整理了一個…

javascript事件與event對象的屬性

javascript事件列表解說事件瀏覽器支持解說一般事件onclickIE3、N2鼠標點擊時觸發此事件ondblclickIE4、N4鼠標雙擊時觸發此事件onmousedownIE4、N4按下鼠標時觸發此事件onmouseupIE4、N4鼠標按下后松開鼠標時觸發此事件onmouseoverIE3、N2當鼠標移動到某對象范圍的上方時觸發此…

感想

讀完三篇文章看到了前輩們的努力與堅持和對各自的學科的熱愛,以及各位前輩的奮斗的艱苦環境,我與那些前輩相比也許還達不到前輩們的那種級別,但是我的學習的條件卻比那些前輩們好的多,看完前輩們的奮斗史,以及前輩們的…

python學生分布_Python數據分析實戰之分布分析

前言 本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。 作者:嚴小樣兒 分布分析法,一般是根據分析目的,將數據進行分組,研究各組別分布規律的一種分析方法。…

使用Spring Security 3.1保護RESTful Web服務,第3部分

1.概述 本教程顯示了如何使用Spring和基于Java的Spring Security 3.1來保護REST服務 。 本文將重點介紹如何使用“登錄和Cookie”方法專門針對REST API設置安全配置。 2. Spring Security的體系結構完全基于Servlet過濾器,因此,在HTTP請求處理方面&…

一次完整的HTTP請求所經歷的7個步驟

HTTP通信機制是在一次完整的HTTP通信過程中,Web瀏覽器與Web服務器之間將完成下列7個步驟: 1、建立TCP連接 在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共…

jQuery基礎--樣式篇(3)

1.jQuiery對象與DOM對象   對于剛剛接觸jQuery的初學者,我們要清楚認識一點:jQuery對象與DOM對象是不一樣的。可能一時半會分不清楚哪些是jQuery對象,哪些是DOM對象,下面重點介紹一下jQuery對象,以及兩者相互間的轉換…

hls fifo_HLS優化方法DATAFLOW你用了嗎

上期內容:異步跨時鐘域電路該怎么約束DATAFLOW作為HLS的一種優化方法,對于改善吞吐率(Throughput)、降低延遲(Latency)非常有效。DATAFLOW的作用對象DATAFLOW可以作用于函數,也可以作用于for循環。如下圖所示(圖片來源Figure62, Figure 63, u…

Java 8虛擬擴展方法

我一直關注Java 8 Lambda表達式項目的發展已經有一段時間了,我對其當前的進展狀態感到非常興奮。 我發現的最新“易于理解”的演示文稿是這樣的: http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf 現在,作為一名…

python爬蟲 庫_七款必備的Python爬蟲庫,你知道幾個?

很多你需要的信息數據都是在網站內,雖然有些網站的數據會以整潔、結構化的形式呈現,但大部分網站卻無法做到這樣。因此,當你想要獲得一些數據的時候,你需要一些爬蟲工具幫助抓取,然后再對其進行分析。今天,…