ソフトウェアテストにおける循環的複雑性(例)

McCabe の循環的複雑度とは何ですか?

ソフトウェアテストにおける循環的複雑性 ソフトウェア プログラムの複雑さを測定するために使用されるテスト メトリックです。これは、ソフトウェア プログラムのソース コード内の独立したパスを定量的に測定するものです。循環的複雑度は、制御フロー グラフを使用するか、ソフトウェア プログラム内の関数、モジュール、メソッド、またはクラスに関して計算できます。

独立したパスは、他のパスで以前に通過したことのない少なくとも XNUMX つのエッジを持つパスとして定義されます。

このメトリクスは、1976 年に Thomas J. McCabe によって開発され、プログラムの制御フロー表現に基づいています。 制御フローは、プログラムをノードとエッジで構成されるグラフとして表現します。

グラフでは、ノードは処理タスクを表し、エッジはノード間の制御フローを表します。

マッケイブの循環的複雑度

プログラムのフロー グラフ表記

プログラムのフロー グラフ表記は、エッジを介して接続された複数のノードを定義します。 以下は、if-else、while、until などのステートメントと通常のフロー シーケンスのフロー図です。

プログラムのフロー グラフ表記

循環的複雑度の計算方法

数学的表現:

数学的には、グラフ図を通る独立したパスの集合です。プログラムのコードの複雑さは、次の式で定義できます。

V(G) = E - N + 2

ここで、

E – エッジの数

N – ノードの数

V (G) = P + 1

ここで、 P = 述語ノード (条件を含むノード) の数

例–

i = 0;
n=4; //N-Number of nodes present in the graph

while (i<n-1) do
j = i + 1;

while (j<n) do

if A[i]<A[j] then
swap(A[i], A[j]);

end do;
j=j+1;

end do;

このプログラムのフローグラフは次のようになります。

循環的複雑度を計算する

数学的に計算すると、

  • V(G) = 9 – 7 + 2 = 4
  • V(G) = 3 + 1 = 4 (条件ノードは 1,2、3、XNUMX ノード)
  • Basis Set – プログラムの可能な実行パスのセット
  • 1、7
  • 1、2、6、1、7
  • 1、2、3、4、5、2、6、1、7
  • 1、2、3、5、2、6、1、7

循環的複雑性の特性

循環的複雑度の特性は次のとおりです。

  1. V (G) はグラフ内の独立したパスの最大数です。
  2. V (G) >=1
  3. V (G) = 1 の場合、G には XNUMX つのパスが存在します。
  4. 複雑さを10に最小化する

この指標はソフトウェアのテストにどのように役立ちますか?

基本パステストはホワイトボックステクニックの1つであり、テスト中に少なくとも1つのステートメントを実行することを保証します。プログラム内の各線形独立パスをチェックし、 つまり、テストケースの数は、プログラムの循環的複雑度に相当します。

この指標は循環的複雑度(M)の特性により有用である。

  1. M は分岐カバレッジを達成するためのテスト ケースの数です (上限)
  2. M はグラフを通るパスの数です。 (下限)

この例を考えてみましょう –

If (Condition 1)
Statement 1

Else
Statement 2

If (Condition 2)
Statement 3

Else
Statement 4

このプログラムの循環的複雑度は 8-7+2=3 になります。

複雑度は 3 と計算されたため、上記の例ではパス カバレッジを完了するには XNUMX つのテスト ケースが必要です。

従うべきステップ:

循環的複雑度の計算とテストケースの設計については、次の手順に従う必要があります。

ステップ 1 – コードからのノードとエッジを含むグラフの構築

ステップ 2 – 独立したパスの特定

ステップ 3 – 循環的複雑度の計算

ステップ 4 – テストケースの設計

基本セットが完成したら、 テストケース すべてのパスを実行するように記述する必要があります。

V(G)の詳細

プログラムが小さい場合、循環的複雑度は手動で計算できます。プログラムが非常に複雑な場合は、フロー グラフが多くなるため、自動化ツールを使用する必要があります。複雑度の数値に基づいて、チームは対策に必要なアクションを決定できます。

次の表は、複雑度番号とそれに対応する v (G) の意味の概要を示しています。

複雑度数 意味
1-10 構造化されよく書かれたコード

高いテスト容易性

コストと労力が少なくて済みます

10-20 複雑なコード

中程度のテスト容易性

コストと労力は中程度

20-40 非常に複雑なコード

低いテスト可能性

コストも手間もかかる

> 40 まったくテストできません

非常に高いコストと労力

循環的複雑度の計算ツール:

アプリケーションの複雑さを判断するためのツールは多数あります。特定のテクノロジには、いくつかの複雑さ計算ツールが使用されます。複雑さは、プログラム内の決定ポイントの数で判断できます。決定ポイントとは、ソース コード内の if、for、for-each、while、do、catch、case ステートメントです。

ツールの例としては、

  • OCLint – C および関連言語用の静的コード アナライザー
  • リフレクター アドイン – .NET アセンブリのコード メトリクス
  • Gメトリクス – メトリクスを検索します Java 関連アプリケーション

循環的複雑度の用途:

循環的複雑性は、次のような場合に非常に役立ちます。

  • 開発者とテスターが独立したパスの実行を決定するのに役立ちます
  • 開発者は、すべてのパスが少なくとも XNUMX 回テストされていることを保証できます。
  • 覆われていない道にもっと集中できるようになります
  • コードカバレッジを改善する ソフトウエアエンジニアリング
  • アプリケーションまたはプログラムに関連するリスクを評価する
  • サイクルの早い段階でこれらの指標を使用すると、プログラムのリスクがさらに軽減されます

まとめ

循環的複雑度は、構造化されたソフトウェアや ホワイト Box テスト主にプログラムの複雑さを評価するために使用されます。決定ポイントが多いほど、プログラムの複雑さは増します。プログラムの複雑さの数値が高いと、エラーの可能性が高くなり、メンテナンスとトラブルシューティングにかかる​​時間が増加します。