• 軟件測試技術
  • 軟件測試博客
  • 軟件測試視頻
  • 開源軟件測試技術
  • 軟件測試論壇
  • 軟件測試沙龍
  • 軟件測試資料下載
  • 軟件測試雜志
  • 軟件測試人才招聘
    暫時沒有公告

字號: | 推薦給好友 上一篇 | 下一篇

軟件測試中單元測試小技巧

發布: 2009-10-29 15:22 | 作者: 網絡轉載 | 來源: 領測軟件測試網 | 查看: 44次 | 進入軟件測試論壇討論

領測軟件測試網

軟件測試中單元測試小技巧

這篇文章描述了:

  • 單元測試的信任
  • 測試正確事件
  • 創建維護測試
  • 創建易讀測試

 這些天有很多的關于單元測試的和在不同的場景下為他們的應用程序編寫單元測試(起始于, 我們2005年六月的 MSDN?Magazine 中有關測試你的數據層的文章, Know Thy Code: Simplify Data Layer Unit Testing using Enterprise Services)的討論。這些意味著有很多的開發者自言自語(或者對于他們的團隊)到:“哎,我們也需要開始編寫測試了!”因此他們開始編寫單元測試上面的單元測試直到他們達到了一個測試自己已經成為問題的程度;蛟S維護他們是一個太過困難,花費太長時間,或者他們并沒有足夠的易讀性以便于理解,更或者他們本身存在bugs有一點是能夠使得我們的開發人員可以下定決心去做的,那就是: 花費他們寶貴的時間以用來改進提高他們的測試或者忽略其中的問題, 從而有效的甩掉那些艱苦的工作。而這些困難的原因僅僅是因為那些不熟練的寫入單元測試。.在這篇文章中,我將為大家帶來在過去一年多時間里我在開發,提供咨詢和培訓開發者等方面有總結出來的一些最重要的練習和試驗。這些小的技巧可以幫助您寫出更有效的,可維護,和魯棒性更好的單元測試。同時我希望這些總結和忠告可以幫助您避免一些由于錯誤引起的大量的時間的消耗。

 本頁內容
  單元測試的信任
  測試正確的事情
  創建維護測試
  創建易讀性測試
  在你的設置方法中避免部分相關的代碼
  總結

 單元測試的信任
  在這個部分,我將略述出一些最通用的信任,這些信任來自于在使用大量單元測試獲得的好處和解釋為什么這些信任通常不是必須真實的。然后我們會幫助您在您的工程中擁有這些信任。

 更加簡單的跟蹤Bug 當然這并不是必須的,那么您怎么知道您的測試是正確的? 是否存在在一些測試環節測試失敗的情況?另外您又如何知道您的測試覆蓋了系統中多少的代碼量?是否測試到了程序中的錯誤,錯誤又在哪里等等的問題。

 當你在你的單元測試中發現了bug后又會發生什么事情哪?你會突然間得到很多與愿意錯誤的反饋,bug被發現,但是問題并不在你測試的代碼中。你的測試的邏輯存在一個bug,因此測試失敗了。這些bug也是您最難被檢查出來的,因為您通常會去檢查您的應用程序而不會去檢測你的測試環節。在這部分中,我會展示給你如何確認大量的單元測試,事實上就是使得跟蹤bug變得更加容易。

 代碼更加便于維護 從最終點考慮,你可以傾向于認為這些信任并不是必須的,當然你是對的,讓我們去說,代碼中每個邏輯方法至少要有一個測試方法(當然,你可能擁有一個以上的方法)在一個好的測試覆蓋的工程中,大概有百分之六十的代碼是能夠得到單元測試的,現在不得不考慮到測試也是要被維護的,如果針對一個復雜的邏輯方法你有20個測試,那么當你向這個方法添加一個參數時會發生什么事情哪?測試無法編譯。當你修改了類的結構的時候同樣會發生這樣的事情。這時你突然發現為了能讓你的應用程序繼續工作你自己需要改變大量的測試。當然這會花費你大量的時間。

 為了使這個信任確認下來,你需要確認你的測試是便于維護的。保持DRY規則寫入:不要重復你自己。我們將更加接近的來看這個問題。

 代碼更加容易被理解 單元測試的好處通常并非是人們最初所期待的,在一個工程中考慮修改一些你之前從沒有看過的代碼(比方說,一個特殊的類或者方法).你將如何動手處理這些代碼?你可能需要在項目中去瀏覽這些特定的類或者方法使用的代碼,理所當然,單元測試就是這樣例子的一個很好的場所。同時,當正確寫入的時候,單元測試可以為工程提供一個API文件的容易讀取的設置,使得文檔的處理和代碼的理解對于整個團隊中的新老開發者一樣的簡單,便捷。然而,這些只能在測試是易讀的和容易理解的情況下才能被確認,這個規則很多的單元測試開發者并不會遵循。我將詳述這個信任,然后在這篇文章的易讀測試的部分給你展現如何在去寫易讀的單元測試。

 返回頁首

  測試正確的事情
  新來者在Test Driven Development (TDD)中一個最通常的錯誤就是他們通常會搞混"Fail by testing something illogical."中的"Fail first"要求。例如,你可以用下面的規格開始這個方法:

' returns the sum of the two numbers
Function Sum(ByVal a As Integer, ByVal b As Integer) As Integer

 你可以向如下的方式寫一個失敗測試

<TestMethod()> _
Public Sub Sum_AddsOneAndTwo()
Dim result As Integer = Sum(1, 2)
Assert.AreEqual(4, result, "bad sum");
End Sub

 初看上去這個處理像是一個寫失敗測試的好的方法,它完全錯失了你寫錯誤測試的初始點。

 一個失敗測試驗證了在代碼中存在一些錯誤,當你的測試完成后這個測試應該是通過的,現在的例子中,無論如何,測試都將會失敗,即使是代碼完成,因為測試邏輯上不是正確的。如果希望測試通過測需要測試自身進行修改――而不是程序的代碼的改變(當程序代碼改變的時候,是test-first規劃的意圖)簡短來說,這個測試不會反映出程序代碼完成后的最終的結果,因此這個不是一個好的測試。

 TDD中一個好的測試要求你去修改代碼,從而使它能夠按照想要的方式工作,這一點要勝于強迫你去反映現在的真實情況或者一個非邏輯要求的渴望的結果。例如,當1+1返回0時就意味著測試失敗。這個簡單的例子和這種情況是相似的,在練習中,如果現在的需求是在工作的,測試應該可以反映你所期待的結果,然后你可以調整現在代碼的情況去通過這個測試。

 作為一個規則,一個已經調通的測試不應該被移除掉,因為這個測試在維護工作中可以用于恢復測試。他們在你改變代碼時用來確定你沒有損害到現在已經工作的函數。這就是為什么你不應該修改那些已經通過的測試,除非是一些很小的修改,例如增加它的可讀性(換句話說,分解測試)

 當一個測試非正常失敗 有時你可能遇到失敗的測試,而這時你對代碼的改變是完全合理的。這通常是因為你遇到了沖突的需求。一般來說,可能是一個新的需求(一個改變的特性)與一個舊的可能已經不再有效的需求發生了沖突。這有兩種可能:

 1.在舊的需求或者無效或者在別處測試的情況下刪除被驗證本質上不再有效的失敗的測試

  2.改變舊的測試使你可以測試新的要求(本質上使用新的測試),然后在新的設置下(測試的邏輯狀態相同,但是初始功能函數可能有所不同)測試舊的需求。

  而有時候一個測試在使用不完整的技術去完成任務的時候也是有效的,例如,你有一個成員類帶有一個FOO方法,它表現為某幾種行為,它已經經由Test在X年前測試完成,然后現在一些其他的需求加了進來,方法的邏輯增強了,從而可以去處理一些類似于在獲取數據時丟失一些參數的異常處理。但這時,突然Test X失敗了,雖然在測試這個函數的時候只是使用了同樣的類。這個測試的失敗是因為在調用方法之前丟失了一些初始處理步驟。

 這并不意味著你需要移除Test X,你將丟失對于一些重要功能的測試,這時你應該去關心那些初始化時的問題,而不是改變類的創建以用來適應你新的意圖。

 當然如果你那里有200個測試都是因為舊的結構導致的失敗,你就應該找到這個問題來維護你的測試。這就是為什么你應該總是移除你測試中的副本尤其是在生產代碼中。

 測試覆蓋和測試Angles 你如何知道是否你的新代碼是一個好的覆蓋?當試圖移動一個鏈接或者一個約束檢查后,如果所有的測試依然通過,那么你就沒有足夠的代碼復制然后你可能需要添加其他的測試單元。

 確認你添加正確測試的最好方法就是測試一些最平常的行和檢查直到用非常的手段使它出錯。這個也許很難,但是如果你不能考慮出一個讓代碼出錯的方法,你就可能沒有好的理由在最初的地方寫下這行代碼。

 你不知道什么時候下一個開發者會試圖運行你的程序,他可能優化或者錯誤的刪除一些包含本質的行。如果你沒有一個測試,它就會失敗,其他的開發者可能不會知道他們犯了錯誤。

 你也可能試圖利用一些常量去替代一些已經通過了的測試中調用的各種各樣的參數,例如,看下面的方法:

Public Function Sum(ByVal x As Integer, ByVal y As Integer, _
ByVal allowNegatives As Boolean) As Integer
If Not allowNegatives Then Throw New Exception()
Return x + y
End Function

 你可以打亂代碼去測試覆蓋,這有一些關于如何測試的變化:

' Try this...
If Not True Then ' replace flag with const
If x < 0 OrElse y < 0 Then Throw New Exception()
End If

' Or this...
If Not allowNegatives Then
' replace check with const
If False OrElse y < 0 Then Throw New Exception()
End If

 如果所有的測試依然通過,那么你缺少了一個測試,另外一個紅色標志是在你為多種相同值測試的檢查。如下:

 Assert.AreEqual(3, retval)

 一些方法的關系只看一次(在一個測試中)意味著你可以安全的返回3作為一個值,然后所有的針對這個方法的測試都將通過,這個當然意味著你丟失了一個測試。如果你在單元測試中檢查一下代碼,它就很容易被檢查出來。

 確保你的測試寫的越簡單越好,一個單元測試一般不包括一個if switch或者其他任何的邏輯聲明。如果你發現你自己在你的測試中寫了一些類似于邏輯聲明的東西,這是一個好的機會來測試一個以上的事件,在做這樣的操作的時候,你會使得你的測試比讀和維護更加的困難,在生產代碼中同樣如此。保持你的測試簡單,你在生產代碼中發現bug要勝于在你的單元測試中。

 使測試易于運行 如果你的測試并不容易運行,那么人們不會信任它。你的應用程序最有可能有下面兩種類型的測試:

 測試在沒有任何配置的情況下平穩的運行(這種類型的測試,我們可以在任何的機器上,在代碼的最終版上或者在源控制上測試,并且做到沒有任何故障的測試)

  在運行前需要一些配置.

  第一種類型是你應該模仿的,第二種類型是你通常做的,尤其你如果你是一個新的單元測試。如果你發現你自己測試時有很多的特殊的需求,現在是正常的,但是重要的一點就是你要隔離出兩個組讓他們能夠單獨的去做測試。

 我們的想法是任意一個開發者都應該有能力修改和運行一些不需要設置特殊的配置的測試進行測試。如果這有一些測試需要在運行前有特殊的關注,開發者應該知道他們,然后他可以花一些時間學習這些測試的方法。因為很多的開發者比較的懶(當然,不是你),你可以設想,他們不會去做那些特殊的設置,相反,他們會讓測試失敗因為他們有更好的事情去做。

 當用戶讓測試失敗時,他們開始考慮他們不能夠信任這些測試了。很難說是否測試可以在一個中找到一個正式的bug或者只是一個錯誤的定位。開發者可能不明白為什么測試者會在一開始就執行失敗。一旦他們不再信任你的測試,開發者將會停止運行它們,那么bug就會駐留在程序中,之后一連串的麻煩就來了。。。

 為了避免這件事情,確認你總是有一個組準備好了去測試,測試程序則是可以安全運行,可信任的。把那些屬于配置挑戰組的測試放到不同的文件夾,樹或者工程中,同時標記特殊的說明指明他們在運行前需要做什么。完成這些后,開發者可以不投入時間去配置就開始測試工作。當他們有時間和需要時,他們也可以配置,運行更多的測試環節。

 

延伸閱讀

文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/

TAG: 單元 技巧 軟件測試

21/212>

關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97