1.実験の目的
1.等しいロジック カバレッジのテスト方法をマスターします。
2.基本的なパステスト方法をマスターします。
3. Junit ベースの単体テストをマスターします。
2.実験的なコンテンツ
1. 以下の判定レベル プログラム セグメントのテスト ケース セットを設計します。これらのテスト ケースは、ステートメント カバレッジ、判定カバレッジ、条件カバレッジ、判定条件カバレッジ、および条件組み合わせカバレッジをそれぞれ満たす必要があります。
public char function(int x, int y) {
1. char t;
2. if((x>= 90) &&(y>= 90)){
3. t ='A';
}else {
4. if((x+ y)>= 165){
5. t = 'B';
} else{
6. t = 'C';
7. }
8. }
9. return t;
}
2. 次のプログラム コード (Java 言語) の機能は、正の整数を素因数に分解することです。たとえば、90 と入力すると、90=2*3*3*5 が出力されます。テストケースの設計には基本パス方式を使用する必要があります。
public static void zhiyinshu( int n){
1. int k=2;
1. System.out.print(n + "="); //输出:n=
2. while(k<= n){
3. if(k == n){
4. System.out.println(n); // 输出: n
4. break;
}else {
5. if(n%k==0){
6. System.out.print(k +"*");//输出:k*
6. n=n/k; /
}else {
7. k++;
8. }
9. }
}
3. Junit を使用して、次のプログラムの単体テストを行います。 (メソッドごとに任意の1グループを設計)
public class Calculator {
public double add(double a,double b){
return a+b;
}
public double sub(double a,double b){
return a-b;
}
public double multiply(double a, double b){
return a*b;
}
public double div(double a, double b){
return a/b;
}
}
3 つ、実験手順
1. 論理カバレッジ方式を使用する
1) プログラムの制御フロー グラフを描画し (コード行の前にある番号または行番号を使用してノードを表します)、各条件を Ti と Fi でマークします。
プログラムの制御フロー図は、プログラムの制御フローをグラフィカルに記述する方法です。制御フローグラフは縮退したプログラムフローグラフであり、グラフ内の各プロセスがノードに縮退し、流線は異なるノード間を結ぶ有向弧となる。
このうち、円は制御フローグラフのノードと呼ばれ、1つ以上の分岐のない文やソースプログラム文を表し、矢印はエッジまたは接続と呼ばれ、制御フローを表します。
プログラム フロー図を制御フロー図に簡略化するときは、次の点に注意する必要があります。
① 選択または複数分岐構造では、分岐の収束点に収束ノードが存在する必要があります。
②エッジとノードで囲まれた領域を領域といいますが、領域を数える場合はグラフの外側の領域も領域として記録します。
2. 基本的なパス方式
1) 基本パステストは、プログラム制御フローグラフに基づいて、制御構造のループ複雑度を分析し、実行可能な基本パスセットを導出することでテストケースを設計する方法です。
2) 基本的なパス テストには主に次の 4 つの側面が含まれます。
(1) プログラムのプログラム制御フローグラフを描画します。プログラムフローチャートをもとにプログラムの制御フロー図を作成します。 (ノードを示すには、コード行の前に番号または行番号を使用します)
(2) プログラムサイクルの複雑さを計算します。循環的複雑度は、プログラムの論理的な複雑さを定量的に測定するソフトウェア メトリックです。この測定は、プログラムの基本的な独立したパスの数を計算するために使用されます。これは、各パスに対して少なくとも 1 回実行する必要があるテスト ケースの最小数です。プログラム内の実行可能ステートメント。番号。
循環的複雑度を計算するには 3 つの方法があります。
① ループの複雑さを V(G) として定義します。E は制御フロー グラフのエッジの数、V は制御フロー グラフのノードの数です。式 V(G) = E-N+2 となります。 ;
② P を制御フロー グラフ内の決定ノードの数として定義すると、式 V (G) = P + 1 が得られます。
③制御フローグラフの領域数をRとすると、V(G)=Rとなります。
(3) 独立したパスを見つけます。プログラムの制御フロー グラフを通じて基本パス セットをエクスポートし、プログラムの独立したパスをリストします。
(4) テストケースを設計します。プログラム構造とプログラム ループの複雑さに基づいてユース ケースの入力データと期待される結果を設計し、基本パス セット内の各パスが確実に実行されるようにします。
3. Junit を使用して、次のプログラムの単体テストを行います。 (P106)
1)クラス担当者テストに JUnit を使用する:
(1)まず、新しいクラス person を作成します。
(2)テスト クラスの作成:
(3) 右クリックして [実行] を選択し、[JUnit テスト] をクリックします
では、テストステップ全体で何に注意する必要があるのでしょうか?
➢ @Test はテスト メソッドで使用する必要があります
➢ テスト メソッドは public void で変更する必要があります
➢ テスト コードを保存する新しいディレクトリを作成します
➢ 図に示すように、テスト クラスのパッケージはテストされるクラスのパッケージと同じである必要があります。
➢ テスト ユニット内の各メソッドは独立してテストできる必要があり、そのメソッドに依存関係を持たせることはできません
2. Eclipse を使用して JUnit テスト クラスを作成する
ケース 2: ツールを使用して JUnit テスト クラスを作成し、テストします。
次のように進めます。
1) テストするメソッドを選択し、「新規」を右クリックして「その他」を選択します。
2) 図に示すように、[java] の下の [JUnit] の下にある [JUnit テスト ケース] を選択します。
3) 図に示すように、テスト カテゴリ ディレクトリでテストを選択します。
4) 図に示すように、[次へ] をクリックします。
5) 図に示すように、テストするメソッドをチェックし、[完了] をクリックします。
6) このステップでは、JUnit jar パッケージがまだ追加されていない場合、プロンプトがポップアップ表示されます。
jar パッケージが追加されている場合、このプロンプトは表示されません。最終的に生成されたコードは次のようになります
次に、これに基づいてテスト コードを変更します。
テスト結果の失敗とエラーの説明:
➢ 障害は通常、テスト ユニットがアサーション メソッドを使用できないことが原因で発生します。このエラーは、テスト ポイントが問題、つまりプログラム出力を発見したことを示します。結果は期待したものと異なります
➢ エラーは、コードの例外によって発生します。コード自体でエラーが発生する場合もあれば、テスト コードの隠れたバグである場合もあります
これら 4 つの方法を確認すると、生成されるコードはどのようになりますか?
確認後、図に示すようにコードが生成されます。
同様に、右クリックして [Run As] を選択し、[JUnit Test] をクリックすると、実行結果は次のようになります。
このことから、次のように要約されます。
⚫ @BeforeClass
変更されたメソッドはすべてのメソッドが呼び出される前に実行され、メソッドは静的であるため、テスト クラスがロードされた後に実行され、メモリ内にはそのインスタンスが 1 つだけ存在します。設定のロードに適しています。 (すべてのテストに対して 1 回だけ実行されます)。
⚫ @AfterClass
変更されたメソッドは通常、データベース接続を閉じるなどのリソース管理に使用されます (すべてのテストで 1 回のみ実行されます)。
⚫ @前 和 @後
各テスト メソッドの前後に 1 回実行されます。
⚫ @Test: テスト メソッド。ここで、予想される例外とタイムアウト期間をテストできます
四、实验结果
1. ロジカルカバレッジ方式
制御フローチャート:
テストケース:
(1)ステートメント カバレッジ テスト ケース:
シリアルナンバー |
テストケース |
声明 |
実行パス |
1 |
x=90、y=90 |
1、3、9 |
1-2-3-8-9 |
2 |
x=89、y=89 |
1、5、9 |
1-2-4-5-7-8-9 |
3 |
x=80、y=80 |
1、6、9 |
1-2-4-6-7-8-9 |
(2) がカバーする テスト ケースを決定します。
シリアルナンバー |
テストケース |
判定 |
実行パス |
1 |
x=85、y=85 |
2,4 |
1-2-4-6-7-8-9 |
2 |
x=60、y=60 |
2,4 |
1-2-4-6-7-8-9 |
3 |
x=100、y=100 |
2,4 |
1-2-3-8-9 |
(3) 条件 は のテスト ケースをカバーします:
シリアルナンバー |
テストケース |
状態 |
実行パス |
1 |
x=100、y=100 |
2,4 |
1-2-3-8-9 |
2 |
x=85、y=85 |
2,4 |
1-2-4-5-7-8-9 |
3 |
x=60、y=60 |
2,4 |
1-2-4-6-7-8-9 |
(4)判定-条件覆盖的测试用例
シリアルナンバー |
テストケース |
状態 |
実行パス |
1 |
x=90、y=90 |
2,4 |
1-2-3-8-9 |
2 |
x=90、y=89 |
2,4 |
1-2-4-5-7-8-9 |
3 |
x=89、y=90 |
2,4 |
1-2-4-5-7-8-9 |
4 |
x=80、y=80 |
2,4 |
1-2-4-6-7-8-9 |
(5) 条件の組み合わせ カバレッジ テスト ケース
シリアルナンバー |
テストケース |
状態 |
実行パス |
1 |
x=100、y=100 |
2,4 |
1-2-3-8-9 |
2 |
x=90、y=85 |
2,4 |
1-2-4-6-7-8-9 |
3 |
x=85、y=90 |
2,4 |
1-2-4-5-7-8-9 |
4 |
x=60、y=60 |
2,4 |
1-2-4-6-7-8-9 |
2. 基本的なパス方式
プログラム制御フローグラフ:
プログラムサイクルの複雑さ: V(G)=P+1=3+1=4
独立したパス:
1-2-9 |
1-2-3-4-9 |
1-2-3-5-7-8-2-3-4-9 |
1-2-3-5-6-8-2-3-4-9 |
テストケース:
シリアルナンバー |
入力データ |
期待される出力 |
実行パス |
1 |
n=1 |
1= |
1-2-9 |
2 |
n=2 |
2=2 |
1-2-3-4-9 |
3 |
n=3 |
3=3 |
1-2-3-5-7-8-2-3-4-9 |
4 |
n=4 |
4=2*2 |
1-2-3-5-6-8-2-3-4-9 |
3. 単体テスト
5 つ、実験の概要
ステートメントの適用範囲や条件の適用範囲などについてよくわからない場合は、クラスメートに質問することで簡単に解決できます。