テストカバレッジ

  • 5
    Stock
  • 0
    Comment
Stock this post
  • tezu33
  • selious
  • techwkg-mc@github
  • tsuyoshi_cho
  • kachick@github

Martin Fowler氏のWebサイトの記事TestCoverageを翻訳したものです。

翻訳日 2013年8月13日

時々、私はテストカバレッジ(または、コードカバレッジ)が何を目標とするか、どの程度のカバレッジを目標として始めれば良いか訪ねているのを聞きます。このような無意味です。テストカバレッジは、コードベースのどの部分がテストされていないか判断するのに有効なツールなのです。テストの品質がどの程度良いか数値で判断するのに役立ちません。

sketch.png

始めに、2つ目の質問から考えてみましょう。「製品のテストカバレッジが87%を下回ってはいけません」というような現場があると聞きます。また、「TDDを行いテストカバレッジを100%にしなければならない」とも聞きます。賢い人は言いました。

私は高いカバレッジを期待します。ときどきマネジャーが求めます。少し違いがあります。
Brian Marick

目標としてあるカバレッジのレベルを設定すると、開発者は達成しようとします。高いカバレッジは品質の悪いテストで簡単に達成できることが問題です。最もばかばかしいのはAssertionFreeTestingです。しかし、何か悪いことが起こってないか探す大量のテストがなかったら、本当にやらなければならないテストから注意がそらされます。

プログラミングの大部分の側面と同じく、テストは良く考える必要があります。TDDは良いテストを得るのに有効なツールですが、充分ではないのです。良く考えられた質の高いテストを行うと80か90%以上のカバレッジになると考えます。私はテストカバレッジ100%を信頼していません。カバレッジのパーセンテージを上げるように、誰かが意味のないテストを追加していると思います。

充分にテスト行ったかどうか知りたいので、カバレッジに注目するのです。例えば50%以下の低いカバレッジはトラブルの徴候です。しかし、高いカバレッジはそれ以上の意味はなく、ダッシュボードの無視を助長しています。充分なテストは、カバレッジよりも複雑なのです。もしあなたが下記の質問にYESと答えられたら、十分なテストを行っています。

  • 製品から見逃したバグにめったに遭遇しない
  • 製品のバグによってコードベースを書き換えることを躊躇しない

充分にテストができていましたか?もちろんだよね。まだ充分なテスト項目があるにも関わらずテストを削除できたら、テストをやり過ぎています。しかし、判断するのは難しいです。テストをやり過ぎている一つの徴候はテストが生産性を低下させているかどうかです。もしコードの単純な変更によりテストの変更に時間がかかるようでしたらテストに問題があります。テストをやり過ぎることはあまりないかもしれませんが、重複してテストを行っているかもしれません。

テストの実行に時間がかかるとテストをやり過ぎていると考える人もいます。このことに関して私はあまり納得できません。開発段階のどの部分でもテストの実行に時間がかかるようにすることができますし、テストを定期的に実行することもできます。上記のことは、テストからのフィードバックを遅らせますが、ビルド時間とテストの信頼性とのトレードオフとなります。

なので、再びカバレッジ分析の価値は何ですか?コードのどの部分がテストされていないか発見するのを手助けすることです。1カバレッジツールを頻繁に実行し、テストされていないコードを発見するのには価値があります。あなたはテストしてないことを不安に感じませんか?

一部のテストスイートがある部分でカバレッジで分かる点が不得意だとしたら、同様にカバレッジが不得意な部分でテストスイートにより分かることはある。
Brian Maricks

更に知りたい人は

Brian Marickが、「misuse of code coverage」という素晴らしい記事を書いています。
pithy commentary of Testivusもお勧めです。

注釈

1. ここで言う「あなた」はテストを書く人のことです。あなたが質の良いテストかどうか、テストされていないコードが問題かどうか技術的なバックグラウンドとして理解する必要があるので、カバレッジはマネジメントとしてあまり価値がありません。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.