天天看點

你每天跑這麼多自動化用例,能發現BUG嗎?

什麼是測試用例的有效性?

我們的測試用例有兩個比較關鍵的部分:

1)調用被測代碼:例如下面的RuleService.getLastRuleByClientId(ClientId)

2)進行結果Check:例如下面的AssertEqual(OrderId,"ABCD1234")

你每天跑這麼多自動化用例,能發現BUG嗎?

我們希望一組測試用例不僅能夠“觸發被測代碼的各種分支”,還能夠做好結果校驗。

  • 當業務代碼出現問題的時候,測試用例可以發現這個問題,我們就認為這一組測試用例是有效的。
  • 當業務代碼出現問題的時候,測試用例沒能發現這個問題,我們就認為這一組測試用例是無效的。

我們對測試用例有效性的理論模組化是:

>> 測試有效性 = 被發現的問題數 / 出現問題的總數

為什麼要評估測試用例的有效性?

你每天跑這麼多自動化用例,能發現BUG嗎?

測試用例有效性評估的方法?

基于故障複盤的模式成本太高,我們希望能夠主動創造問題來評估測試用例的有效性。

我們找到了一種衡量“測試有效性”的方法,變異測試(mutation testing)

你每天跑這麼多自動化用例,能發現BUG嗎?

變異測試的例子

你每天跑這麼多自動化用例,能發現BUG嗎?

通過變異測試的方式:讓注入變異後的業務代碼作為“測試用例”,來測試“測試代碼”。

我們實作了多種規則,可以主動的注入下面這些變異:

你每天跑這麼多自動化用例,能發現BUG嗎?

如何優雅的評估測試有效性?

為了全自動的進行測試有效性評估,我們做了一個變異機器人,其主要運作是:

  • 往被測代碼中寫入一個BUG(即:變異)
  • 執行測試
  • 把測試結果和無變異時的測試結果做比對,判斷是否有新的用例失敗
  • 重複1-3若幹次,每次注入一個不同的Bug
  • 統計該系統的“測試有效性”
你每天跑這麼多自動化用例,能發現BUG嗎?

變異機器人的優點:

防錯上線:變異是單獨拉代碼分支,且該代碼分支永遠不會上線,不影響生産。

全自動:隻需要給出系統代碼的git位址,即可進行評估,得到改進報告。

高效:數小時即可完成一個系統的測試有效性評估。

擴充性:該模式可以支援JAVA以及JAVA以外的多種語系。

适用性:該方法不僅适用于單元測試,還适用于其他自動化測試,例如接口測試、功能測試、內建測試。

變異機器人的使用門檻:

測試成功率:隻會選擇通過率100%的測試用例,所對應的業務代碼做變異注入。

測試覆寫率:隻會注入被測試代碼覆寫的業務代碼,測試覆寫率越高,評估越準确。

高配版變異機器人

我們正在打造的高配版變異機器人擁有**三大核心競争力

**

分鐘級的系統評估效率

為了保證評估的準确性,100個變異将會執行全量用例100遍,每次執行時間長是一大痛點。

高配版變異機器人給出的解法:

并行注入:基于代碼覆寫率,識别UT之間的代碼覆寫依賴關系,将獨立的變異合并到一次自動化測試中。

熱部署:基于位元組碼做更新,減少變異和部署的過程。

精準測試:基于UT代碼覆寫資訊,隻運作和本次變異相關的UT(該方法不僅适用于UT,還适用于其他自動化測試,例如接口測試、功能測試、內建測試)

學習型注入經驗庫

為了避免“殺蟲劑”效應,注入規則需要不斷的完善。

高配版變異機器人給出的解法:故障學習,基于故障學習算法,不斷學習曆史的代碼BUG,并轉化為注入經驗。可學習型經驗庫目前覆寫螞蟻金服的代碼庫,明年會覆寫開源社群。

相容不穩定環境

內建測試環境會存在一定的不穩定,難以判斷用例失敗是因為“發現了變異”還是“環境出了問題”,導緻測試有效性評估存在誤差。

高頻跑:同樣的變異跑10次,對多次結果進行統計分析,減少環境問題引起的偶發性問題。

環境問題自動定位:接入附屬的日志服務,它會基于用例日志/系統錯誤日志建構的異常場景,自動學習“因環境問題導緻的用例失敗”,準确區分出用例是否發現變異。

落地效果如何?

我們在螞蟻金服的一個部門進行了實驗,得出了這樣的資料:

你每天跑這麼多自動化用例,能發現BUG嗎?

換言之,幾個系統的測試有效性為:系統A 72%,系統B 56%,系統C 70%

測試有效性(%) = 1 - 未發現注入數 / 注入數

更多的測試有效性度量手段

基于代碼注入的測試有效性度量,隻是其中的一種方法,我們日常會用到的方法有這麼幾種:

代碼注入:向代碼注入變異,看測試用例是否能發現該問題

記憶體注入:修改API接口的傳回内容,看測試用例是否能發現該問題

靜态掃描:掃描測試代碼裡是否做了Assert等判斷,看Assert場景與被測代碼分支的關系

... 還有更多其他的度量手段

Meet the testcase again

測試有效性可以作為基石,驅動很多事情向好發展:

  • 讓測試用例變得更能發現問題。
  • 讓無效用例可被識别、清理。
  • 創造一個讓技術人員真正思考如何寫好TestCase的品質文化。
  • 測試左移與靈活的前置條件。
  • ......

寫到最後,想起了同僚給我講的一個有趣的人生經曆:

“大二期間在一家出版社編輯部實習,工作内容就是校對文稿中的各種類型的錯誤;編輯部考核校對品質的辦法是,人為的事先在文稿中加入各種類型的錯誤,然後根據你的錯誤發現率來衡量,并計算實習工資。”

“你幹得咋樣?”

“我學習了他們的規則,寫了個程式來查錯,拿到了第一個滿分”

“厲害了...”

“第二個月就不行了,他們不搞錯别字了,搞了一堆文法、語義、中心思想的錯誤... 我就專心幹活兒了”

“...”

殊途同歸,其緻一也。

文章來源:AlibabaTechQA

開發者社群整理

繼續閱讀