來源:51Testing軟件測試網(wǎng)
知道測試什么是關(guān)鍵
知道測試什么沒有聽上去得那么容易,并且有很大一部分是由經(jīng)驗(yàn)所決定的。許多測試測試得太多。知道要測試什么涉及到要了解什么重要,什么不重要,而要知道這些并不是一件隨隨便便就能做到的事情。這里有一個(gè)技巧,但:
“盡可能采用**高級(jí)別的測試,以便于在實(shí)現(xiàn)上覆蓋范圍和靈活性?!?/span>——Brian Lonsdorf,《JavaScript. Air 004》
所以,基本上:
不要測試內(nèi)部的東西,這只會(huì)成為你的阻礙。如果你真的覺得你應(yīng)該測試內(nèi)部的東西,那么你**分離成一個(gè)新的模塊,使之成為外部的東西。
不要測試過于指定,或處理它們不必和不應(yīng)該知道的東西。
不要只是為了獲得 100% 的覆蓋率而去寫測試。如果有人告訴你應(yīng)該保持 100% 的覆蓋率,那么不要廢話,揍他。
請記住,測試應(yīng)該從模塊外部的角度開始由外到內(nèi)。需要注意的是完全覆蓋的測試還是有可能的,即代碼的所有分支應(yīng)該都可以實(shí)現(xiàn)。如果沒有,那么它們基本上是死碼,不是嗎?除非你需要更好地理解它們是如何工作的,否則就不要測試內(nèi)部的東西。
想想當(dāng)一段時(shí)間以后,代碼重構(gòu)的時(shí)候,會(huì)發(fā)生什么。實(shí)現(xiàn)應(yīng)該允許在測試不失敗的情況下被更改。為什么?因?yàn)槿绻麑淼某绦騿T需要改測試的話,那么基本上是重寫,而不是重構(gòu)。并且重寫并不安全。對于重構(gòu)內(nèi)部應(yīng)該沒有新的測試。
在測試時(shí)要?jiǎng)?wù)實(shí)。測試是項(xiàng)目以及創(chuàng)造價(jià)值的一部分,什么都拿來測試沒有任何意義,就像實(shí)現(xiàn)所有按鈕沒有意義一樣。記住文檔方面。如果測試涉及許多實(shí)施細(xì)節(jié),那么我們就會(huì)失去模塊的重點(diǎn)。我們就會(huì)失去文檔的價(jià)值。
至于文檔,測試你的領(lǐng)域假設(shè)。這些都是你工作的問題域的代碼解釋,這些問題域往往是一些程序員不擅長的地方。用代碼的形式文檔化這些假設(shè)解決了兩個(gè)問題:自我文檔化假設(shè),并證明它們能夠如解釋那樣有效工作。
當(dāng)你發(fā)現(xiàn) bug 的時(shí)候,編寫測試。不要只是修復(fù)它。去寫測試,確保它既是紅的,又對齊 bug 所沒有意識(shí)到的期望。修復(fù) bug,使其呈現(xiàn)綠色。保存。
代碼覆蓋作為一個(gè)具體的數(shù)字被高估了,但作為一種工具它還是很有用的。不要為了覆蓋范圍而力求覆蓋。請記住,覆蓋范圍只能告訴你測試在代碼行運(yùn)行什么,而不會(huì)告訴你測試將運(yùn)行什么組合。不過,這可以成為事情是否朝著正確方向前進(jìn)的一個(gè)很好的風(fēng)向標(biāo)。如果重構(gòu)導(dǎo)致更糟的代碼覆蓋范圍,那么就應(yīng)該響起警鈴,尤其是如果它是重構(gòu)的話。不要只是為了增加覆蓋數(shù)值就讓自己去編寫測試。經(jīng)過充分測試和編寫良好的代碼的覆蓋數(shù)值更大。
編寫測試的觸發(fā)器是當(dāng)你的代碼片段有新的行為的時(shí)候。測試應(yīng)該盯牢這種行為,但不要矯枉過正。
測試庫可能比測試終端應(yīng)用程序更容易,更為重要。畢竟,庫會(huì)被多個(gè)應(yīng)用程序使用。
如何編寫特別棒的測試
知道如何寫出好的測試是關(guān)鍵,因?yàn)楹苋菀讓懙貌缓?。事?shí)是,和其他所有一切一樣,它需要實(shí)踐。不過,這里有一些小貼士。
好的測試往往是簡單的。它不會(huì)嘗試一氣呵成面面俱到。它的名字反映了它要的目的,并且名稱應(yīng)該精簡成一句話。例如,名稱不應(yīng)該是“it works”,而是“it returns 0 for negative values”。
確保測試不要過于指定。 過于指定的測試涉及到太多內(nèi)部東西,并且不允許重構(gòu)。
單元測試運(yùn)行代碼時(shí)會(huì)隔離其他測試,不一定是其他代碼的測試。它將代碼帶出它的上下文,并創(chuàng)建其中一個(gè)方面的人工上下文,以便于進(jìn)行調(diào)查。然而,這并不意味著單元測試必須得在隔離其他所有代碼的情況下運(yùn)行,盡管這通常被認(rèn)為是“純單元測試”。所有一切都沒有必要 mock 和 stub,因?yàn)橹粫?huì)導(dǎo)致更復(fù)雜的設(shè)置,更低的覆蓋率和更加脆弱的測試。
在有意義的地方使用 mock 和 stub。你不想對一個(gè)真正的 HTTP API 進(jìn)行測試,那就 stub。如果你正在測試的東西是你自己對該對象的調(diào)用,或你想要自己的代碼歷經(jīng)某個(gè)路徑,那么使用使用 mock 和 stub。
測試讀起來應(yīng)該像一個(gè)小故事,遵循 AAA 體系: Arrange、Act、Assert。設(shè)置東西,做出聲明,并且斷言聲明做了它應(yīng)該做的。 “小故事”方面要重視小的方面?!?A”中沒有一個(gè)應(yīng)該超過 3 行代碼以上。在階段之間留一些空間會(huì)更好。應(yīng)該沒有任何分支和循環(huán),你在斷言時(shí)應(yīng)該只涉及一個(gè)邏輯內(nèi)容。 (如果一個(gè)斷言語句就能表達(dá)自然是好,但有時(shí)你需要更多,那也沒關(guān)系。)永遠(yuǎn)不要在測試的兩個(gè)不同的地方斷言,因?yàn)檫@會(huì)導(dǎo)致你實(shí)際測試的混亂。
測試應(yīng)該只需要一些領(lǐng)域知識(shí)就可讀。如果不深入模塊的內(nèi)部運(yùn)作就很難解釋的話,那么要么你**多花一些時(shí)間在測試上,那么徹底棄之不顧。
一般情況下,不要測試依賴。對于某些項(xiàng)目,對一些代碼所做的假設(shè)做一些簡單的測試,可能是有意義的,但要謹(jǐn)慎和小心。測試庫是庫作者的工作。相反,要依靠更新日志進(jìn)行升級(jí),以及依賴于測試集成而不是庫(不用 mock 一切的一個(gè)原因)。
編寫不需要很長時(shí)間運(yùn)行的低成本測試,因?yàn)橐獣r(shí)常運(yùn)行這些測試。如果你可以傳遞 --watch 參數(shù)到你的測試運(yùn)行中,并且在每次有文件改變時(shí)運(yùn)行它,那么這是一件好事。
**后但并非**不重要的一點(diǎn)是,使用你喜歡的測試框架。如果 JavaScript. 是你的菜,那么我會(huì)推薦 AVA,因?yàn)樗逦唵?,而且沒有復(fù)雜的配置。不管你選擇什么,確保測試框架能和你一起工作,并幫助你編寫測試更高效,更快捷。正如編碼一樣,如果你覺得不好玩,那么可能有什么地方出錯(cuò)了。
詳詢:王萍老師18988787201
詳詢:小文老師18988787201
王萍老師 | 小文老師 |
《中華考試網(wǎng)軟件測試培訓(xùn)》
《教育軟件測試培訓(xùn)頻道》
《軟件測試培訓(xùn)課程——深圳川石》
《深圳川石軟件性能測試培訓(xùn)》
《深圳川石企業(yè)性能測試(PL&LR)提升班》
《持續(xù)集成自動(dòng)化測試UFT Selenium提升班》
《深圳源昊寶安軟件測試培訓(xùn)班》
《深圳凌岳軟件自動(dòng)化測試培訓(xùn)班》
《深圳博睿軟件安全測試培訓(xùn)》
《深圳達(dá)內(nèi)軟件測試培訓(xùn)學(xué)校》