端到端測試的濫用–測試技術2

我的上一個博客是有關測試代碼方法的一系列博客中的第一篇,概述了使用一種非常常見的模式從數據庫檢索地址的簡單方案:

…并描述了一種非常通用的測試技術: 不編寫測試而是手動進行所有操作。

今天的博客涵蓋了另一種實踐,我也認為這是次優的。 在這種情況下,開發人員使用JUnit編寫測試,但是在完成編寫代碼之后并且沒有任何類隔離的情況下編寫測試。 這實際上是冒充單元測試的“端到端”(又稱集成)測試。

盡管昨天我說過我只測試AddressService類,但是使用此技術的測試首先從數據庫中加載一些測試數據,然后抓住AddressController來調用被測方法。 AddressController調用AddressService ,然后再調用AddressDao以獲取并返回所請求的數據。

@RunWith(UnitilsJUnit4TestClassRunner.class)
@SpringApplicationContext("servlet-context.xml")
@Transactional(TransactionMode.DISABLED)
public class EndToEndAddressServiceTest {@SpringBeanByTypeprivate AddressController instance;/*** Test method for* {@link com.captaindebug.address.AddressService#findAddress(int)}.*/@Testpublic void testFindAddressWithNoAddress() {final int id = 10;BindingAwareModelMap model = new BindingAwareModelMap();String result = instance.findAddress(id, model);assertEquals("address-display", result);Address resultAddress = (Address) model.get("address");assertEquals(Address.INVALID_ADDRESS, resultAddress);}/*** Test method for* {@link com.captaindebug.address.AddressService#findAddress(int)}.*/@Test@DataSet("FindAddress.xml")public void testFindAddress() {final int id = 1;Address expected = new Address(id, "15 My Street", "My Town","POSTCODE", "My Country");BindingAwareModelMap model = new BindingAwareModelMap();String result = instance.findAddress(id, model);assertEquals("address-display", result);Address resultAddress = (Address) model.get("address");assertEquals(expected.getId(), resultAddress.getId());assertEquals(expected.getStreet(), resultAddress.getStreet());assertEquals(expected.getTown(), resultAddress.getTown());assertEquals(expected.getPostCode(), resultAddress.getPostCode());assertEquals(expected.getCountry(), resultAddress.getCountry());}
}

上面的代碼使用Unitils將測試數據加載到數據庫中并在Spring上下文中加載類。 我發現Nevers是一個有用的工具,它消除了編寫此類測試的繁瑣工作,而必須設置如此大規模的測試是一項艱巨的工作。

這種測試必須在代碼完成后編寫; 它不是測試驅動的開發(從以前的博客中可以看到,我是一個忠實的擁護者),它也不是單元測試。 在代碼編寫測試的問題之一是必須執行測試的開發人員將其視為瑣事而不是開發的一部分,這意味著它通常很匆忙,而不是在編碼風格的整潔中完成的。

您還需要一定數量的基礎結構才能使用此技術進行編碼,因為需要建立數據庫,而數據庫可能會或可能不在您的本地計算機上,因此您可能必須連接到網絡才能運行測試。 測試數據要么保存在測試文件中(如本例所示),然后在運行測試時加載到數據庫中,要么永久保存在數據庫中。 如果需求變更迫使測試發生變更,則通常需要將數據庫文件與測試代碼一起進行更新,這迫使您至少在兩個位置更新測試。

除了缺乏測試對象隔離之外,這種測試的另一個大問題是它們可能非常慢,有時要花幾秒鐘來執行。 Shane Warden在他的《敏捷開發的藝術》一書中指出,單元測試的運行速度應為“每秒數百”。 沃登還繼續引用邁克爾·費瑟(Michael Feather)的書《有效地使用舊版代碼》 ,以明確定義什么單元測試或不可以:

在以下情況下,測試不是單元測試:

  1. 它與數據庫對話。
  2. 它通過網絡進行通信。
  3. 它涉及文件系統。
  4. 您必須對環境做一些特殊的事情(例如編輯配置文件)才能運行它。

…現在我喜歡。

…盡管我不一定同意第三點。 良好的單元測試代碼的主要租戶之一是可讀性。 傳遞給被測對象的方法參數有時會很大,尤其是在使用XML時。 在這種情況下,我認為支持測試的可讀性并將這種大小的數據存儲在數據文件中而不是將其作為私有的靜態最終String更為實用,因此在可行的情況下,我只堅持第3點。

可以使用第一個首字母縮寫來總結單元測試:快速,獨立,可重復,自我驗證和及時,而Roy Osherove在他的《單元測試的藝術》一書中總結了一個很好的單元測試:“自動代碼調用方法或類,然后檢查有關該方法或類的邏輯行為的一些假設。 單元測試幾乎總是使用單元測試框架編寫的。 它可以輕松編寫并快速運行。 它是完全自動化的,可信賴的,可讀的和可維護的”。

端到端測試的好處是,他們確實會與其他對象和周圍環境一起測試您的測試主題,而這在交付代碼之前確實是必須要做的。 這意味著完成后,您的代碼應包含數百個單元測試,但僅包含數十個“端到端”測試。

鑒于此,當我說技術是“次優”時,我的介紹性前提并不嚴格。 “端到端”測試沒有任何問題,每個項目都應該有一些測試以及一些普通的集成測試,但是這類測試不能替代或稱為單元測試,通常是這種情況。

確定了單元測試的內容后,我的下一個博客將調查您應測試的內容以及原因……

參考: Captain Debug博客上的 JCG合作伙伴 的“ 端到端測試的濫用-測試技術2”

相關文章 :

  • 測試技巧–不編寫測試
  • 您應該對什么進行單元測試? –測試技術3
  • 常規單元測試和存根–測??試技術4
  • 使用模擬的單元測試–測試技術5
  • 為舊版代碼創建存根–測試技術6
  • 有關為舊版代碼創建存根的更多信息–測試技術7
  • 為什么要編寫單元測試–測試技巧8
  • 一些定義–測試技術9
  • 使用FindBugs產生更少的錯誤代碼
  • 在云中開發和測試

翻譯自: https://www.javacodegeeks.com/2011/11/misuse-of-end-to-end-tests-testing.html

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

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

相關文章

[AlwaysOn Availability Groups]排查:AG超過RPO

[AlwaysOn Availability Groups]排查:AG超過RPO 排查:AG超過RPO 在異步提交的secondary上執行了切換,你可能會發現數據的丟失大于RPO,或者在計算可以忍受的數據都是超過了RPO。 1.通常原因 1.網絡延遲太高,網絡吞吐量太…

那些年困擾我們的Linux 的蠕蟲、病毒和木馬

雖然針對Linux的惡意軟件并不像針對Windows乃至OS X那樣普遍,但是近些年來,Linux面臨的安全威脅卻變得越來越多、越來越嚴重。個中原因包括,手機爆炸性的普及意味著基于Linux的安卓成為惡意黑 客最具吸引力的目標之一,以及使用Lin…

python單元測試框架unittest介紹和使用_Python+Selenium框架設計篇之-簡單介紹unittest單元測試框架...

前面文章已經簡單介紹了一些關于自動化測試框架的介紹,知道了什么是自動化測試框架,主要有哪些特點,基本組成部分等。在繼續介紹框架設計之前,我們先來學習一個工具,叫unittest。unittest是一個單元測試框架&#xff0…

使用PowerMock模擬靜態方法

在最近的博客中,我試圖強調使用依賴注入的好處,并表達一種想法,即這種技術的主要好處之一是,通過在類之間提供高度的隔離,它可以使您更輕松地測試代碼,并且得出的結論是,許多好的測試等于好的代…

多態之向上轉型

//向上轉型,子類引用指向父類對象 public class UpcastingDemo{ public static void main(String[] args){ Employee enew Employee(); System.out.println(e.grade); e.job(); e.run(); System.out.println("\n"); Manager mnew Manager(…

(轉)FPGA異步時序和多時鐘模塊

http://bbs.ednchina.com/BLOG_ARTICLE_3019907.HTM 第六章 時鐘域 有一個有趣的現象,眾多數字設計特別是與FPGA設計相關的教科書都特別強調整個設計最好采用唯一的時鐘域。換句話說,只有一個獨立的網絡可以驅動一個設計中所有觸發器的時鐘端口。雖然…

穆里尼奧:與范加爾風格不同,轉變需要時間

據英媒報道,曼聯主帥穆里尼奧近日向媒體表示自己很難繼續遵循前任主帥范加爾的理念去建立球隊,因為他們兩人有著完全不同的想法。 穆里尼奧近日在接受BT Sport的采訪時表示:“這份工作對于我來說最難的地方便是我與范加爾是非常不同的教練&am…

怎么檢測不到我的音頻_Linux 上的最佳音頻編輯工具推薦 | Linux 中國

在 Linux 上,有很多種音頻編輯器可供你選用。不論你是一個專業的音樂制作人,還是只想學學怎么做出超棒的音樂的愛好者,這些強大的音頻編輯器都是很有用的工具。-- Ankush Das(作者)在 Linux 上,有很多種音頻編輯器可供你選用。不論…

具有GlassFish和一致性的高性能JPA –第3部分

在我的四部分系列的第三部分中,我將解釋將Coherence與EclipseLink和GlassFish結合使用的第二種策略。 這就是通過EclipseLink使用Coherence作為二級緩存(L2)的全部內容。 一般的做法 這種方法將Coherence數據網格應用于依賴于無法完全預加載到…

接口使用時注意

interface Service{ void doSome(); //方法的默認修飾符為public abstract } public class InterfaceNote implements Service{ //方法默認的修飾符為 default void doSome(){ System.out.println("做一些服務!"); } public static void main(String…

【Hexo】deploy出錯的解決方法

1、ERROR Deployer not found: git 執行npm install hexo-deployer-git --save 2、$ hexo d INFO Deploying: git INFO Clearing .deploy_git folder... INFO Copying files from public folder... fatal: Not a git repository (or any of the parent directories): .git F…

精選30道Java筆試題解答(轉)

都是一些非常非常基礎的題,是我最近參加各大IT公司筆試后靠記憶記下來的,經過整理獻給與我一樣參加各大IT校園招聘的同學們,純考Java基礎功底, 老手們就不用進來了,免得笑話我們這些未出校門的孩紙們,但是I…

list取值_Redis中List及quicklist實現-2

上一篇中看了List的使用方式、quicklist中的各個結構體,這一篇來看看quicklist里面的幾個核心函數,quicklistCreate函數、quicklistCreateNode函數、quicklistPush函數、quicklistPop函數。接下來我們通過源碼看一下quicklist中是如何借鑒STL中deque的這…

通過示例休眠–第1部分(刪除孤兒)

所以我想做一系列的冬眠例子,展示冬眠的各種特征。 在第一部分中,我想展示有關刪除孤兒功能及其在故事情節中的使用方法。 因此,讓我們開始:) 先決條件 : 為了嘗試以下示例,您將需要以下提到的JAR文件: …

站長工具--IP地址庫

中國最全的IP地址庫 轉載于:https://www.cnblogs.com/weloveshare/p/5783438.html

String使用注意一

public class StringNote{ public static void main(String[] args){ char[] c{h,e,l,l,o}; String str1new String(c); String str2new String(c); String str3"hello"; //常量池中有 “hello” 字符串,str3和str4分別指向他 String str4"…

Win10手記-IIS部署網站問題解決

最近在自己的Win10電腦上嘗試部署ASP.NET網站時出現了問題,經過多方查找定位到IIS為問題來源。 開始之前 先描述下技術環境: 1.Windows 10 PC 2.Windows 自帶的IIS 7 3.ASP.NET Web API項目網站 4.VS 2015 問題描述 首先我們為PC安裝IIS,按照…

python隨機數生成的方法_python生成隨機數的方法

一、概述python可以通過random包來產生隨機數或者執行一些隨機操作。1. random.seed()給定一個數據作為隨機數種子,和大多數語言一樣,python也可以使用時間來作為隨機數種子。import timetime.seed(time.time())12importtimetime.seed(time.time())2. ra…

Java模塊化方法–模塊,模塊,模塊

我認為每個人都會同意,編寫模塊化應用程序和模塊化通常是一件好事。 但是,從Java和Scala語言以及各種Java / Scala框架來看,對模塊化的支持是怎樣的呢? 有很多不同的方法! 讓我們看看其中的一些。 “保護”以下是指模塊…

CentOS 7 安裝記錄

由于centos6.4版本有點老,所以換到centos7。 1.安裝 CentOS 7.0系統安裝配置圖解教程 2.linux設置網卡開機啟動 實質linux是看一個網卡文件的配置,就是/etc/sysconfig/network-scripts/ifcfg-eth0 (這個文件名看你網卡名稱而異,具體你到該目錄…