在進行 Mutation Testing 時,我們經常會遇到一些“幸存”的 Mutant,它們雖然沒有被現有的測試用例殺死,但實際上違反了代碼的類型約束,例如返回了錯誤的類型。這些 Mutant 會干擾我們對代碼質量的判斷,甚至誤導我們編寫不必要的測試用例。Roave Infection Static Analysis Plugin 通過集成靜態分析工具,可以有效識別并排除這類 Mutant,從而提升 Mutation Testing 的準確性和效率。 composer在線學習地址:學習地址 Mutation Testing 是一種通過修改代碼并運行測試用例來評估測試集有效性的方法。它通過引入各種小的代碼變更(Mutant),然后運行測試用例,如果測試用例能夠檢測到這些變更,則認為 Mutant 被“殺死”。然而,在 php 這樣的動態類型語言中,即使 Mutant 沒有被測試用例殺死,也可能違反了代碼的類型約束,例如返回了錯誤的類型。
roave infection static analysis plugin 的作用就是在 mutation testing 的過程中,利用靜態分析工具(目前主要支持 psalm)來檢查生成的 mutant 是否符合類型約束。如果 mutant 違反了類型約束,則會被標記為“殺死”,從而避免了我們編寫不必要的測試用例。
如何使用 Roave Infection Static Analysis Plugin
-
安裝
使用 Composer 安裝 Roave Infection Static Analysis Plugin:
composer require --dev roave/infection-static-analysis-plugin
-
運行
立即學習“PHP免費學習筆記(深入)”;
使用 vendor/bin/roave-infection-static-analysis-plugin 命令來運行 Mutation Testing,而不是直接運行 vendor/bin/infection。
vendor/bin/roave-infection-static-analysis-plugin
-
配置 Psalm
通過 –psalm-config 參數指定 Psalm 的配置文件:
vendor/bin/roave-infection-static-analysis-plugin --psalm-config config/psalm.xml
優勢
- 提高 Mutation Score:通過排除違反類型約束的 Mutant,可以更準確地評估測試集的有效性,從而提高 Mutation Score。
- 減少不必要的測試用例:避免了為違反類型約束的 Mutant 編寫測試用例,節省了開發時間和成本。
- 更早發現類型錯誤:在 Mutation Testing 過程中,可以更早地發現代碼中的類型錯誤。
實際應用效果
假設我們有以下代碼:
/** * @param Array<int, string> $values * @return list<string> */ function makeAList(array $values): array { return array_values($values); }
如果 Mutation Testing 生成了以下 Mutant:
function makeAList(array $values): array { - return array_values($values); + return $values; }
這個 Mutant 雖然能通過一些簡單的測試用例,但實際上違反了類型約束,因為 $values 是 array
總結
Roave Infection Static Analysis Plugin 是一個強大的工具,它可以幫助我們提高 Mutation Testing 的質量,減少不必要的測試用例,并更早地發現代碼中的類型錯誤。雖然目前還存在一些穩定性問題,但隨著 Infection 本身對插件支持的完善,相信它會變得更加易用和可靠。如果你正在使用 Mutation Testing,不妨嘗試一下 Roave Infection Static Analysis Plugin,相信它會給你帶來意想不到的收獲。