コンテンツにスキップ

エラーパスのミュータント

エラー処理のコードは最もテストされていない (Lima et al., “Assessing exception handling testing practices in open-source libraries”, 2021)。デフォルトで有効な errpath 演算子はこれを変異させる。 fmt.Errorf("...: %w", err) はラップをやめ (%w -> %v)、%w 単独なら err そのものを返す。 errors.Is / errors.Astruefalse に固定される。panic(x) 文は、関数が終端文として 必要としない限り削除される。recover() は panic を止めたまま nil を返す。nil に置き換えた return の結果 (return x, err -> return x, nil、nil のポインタ、map、slice、func) と、強制された nil チェック (if err != nil -> if true / if false) は return 演算子と condition 演算子の ミュータントであり、同じクラスが付く。

すべてのミュータントは mutants.jsonreport.jsonclass を持つ。値は errpathconcurrencydefault のいずれかである。totals.classes は全体の score と並べて各クラスを 個別に採点するので、「エラーパス: 40% kill」が見える:

"classes": {
"default": { "mutants": 120, "killed": 96, "survived": 14, "score": 0.87 },
"errpath": { "mutants": 25, "killed": 8, "survived": 12, "score": 0.4 }
}

totals.covered_score はカバーされたミュータントだけのスコアで、NO_COVERAGE を除く (PIT の test strength)。テストが到達したコードをどれだけよく検査しているかを表す。