「コードカバレッジ」について聞いたことがありますか? この記事では、テストのコード カバレッジとは何か、そしてそれを測定する 4 つの一般的な方法について説明します。
コードカバレッジとは何ですか
コード カバレッジは、ソース コードのどの程度がテスト コードによってテストされるかを示す尺度です。これは、適切なテストが不足している可能性のあるコードの領域を特定するのに役立ちます。
通常、カバレッジ指標は次のように記録されます。
ファイル | % ステートメント | % 支店 | % 機能 | % 行 | カバーされていないライン |
---|---|---|---|---|---|
ファイル.js | 90% | 100% | 90% | 80% | 89,256 |
コーヒー.js | 55.55% | 80% | 50% | 62.5% | 10-11、18 |
新しい機能やテストを追加するときに、コード カバレッジの割合を増やすと、アプリケーションが完全にテストされているという確信が高まります。ただし、まだ解明されていない疑問がまだあります。
4 つの一般的なタイプのコード カバレッジ
コード カバレッジを収集および計算するには、関数、行、分岐、およびステートメント カバレッジの 4 つの一般的な方法があります。各タイプのコード カバレッジがそのパーセンテージをどのように計算するかを確認するには、コーヒー成分を計算する次のコード例を検討してください。
/* coffee.js */
export function calcCoffeeIngredient(coffeeName, cup = 1) {
let espresso, water;
if (coffeeName === 'espresso') {
espresso = 30 * cup;
return { espresso };
}
if (coffeeName === 'americano') {
espresso = 30 * cup; water = 70 * cup;
return { espresso, water };
}
return {};
}
export function isValidCoffee(name) {
return ['espresso', 'americano', 'mocha'].includes(name);
}
英語がよくわからないので調べてみると、エスプレッソ・エスプレッソ、アメリカーノ・アメリカンコーヒー、モカモカコーヒー。
calcCoffeeIngredient
機能を検証するテストは、
/* coffee.test.js */
import { describe, expect, assert, it } from 'vitest';
import { calcCoffeeIngredient } from '../src/coffee-incomplete';
describe('Coffee', () => {
it('should have espresso', () => {
const result = calcCoffeeIngredient('espresso', 2);
expect(result).to.deep.equal({ espresso: 60 });
});
it('should have nothing', () => {
const result = calcCoffeeIngredient('unknown');
expect(result).to.deep.equal({});
});
});
このデモでコードとテストを実行することも、リポジトリをチェックアウトすることもできます。
機能範囲
コードカバレッジ: 50%
/* coffee.js */
export function calcCoffeeIngredient(coffeeName, cup = 1) {
// ...
}
function isValidCoffee(name) {
// ...
}
機能カバレッジは単純な指標です。これは、ソース コード内の関数の何パーセントがテスト コードによって呼び出されるかを計算することを意味します。
コード例には、calcCoffeeIngredient
と の2 つの関数がありますisValidCoffee
。テスト コードはcalcCoffeeIngredient
関数を呼び出すだけなので、関数カバレッジは 50% です。
行カバレッジ
コードカバレッジ: 62.5%
/* coffee.js */
export function calcCoffeeIngredient(coffeeName, cup = 1) {
let espresso, water;
if (coffeeName === 'espresso') { // 1
espresso = 30 * cup; // 2
return { espresso }; // 3
}
if (coffeeName === 'americano') { // 4
espresso = 30 * cup; water = 70 * cup; // 5
return { espresso, water }; // 6
}
return {}; // 7
}
export function isValidCoffee(name) {
return ['espresso', 'americano', 'mocha'].includes(name); // 8
}
行カバレッジは、テスト コードでカバーされるソース コード内の実行可能なコード行の割合を表します。コード行がまだ実行されない場合は、コードの一部がテストされていないことを意味します。
コード例には 8 行の実行可能コードがありますが、テストではamericano
条件 (2 行) とisValidCoffee
関数 (1 行) は実行されません。これにより、ライン カバレッジは 62.5% になります。
ブランチカバレッジ
コードカバレッジ: 80%
/* coffee.js */
export function calcCoffeeIngredient(coffeeName, cup = 1) {
// ...
if (coffeeName === 'espresso') {
// ...
return { espresso };
}
if (coffeeName === 'americano') {
// ...
return { espresso, water };
}
return {};
}
…
分岐カバレッジは、if ステートメントやループなどの分岐または決定ポイントを実行するコードの割合を表します。テストで条件文の true 分岐と false 分岐をチェックするかどうかを決定します。
コード例には 5 つの分岐があります。
coffeeName
電話をかけるだけですcalccoffeingredient
√- 使用
coffeeName
してcup
呼び出すcalcCoffeeIngredient
√ coffeeName
エスプレッソです√coffeeName
アメリカン×です- その他のコーヒー√
テストはアメリカーノ条件であるコーヒーを除くすべてのブランチをカバーするため、ブランチ カバレッジは 80% になります。
ステートメントの対象範囲
コードカバレッジ: 55.55%
/* coffee.js */
export function calcCoffeeIngredient(coffeeName, cup = 1) {
let espresso, water;
if (coffeeName === 'espresso') {
espresso = 30 * cup;
return { espresso };
}
if (coffeeName === 'americano') {
espresso = 30 * cup; water = 70 * cup;
return { espresso, water };
}
return {};
}
export function isValidCoffee(name) {
return ['espresso', 'americano', 'mocha'].includes(name);
}
ステートメント カバレッジは、コード内のステートメントの何パーセントがテスト コードによって実行されたかを検出します。一見すると、これはラインカバレッジと同じではないかと思うかもしれません。実際、ステートメント カバレッジは行カバレッジと似ていますが、複数のステートメントを含む 1 行のコードを考慮します。
コード例では、実行可能コードは 8 行ありますが、ステートメントは 9 つあります。両方のステートメントを含む行を見つけることができますか?
答えは次の 2 つのステートメントを含むコード行で明らかになります。
espresso = 30 * cup; water = 70 * cup;
テストでは 9 つのステートメントのうち 5 つだけがカバーされるため、ステートメントのカバレッジは 55.55% になります。
常に 1 行に 1 つのステートメントを記述する場合、行のカバレッジはステートメントのカバレッジと同様になります。
どのタイプのコード カバレッジを選択する必要がありますか?
ほとんどのコード カバレッジ テスト ツールには、これら 4 種類の一般的なコード カバレッジが含まれています。どのコード カバレッジ メトリクスを優先するかは、特定のプロジェクトのニーズ、開発慣行、およびテストの目標によって異なります。
一般に、ステートメント カバレッジはシンプルで理解しやすい指標であるため、開始点として適しています。ステートメント カバレッジとは異なり、ブランチ カバレッジ メトリックと関数カバレッジ メトリックによって、テストが条件 (ブランチ) を呼び出すか関数を呼び出すかが決まります。したがって、これらは声明の報道後にのみ考慮されるべきです。
高いステートメント カバレッジを達成したら、ブランチ カバレッジと関数カバレッジの向上に進むことができます。
テストカバレッジはコードカバレッジと同じですか?
いいえ、同じです。テスト カバレッジとコード カバレッジはよく混同されますが、それらは異なります。
- テスト カバレッジ: テスト スイートがソフトウェア機能をどの程度カバーしているかを示す定性的な尺度。これは、関連するリスクのレベルを判断するのに役立ちます。
- コード カバレッジ: テスト中に実行されるコードの割合を示す定量的な尺度。重要なのは、テストでカバーされるコードの量です。
これは簡単な例えです。Web アプリケーションを家として考えてみましょう。
- テスト カバレッジは、家の中の何部屋がカバーされるかを示す尺度です。
- コードカバレッジは、テストされた住宅の数を測定します。
コード カバレッジ 100% はバグがないことを意味するわけではありません
テストで高いコード カバレッジを達成することは確かに望ましいことですが、100% のコード カバレッジはコードにバグや欠陥がないことを保証するものではありません。
100% のコード カバレッジを達成するための無意味な方法
以下のテストを参照してください。
/* coffee.test.js */
// ...
describe('Warning: Do not do this', () => {
it('is meaningless', () => {
calcCoffeeIngredient('espresso', 2);
calcCoffeeIngredient('americano');
calcCoffeeIngredient('unknown');
isValidCoffee('mocha');
expect(true).toBe(true); // not meaningful assertion
});
});
このテストは、関数、行、分岐、ステートメントのカバレッジを 100% 達成しますが、実際にコードをテストするわけではないため、意味がありません。コードが正しく動作するかどうかに関係なく、expect(true).tobe(true)
アサーションはテストに合格します。
悪いメトリクスは、メトリクスがないより悪いです
不適切なメトリクスは誤った安心感を与える可能性があり、メトリクスがまったくないよりも悪くなります。たとえば、100% のコード カバレッジを達成するテスト コードがあるにもかかわらず、すべてのテストが無意味な場合、コードは十分にテストされているという誤った安心感を抱く可能性があります。アプリケーションのコードの一部を誤って削除または破損した場合、アプリケーションが正しく動作しなくなっても、テストは合格します。
この状況を回避するには:
- テストの評価: テストを作成およびレビューして、意味があることを確認し、さまざまなシナリオでコードをテストします。
- コード カバレッジは、テストの有効性やコードの品質の唯一の尺度としてではなく、ガイドラインとして使用してください。
さまざまな種類のテストでのコード カバレッジの使用
3 つの一般的なタイプのテストでコード カバレッジを使用する方法を詳しく見てみましょう。
- 単体テスト。これらは、複数の小さなシナリオとテスト パスをカバーするように設計されているため、コード カバレッジを収集するのに最適なタイプのテストです。
- 統合テスト。これらは統合テストのコード カバレッジを収集するのに役立ちますが、使用には注意が必要です。この場合、ソース コードの大部分のカバレッジを計算することになりますが、どのテストがコードのどの部分を実際にカバーしているかを判断するのは困難です。それにもかかわらず、統合テストのコード カバレッジを計算することは、十分に分離されたユニットを持たないレガシー システムには役立つ場合があります。
- エンドツーエンド (E2E) テスト。E2E テストのコード カバレッジの測定は、テストが複雑であるため、困難かつ困難です。したがって、コード カバレッジは使用すべきではありません。より良いアプローチは、要件カバレッジを選択することです。これは、E2E テストの焦点は、ソース コードではなく、テスト要件をカバーすることにあるためです。
要約する
コード カバレッジは、テストの有効性を測定するための有用な指標です。コード内の重要なロジックが十分にテストされていることを確認することで、アプリケーションの品質を向上させるのに役立ちます。
ただし、コード カバレッジは単なる指標であることに注意してください。テストの品質やアプリケーションのニーズなど、他の要素も必ず考慮してください。
100% のコード カバレッジは目標ではありません。代わりに、コード カバレッジと、単体テスト、統合テスト、エンドツーエンド テストなどのさまざまなテスト方法を含む包括的なテスト計画を使用する必要があります。
完全なコード例を参照し、適切なコード カバレッジでテストしてください。このデモを使用してコードやテストを実行することもできます。
/* coffee.js - a complete example */
export function calcCoffeeIngredient(coffeeName, cup = 1) {
if (!isValidCoffee(coffeeName)) return {};
let espresso, water;
if (coffeeName === 'espresso') {
espresso = 30 * cup;
return { espresso };
}
if (coffeeName === 'americano') {
espresso = 30 * cup; water = 70 * cup;
return { espresso, water };
}
throw new Error (`${coffeeName} not found`);
}
function isValidCoffee(name) {
return ['espresso', 'americano', 'mocha'].includes(name);
}
/* coffee.test.js - a complete test suite */
import { describe, expect, it } from 'vitest';
import { calcCoffeeIngredient } from '../src/coffee-complete';
describe('Coffee', () => {
it('should have espresso', () => {
const result = calcCoffeeIngredient('espresso', 2);
expect(result).to.deep.equal({ espresso: 60 });
});
it('should have americano', () => {
const result = calcCoffeeIngredient('americano');
expect(result.espresso).to.equal(30);
expect(result.water).to.equal(70);
});
it('should throw error', () => {
const func = () => calcCoffeeIngredient('mocha');
expect(func).toThrowError(new Error('mocha not found'));
});
it('should have nothing', () => {
const result = calcCoffeeIngredient('unknown')
expect(result).to.deep.equal({});
});
});
最後に:以下の完全なソフトウェア テスト ビデオ チュートリアルが編集されてアップロードされました。必要な友人は自分で入手できます[100% 無料を保証]
ソフトウェアテスト面接文書
私たちは高給の仕事を見つけるために勉強しなければなりません。以下の面接の質問は、アリババ、テンセント、バイトなどの一流インターネット企業の最新の面接資料からのものであり、バイトの上司の中には権威ある回答をしている人もいます。 set 面接情報に基づいて、誰もが満足のいく仕事を見つけることができると思います。