阿里妹導讀:這麼多的CASE,花了大量時間和資源去運行,真能發現BUG嗎?CI作到90%的行覆蓋率,能發現問題嗎?測試用例愈來愈多,刪一些,會不會就發現不了問題了?今天,咱們談談如何評估測試用例的有效性?
咱們的測試用例有兩個比較關鍵的部分:git
1)調用被測代碼:例以下面的RuleService.getLastRuleByClientId(ClientId)。
2)進行結果Check:例以下面的AssertEqual(OrderId,"ABCD1234")。算法
TestCaseA ... RuleService.createRuleByClientId(ClientId,RuleDO); StringOrderId=RuleService.getLastRuleByClientId(ClientId); ... TestCaseB ... RuleService.createRuleByClientId(ClientId,RuleDO); StringOrderId=OrderService.getLastOrderByClientId(ClientId); AssertEqual(OrderId,"ABCD1234"); ...
咱們但願一組測試用例不只可以「觸發被測代碼的各類分支」,還可以作好結果校驗。單元測試
咱們對測試用例有效性的理論建模是:學習
測試有效性 = 被發現的問題數 / 出現問題的總數
基於故障覆盤的模式成本過高,咱們但願可以主動創造問題來評估測試用例的有效性。測試
咱們找到了一種衡量「測試有效性」的方法,變異測試(mutation testing):spa
變異測試的例子3d
咱們用了一組測試用例(3個),去測試一個判斷分支。
而爲了證實這一組測試用例的有效性,咱們向業務代碼中注入變異。咱們把b<100的條件改爲了b<=100。日誌
咱們認爲:code
經過變異測試的方式:讓注入變異後的業務代碼做爲「測試用例」,來測試「測試代碼」。對象
咱們實現了多種規則,能夠主動的注入下面這些變異:
爲了全自動的進行測試有效性評估,咱們作了一個變異機器人,其主要運做是:
變異機器人的優勢:
變異機器人的使用門檻:
咱們正在打造的高配版變異機器人擁有三大核心競爭力:
分鐘級的系統評估效率
爲了保證評估的準確性,100個變異將會執行全量用例100遍,每次執行時間長是一大痛點。
高配版變異機器人給出的解法:
學習型注入經驗庫
爲了不「殺蟲劑」效應,注入規則須要不斷的完善。
高配版變異機器人給出的解法:故障學習,基於故障學習算法,不斷學習歷史的代碼BUG,並轉化爲注入經驗。可學習型經驗庫目前覆蓋螞蟻金服的代碼庫,明年會覆蓋開源社區。
兼容不穩定環境
集成測試環境會存在必定的不穩定,難以判斷用例失敗是由於「發現了變異」仍是「環境出了問題」,致使測試有效性評估存在偏差。
高配版變異機器人給出的解法:
咱們在螞蟻金服的一個部門進行了實驗,得出了這樣的數據:
換言之,幾個系統的測試有效性爲:系統A 72%,系統B 56%,系統C 70%。
測試有效性(%) = 1 - 未發現注入數 / 注入數
基於代碼注入的測試有效性度量,只是其中的一種方法,咱們平常會用到的方法有這麼幾種:
測試有效性能夠做爲基石,驅動不少事情向好發展:
寫到最後,想起了同事給我講的一個有趣的人生經歷:
「大二期間在一家出版社編輯部實習,工做內容就是校對文稿中的各類類型的錯誤。編輯部考覈校對質量的辦法是,人爲的事先在文稿中加入各類類型的錯誤,而後根據你的錯誤發現率來衡量,並計算實習工資。」
「你幹得咋樣?」
「我學習了他們的規則,寫了個程序來查錯,拿到了第一個滿分」
「厲害了...」
「第二個月就不行了,他們不搞錯別字了,搞了一堆語法、語義、中心思想的錯誤... 我就專心幹活兒了」
「...」
異曲同工,其致一也。
本文來自雲棲社區合做夥伴「阿里技術」,如需轉載請聯繫原做者。