ソフトウェアテストにおける循環的複雑性(例)
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
循環的複雑性の特性
循環的複雑度の特性は次のとおりです。
- V (G) はグラフ内の独立したパスの最大数です。
- V (G) >=1
- V (G) = 1 の場合、G には XNUMX つのパスが存在します。
- 複雑さを10に最小化する
この指標はソフトウェアのテストにどのように役立ちますか?
基本パステストはホワイトボックステクニックの1つであり、テスト中に少なくとも1つのステートメントを実行することを保証します。プログラム内の各線形独立パスをチェックし、 つまり、テストケースの数は、プログラムの循環的複雑度に相当します。
この指標は循環的複雑度(M)の特性により有用である。
- M は分岐カバレッジを達成するためのテスト ケースの数です (上限)
- 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 テスト主にプログラムの複雑さを評価するために使用されます。決定ポイントが多いほど、プログラムの複雑さは増します。プログラムの複雑さの数値が高いと、エラーの可能性が高くなり、メンテナンスとトラブルシューティングにかかる時間が増加します。