測試技巧–不編寫測試

對此沒有太多疑問,測試代碼的方式是一個有爭議的問題。 不同的測試技術因各種原因(包括企業文化,經驗和總體心理觀點)而受到不同開發人員的青睞。

例如,您可能更喜歡編寫經典的單元測試,通過檢查返回值來單獨測試對象的行為。 您可能會喜歡經典存根或偽造的物品; 或者您可能喜歡使用模擬對象模擬角色,甚至使用模擬對象作為存根。 這個博客以及我接下來的幾篇博客都采用了一種非常非常通用的設計模式,并研究了可以采用的不同測試方法。

我正在使用的設計模式顯示在下面的UML圖中,這是我以前使用過的,主要是因為它是如此普遍。 您可能不喜歡它-它的設計更像是“問不說”而不是“告訴不問”,但是它適合這個簡單的演示。

在此示例中,上面的普遍模式將用于從數據庫中檢索和驗證地址。 該示例代碼可從我的GitHub存儲庫中獲得 ,它以一個簡單的Spring MVC webapp為起點,并使用一個小型MySQL數據庫來存儲地址,其原因無非是我已經在筆記本電腦上本地運行了服務器。

就測試而言,博客將集中于測試服務層組件AddressService:

@Component
public class AddressService {private static final Logger logger = LoggerFactory.getLogger(AddressService.class);private AddressDao addressDao;/*** Given an id, retrieve an address. Apply phony business rules.* * @param id*            The id of the address object.*/public Address findAddress(int id) {logger.info("In Address Service with id: " + id);Address address = addressDao.findAddress(id);businessMethod(address);logger.info("Leaving Address Service with id: " + id);return address;}private void businessMethod(Address address) {logger.info("in business method");// Do some jiggery-pokery here....}@Autowiredvoid setAddressDao(AddressDao addressDao) {this.addressDao = addressDao;}}

…如上面的代碼所示,您可以看到它非常簡單:它具有findAddress(…)方法,該方法將單個地址的ID(或表主鍵)作為輸入。 它調用數據訪問對象(DAO),并假裝在將Address對象返回給調用者之前進行一些業務處理。

public class Address {private final int id;private final String street;private final String town;private final String country;private final String postCode;public Address(int id, String street, String town, String postCode, String country) {this.id = id;this.street = street;this.town = town;this.postCode = postCode;this.country = country;}public int getId() {return id;}public String getStreet() {return street;}public String getTown() {return town;}public String getCountry() {return country;}public String getPostCode() {return postCode;}
}

如上所述,我將介紹測試該代碼的不同策略,其中一些我保證您會討厭。 第一個仍然被許多開發人員和組織廣泛使用的是……

不要寫任何測試

令人難以置信的是,某些人和組織仍在這樣做。 他們編寫代碼,將其部署到Web服務器并打開一個頁面。 如果頁面打開,則他們將發送代碼;如果頁面未打開,則他們將修復代碼,對其進行編譯,重新部署,重新加載Web瀏覽器并重新測試。

我見過的關于該技術的最極端的例子:幾年前,在一個著名的政府項目中,更改代碼,部署到服務器,運行代碼,發現錯誤并再次循環。 我猜想,為了節省資金,分包商從“離岸”公司引進了一批廉價且缺乏經驗的程序員,并且沒有足夠的經驗豐富的程序員來指導他們。 所討論的模塊是一個基于Spring的簡單消息驅動Bean,它從一個隊列中獲取消息,應用了一些業務邏輯,然后將其推入另一個隊列:簡單隊列。 最初的作者通過編寫一些測試開始,然后將代碼傳遞給其他沒有經驗的團隊成員。 當代碼更改并且測試失敗時,他們只是關閉了所有測試。 測試包括將MDB部署到EJB容器(Weblogic),將消息推送到系統的前端,觀察來自另一端的消息并調試整個過程中的日志。 您可能會說這樣的端到端測試還不錯,但是部署MDB和運行測試只花了一個小時:在一個工作日內,這是8個代碼更改。 發展不完全Swift!

我的工作? 修復過程和代碼。 解決方案? 編寫測試,運行測試并重構代碼。 該模塊從零測試變成了大約40個單元測試和一些集成測試,并且經過改進并最終交付。 做完了

大多數人會對這種技術有自己的看法,而我的看法是:它產生了不可靠的代碼; 使用此技術需要花費更長的時間編寫和交付代碼,因為您花費大量時間等待服務器啟動,部署WAR / EJB等。并且,通常由經驗不足的程序員使用,或者沒有使用過此功能的程序員通常會使用它技術–您確實遭受了痛苦。 我可以說我從事的項目是編寫測試的項目,而其他開發人員則不在。 測試團隊在我的代碼中發現的bug很少,而其他開發人員正在修復大量的bug,并瘋狂地努力按時完成任務。 我是一個出色的程序員,還是編寫測試能帶來收益? 根據經驗,如果您使用此技術,則會有很多其他錯誤要修復,因為您無法輕松,重復地測試與您開發的故事相伴的多種場景。 這是因為它花費的時間太長,您必須記住每種情況,然后手動運行它們。

我確實想知道,不寫測試技術是否比1960年代的計算技術昂貴時留下的宿醉,您必須手動在打Kong卡或紙帶上編寫程序,然后使用“真值表”進行目視檢查。 當您對自己的代碼工作感到滿意后,便將其發送到計算機室并運行您的代碼-我還不算老,無法記住60年代的計算。 機器時間昂貴的事實意味著自動化測試是不可能的。 盡管計算機的速度越來越快,但這種過時的范例仍在繼續,退化為一種模式,您錯過了勤奮的精神檢查,只是運行了代碼,如果代碼破了,您就將其修復。 這種退化的范式仍在學校,學院和書籍中教授,直到近幾年才受到挑戰。

這就是為什么很難說服人們改變他們的習慣嗎?

該技術的另一個主要問題是項目可能會陷入癱瘓狀態。 就像我在上面說的那樣,使用這種技術,您的錯誤數將很高,并且給項目經理帶來不好的印象,使他們認為代碼會發臭并強制執行以下想法:除非絕對必要,否則不要更改代碼,因為這可能會破壞某些東西。 經理常常對授權代碼更改不滿意,他們通常不信任開發人員并對其進行微觀管理。 確實,開發人員自己對添加代碼更改非常猶豫,因為破壞某些內容會使他們看起來很糟糕。 他們所做的更改盡可能的小,并且沒有任何重構。 隨著時間的流逝,這會加劇混亂,并且代碼的退化甚至會變得更大。

雖然我認為您應該加載并查看頁面以確保所有功能都正常運行,但是只有在有大量測試告訴您代碼可以正常運行時,才應該在故事的結尾進行操作。

我希望當我總結這種方法很糟糕的時候(盡管時間會證明一切)時,我不會引起爭議。 您可能還想知道為什么要包含它,原因是要指出它很爛,并在下面的博客中提供了一些替代方法。

參考: 測試技術–第1部分–不通過JCG合作伙伴 在Captain Debug博客上 編寫測試 。

相關文章 :

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

翻譯自: https://www.javacodegeeks.com/2011/11/testing-techniques-not-writing-tests.html

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

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

相關文章

Ubuntu鏡像下載地址

https://mirrors.aliyun.com/ubuntu-releases/ 用迅雷下載速度挺快的

算法—實現排列 A(n,m)

/* 實現排列A&#xff08;n,m&#xff09;*/ #include "stdio.h" int m,n,a[30]; long s0; int main() {int p(int k);printf("input n(n<10):"); scanf("%d",&n);printf("input m(<1m<n):"); scanf("%d",&…

oracle忘記用戶密碼

在cmd命令行下輸入sqlplus / as sysdba alter user system identified by abc; 就可以將system用戶的密碼改成abc了。 alter user sys identified by abc; sys用戶的密碼也改成abc了。 然后你再登錄sqlplus: 轉載于:https://www.cnblogs.com/zzlp/p/4936109.html

python初體驗-hello world答案_Python初體驗_基礎(一)

一&#xff1a;變量 變量的賦值&#xff1a; name “Meng” 上述代碼聲明了一個變量&#xff0c;變量名為name&#xff0c;變量name的值為&#xff1a;”Meng“ 變量定義&#xff1a; 一個在內存存數據的容器。 變量的意義&#xff1a; 保存程序執行的中間結果或狀態&#xff…

Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (離線樹狀數組+前綴xor)

題目鏈接&#xff1a;http://codeforces.com/contest/703/problem/D 給你n個數&#xff0c;m次查詢&#xff0c;每次查詢問你l到r之間出現偶數次的數字xor和是多少。 我們可以先預處理前綴和Xor[i]&#xff0c;表示1~i的xor和。因為num^num0&#xff0c;所以Xor[r] ^ Xor[l - 1…

九齊NY8B072A單片機使用筆記(二)TIMER1/2/3定時器

先上代碼 volatile unsigned long g_timer0_delay_conut 0;void main(void) {DISI(); //Disable all unmasked interruptsNy8b072a_Gpio_Init();//Ny8b072a_Timer1_Init();//Ny8b072a_Timer2_Init();Ny8b072a_Timer3_Init();ENI(); // Enable all unmasked interrupts whil…

新的Java緩存標準(javax.cache)

這篇文章探討了新的Java緩存標準&#xff1a;javax.cache。 它如何適應Java生態系統 該標準由JSR107開發&#xff0c;作者是共同規范負責人。 JSR107包含在JSR342開發的Java EE 7中。 Java EE 7將于2012年底完成。但是與此同時&#xff0c;javax.cache將在Java SE 6和更高版本…

Eclipse搭建scala環境(解決“JDT weaving is currently disabled”問題)

隨著Apache Spark&#xff0c;scala也成了必學的語言&#xff0c;下面講一下Eclipse搭建scala開發環境。 網上有很多的教程&#xff0c;但是給的scala的地址下載的插件無法開發scala&#xff0c;會出現“JDT weaving is currently disabled”的問題,這是由于使用了錯誤的Scala地…

python如何輸出結果_如何在python2.7中打印輸出結果?

我正在存儲一些數據&#xff0c;如溫度&#xff0c;濕度和強度&#xff0c;這是我的Arduino輸出和輸入為我的python2.7&#xff0c;我正在繪制圖表的數據。我也想將Arduino輸出存儲到文本文件中&#xff0c;但是我無法這樣做&#xff1a; 這是我的python代碼import serial impo…

python字符串連接的三種方法及其效率、適用場景詳解

python字符串連接的方法&#xff0c;一般有以下三種:方法1&#xff1a;直接通過加號()操作符連接website& 39;python& 39;& 39;tab& 39;& 39; com& 39;方法2 python字符串連接的方法&#xff0c;一般有以下三種: 方法1&#xff1a;直接通過加號()操作符…

算法—遞歸實現 C(m,n)

/* 遞歸實現 C(m,n) */#include "stdio.h" int m,n,s,a[20];int main() {int c(int k);s0; a[0]0;scanf("%d%d",&m,&n);printf("\nC(%d,%d)%d\n",m,n,c(1));}//組合遞歸函數C(k) int c(int k) {int i,j;if(k<n){for(ia[k-1]1;i<m…

九齊51單片機使用注意事項:不要用float

在使用ADC計算電壓值時用了float&#xff0c;NY8B072A堆棧直接炸了&#xff0c;用32機習慣了&#xff0c;一直想不通&#xff0c;查了手冊才知道。 手冊是&#xff1a;《NYC_NY8_UM_v1.5_SC.pdf》 鏈接&#xff1a;https://www.nyquest.com.tw/cn/support/download/Nyquest_SW…

有益的CountDownLatch和棘手的Java死鎖

您是否曾經使用過java.util.concurrent.CountDownLatch &#xff1f; 這是在兩個或多個線程之間實現同步的非常方便的類&#xff0c;在該類中&#xff0c;一個或多個線程可以等待&#xff0c;直到在其他線程中執行的一組操作完成為止&#xff08;請參閱javadoc和此文章 &#x…

算法—回溯法橋本分數式

/* 將1-9九個數不重復地賦給不同的9個元素 &#xff0c;實現形如a/bcd/eff/hi 的形式&#xff1a;例&#xff1a;1/265/784/39 1/325/967/84 &#xff08;注意&#xff1a;1/265/784/39 和5/781/264/39 只能算一種解&#xff09;求滿足條件的解共有多少個&#xff1f; */ #in…

codeforces 703B

題意&#xff1a;有n座城市&#xff0c;其中k座是省會城市&#xff0c;每個城市有對應的點權&#xff0c;城市1-2-3-...-n-1有一條路相連&#xff0c;省會城市與其他所有的城市相連&#xff0c;且每兩個城市間最多有一條路&#xff0c;每條路的邊權為路連接的兩座城市的點權乘積…

go 基準測試 找不到函數_基于Golang做測試

本文在實習期間完成并完善&#xff0c;無任何公司機密&#xff0c;僅做語言交流學習之用。持續更新。1.Golang的單元測試Go語言提供了豐富的單測功能。在Go中&#xff0c;我們通常認為函數是最小的可執行單元。本例中使用兩個簡單的函數&#xff1a;IsOdd和IsPalindrome來進行G…

九齊NY8B072A單片機使用筆記(三)模擬串口RX

因為這款單片機沒有硬件串口&#xff0c;所以需要我們自己做軟件模擬串口。 用PA3作為RX&#xff0c;因為PA3可以作為外部輸入中斷EXTI1。 本人首先用輪詢的方式查PA3是否從高電平跳變到低電平&#xff08;起始信號&#xff09;&#xff0c;但是因為還有別的業務邏輯&#xf…

Java RESTful API集成測試

這篇文章將重點介紹為RESTful API&#xff08;帶有JSON有效負載&#xff09;編寫Java集成測試的基本原理和機制。 目的是對技術進行介紹&#xff0c;并為基本正確性編寫一些測試。 這些示例將使用最新版本的GitHub REST API。 對于內部應用程序&#xff0c;這種測試通常將在持…

java警惕自增的陷阱

public class proposal{public static void main(String[] args) {int count0;for(int i0;i<10;i){countcount;}System.out.println(count);}}結果輸出&#xff1a;0/*步驟一&#xff1a;JMV吧count值&#xff08;其值是0&#xff09;拷貝到臨時變量區&#xff1b;步驟二:co…

[LindCode] Binary Tree Postorder Traversal

Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes values. Example Given binary tree {1,#,2,3}, 1\2/3return [3,2,1]. Challenge Can you do it without recursion? SOLUTION 1: recursion&#xff1a; 分治法解決之&am…