1. 序章

このチュートリアルでは、コードカバレッジとは何か、それを測定する方法、および開発されたソフトウェアの品質をどのように改善するかを確認します。

コードカバレッジは、自動テストでカバーされるコードの割合を表します。 つまり、テストスイート中に実行されるコードの部分と実行されない部分をチェックします。

2. コードカバレッジの重要性

ソフトウェア開発プロセスの主な目標は、要件を満たす高品質で障害のないアプリケーションを作成することです。

そのプロセスの重要な部分の1つはテストです。 単体テストの大きな利点は、コードの変更時にすでに実装されている機能が壊れないように保護することです。 また、単体テストにより、開発者はアプリケーションをバグから保護しているという感覚を得ることができます。

しかし、それはすべて本当に本当ですか?

まず第一に、コードカバレッジ アプローチを使用しない限り、単体テストを実装することでアプリケーションがバグから確実に保護されるとは言えません。 コードカバレッジは、単体テストによってコードベースのどれだけに到達しているかを定量化するために使用するメトリックです。

単体テストを作成し、それらが少なくとも最も重要なシナリオ、パス、およびエッジケースをカバーしているかどうかを確実に知らないことは、有益なアイデアのようです。 コードカバレッジは、コードのどの部分がテストされていないかに関する重要な情報を開発者に提供するため、エラーや要件の欠落につながる可能性があります。

次に、プロジェクトの最初からコードカバレッジアプローチを採用することで、開発ライフサイクルの初期段階で発生する可能性のあるバグを排除します。その結果、技術的負債を減らすことができます。

第三に、上記のすべての利点により、開発と保守の時間が短縮されます。 そして、ビジネスの観点からは、これらすべてがより良いROIをもたらします。 また、UATと生産の問題を減らすことで、顧客満足度の向上につながる可能性があります。

ご覧のとおり、コードカバレッジを使用すると、すべての段階でソフトウェア開発プロセスが改善され、関心のあるすべてのグループが満足します。

次のセクションでは、コードカバレッジを測定する最も一般的な方法を説明します。

3. コードカバレッジを測定する方法

3.1. ステートメントカバレッジ

ステートメントカバレッジの主な目的は、プログラムのコード内の各実行可能ステートメントを少なくとも1回実行することです。 これは、ラインカバレッジとも呼ばれます。

それでは、ステートメントとは何かを定義しましょう。 ステートメントは、何らかのアクションを表す命令型プログラミング言語の最小単位です。

ステートメントカバレッジのパーセンテージは、次のように計算できます。

ステートメントカバレッジ=実行されたステートメントの数/ステートメントの総数*100

コードカバレッジを測定するこの方法では、次のことができます。

  • 書かれたコードのすべきこととすべきでないことを確認する
  • デッドコードと未使用のステートメントを見つける
  • さまざまな流路をテストし、どの流路がカバーされていないかを確認します

簡単な例を分析してみましょう。 以下に、2つの数値を合計し、結果がゼロより小さい、ゼロより大きい、または等しい場合に情報を出力するプログラムの擬似コードを示します。

それでは、可能なテストについて話しましょう。 最初のオプションでは、a = 3、b=5を指定しました。 1、2、3、および4行目のステートメントは、このテストケース中に実行されます。 したがって、8つのうち4つのステートメントをカバーしています。 つまり、ステートメントのカバレッジは50%に相当します。

a = 3、b=-5の別のオプションについて説明しましょう。 このシナリオでは、1、2、3、5、6行目のステートメントが実行されます。 どちらのテストも、1行目から6行目を呼び出します。 合計コードカバレッジは(6/8)* 100 = 75%に等しくなります。

3.2. ブランチカバレッジ

ブランチカバレッジは、意思決定ツリーの各決定が少なくとも1回実行されるかどうかを保証します。 ブランチとは、条件ステートメント、ループ、switchステートメントを意味します。 次の式を使用して、ブランチカバレッジを計算できます。

ブランチカバレッジ=実行されたブランチの数/ブランチの総数*100

ブランチカバレッジの利点:

  • テストスイートの実行がすべてのブランチに到達するかどうかを確認します
  • 各ブランチの考えられる異常な動作を検出します
  • 他のアプローチが割り引く可能性のあるソースコードの領域をテストできます

以下に示す擬似コードは、渡された数値を出力し、数値が偶数の場合は追加のコメントも出力するプログラムを表しています。

以下に、上記のアルゴリズムを示すフローチャートを示します。

図には3つの矢印があります。 それらは特定のプログラムのブランチです。 「はい」と「いいえ」という言葉で記述された2つは、条件付きブランチと呼ばれます。 ラベルのない矢印は無条件の分岐です。 ブランチカバレッジは両方のタイプを考慮に入れます。

次に、2つのテストシナリオを見てみましょう。

  1. 与えられたa=1。 テストケースは、「いいえ」のラベルが付いたブランチのみを通過します。 ブランチカバレッジ: 1/3 * 100 = 33%。
  2. 与えられたa=4。 テストケースは、「はい」というラベルの付いたブランチと無条件のブランチを通過します。 ブランチカバレッジ:2/3 * 100 = 67%

明らかに、両方のテストは一緒に100% ofブランチをカバーします。

3.3. 機能範囲

関数カバレッジは、プログラムの各関数が少なくとも1回呼び出されているかどうかを確認します。 さまざまな入力パラメーターを使用して関数をテストすることも重要です。 このように、テストスイートは、関数がさまざまなシナリオで適切に動作するかどうかもチェックします。

関数カバレッジを計算するには、次の式を使用できます。

関数カバレッジ=実行された関数の数/関数の総数*100

機能の範囲は、他の部分と比較して最も広いです。

たとえば、アプリケーションが単一のメソッドのみで構成されているとします。 そのメソッドに単一の単体テストを実装すると、100% fの機能がカバーされます。 明らかに、1つの単体テストですべてのパスとシナリオをカバーできるわけではありません。 100 % fの機能範囲にもかかわらず、私たちのアプリケーションは明らかに十分にテストされていません。

コードカバレッジの割合が高いからといって、コードが理想的で障害がないことを必ずしも意味するわけではありません

このトピックについては、次のセクションで説明します。

4. 対象となるカバレッジの割合は?

その質問への答えは明白に思えるかもしれません。 ほとんどの場合、最初に頭に浮かぶのは、可能な限り100%に近いターゲットを設定する必要があるということです。これにより、ソフトウェアが完全に近づきます。 現実はそれがそれほど単純ではないことを示しています。

まず第一に、それは現在のプロジェクトの状態に依存します。 ソフトウェア開発の開始からコードカバレッジを測定すると、90%を超えるカバレッジを得ることができます。これは素晴らしい結果です。 特にTDDアプローチを使用する場合。

テストをほとんどまたはまったく行わずに、大規模なレガシープロジェクトで同じコードカバレッジを達成することは、ほぼ不可能な場合があります。 このような場合の最善のアプローチは、新しい機能のテストを作成し、その結果、既存の機能を変更、修正、または拡張しながらテストでカバーすることです。 したがって、レガシープロジェクトの成功として30%も想像できます。

第二に、100% cオードカバレッジを強制すること自体が目的であってはなりません。  ソフトウェアの品質に悪影響を与える可能性さえあります。 開発者はほとんどの場合、目標を達成するためだけに役に立たない、または誤ったテストを作成します。 開発者は、有効なビジネスロジック自体ではなく、できるだけ多くのコードをカバーすることに重点を置くため、この動作により、要件が失われたり、誤って実装されたりする可能性があります。

最後に、前のセクションで、100 % c odeカバレッジは、コードにバグがないことを意味しないことに気づきました。 選択したコードカバレッジメトリックによって異なります。 それに加えて、機能に問題がなく、十分にテストされている可能性がありますが、意図したとおりに機能しない可能性があります。 ドメインエラーの検証は、コードカバレッジでは処理できない場合があります。

コードカバレッジは便利なツールですが、それを主要な目標として扱うべきではありません。 要件に従って実装された機能に対して高品質で意味のあるテストを作成することにより、コードの品質に注意を払う必要があります。

5. コードカバレッジツール

このセクションでは、一般的なプログラミング言語用のコードカバレッジツールを簡単に紹介します。

5.1. JaCoCo

JaCoCo は、Java開発者にとって優れたツールです。 これはEclipseFoundationの一部です。 Gradle、Maven、IntelliJ IDEA、Eclipseなどの最も重要なフレームワークと簡単に統合できます。 JaCoCoは、強力で詳細なコードカバレッジレポートを生成します。 さらに、オープンソースツールとして、個人および商用で無料で使用できます。

5.2. イスタンブール

Javascript開発者は、Istambulという名前の便利なツールを使用できます。 ES5およびES2015+をサポートします。 Istambulは、tap、mocha、AVAなどのさまざまな単体テストフレームワークと統合できます。 出力はターミナルまたはHTMLで提供されます。 JaCoCoがオープンソースであり、個人的な目的と商業的な目的の両方で自由に使用できるように。

詳細については、Istambulの公式ウェブサイトをご覧ください。

5.3. Coverage.py

Python開発者はCoverage.pyを使用できます。 コマンドラインからAPIとして機能するか、テストランナーと統合できます。 Coverage.pyはオープンソースであり、すべてのユースケースで無料です。

詳細については、Coverage.pyのWebサイトにアクセスしてください。

5.4. NCover

NCover は、.NETプラットフォーム向けのエンタープライズコードカバレッジソリューションを提供します。 これは主にチームや組織向けに設計されました。 これにより、開発者とQAチームは共同機能を使用して協力することができます。 NCoverは、個人的な目的での使用を目的としていない、高度で堅牢なエンタープライズツールです。 したがって、それは無料でもオープンソースでもありません。

6. 結論

この記事では、コードカバレッジ用語の意味を定義し、それを測定するさまざまな方法を分析しました。 さらに、ソフトウェア開発プロセスでコードカバレッジが重要である理由と、ターゲットとするコードカバレッジの量についても説明しました。 さらに、いくつかのコードカバレッジツールが導入されました。

結論として、100 % c odeカバレッジは、必要な傾向のように盲目的に追跡されるべきではないことを覚えておいてください。 量ではなく質に焦点を当て、要件に従って機能を実装します。