テストとデバッグ


■内容

Top

ライフサイクルとテスト

Top

テストの手順

  1. テスト・ケースの設計

  2. テスト・データの作成

  3. テストの実行

  4. 結果の検討

  5. 原因究明,修正

  6. テスト済ケースの再テスト(再帰テスト)
Top
テスト・ケースの設計
Top

テスト・カバレージ

Top

ホワイトボックス・テスト

Top
命令網羅(C0)
Top
判定条件網羅(分岐網羅)(C1)
Top
条件網羅(C2)
Top
例題

  1. 任意の 3 つの数値 a, b, c が与えられたとき、その 3 つの数値が 3 角形を作るか否かを判定するメソッド "isTriangle()" を作り、それをテストするケースを作成してください。このとき、テスト・ケースは、命令網羅(C0)、分岐網羅(C1)、条件網羅(C2)でそれぞれ作成してください。(サンプル解答)

    □ソース・コード "Triangle01.java"

    1. public class Triangle01 {
    2. public static boolean isTriangle(int a, int b, int c) {
    3. // どれかひとつでも負またはゼロなら三角形ではありません。
    4. if (a <= 0 || b <= 0 || c <= 0) {
    5. return false;
    6. }
    7. // ある辺が残りの2つの和よりも長いか等しければ、三角形ではありません。
    8. if (a >= b + c || b >= c + a || c >= a + b) {
    9. return false;
    10. }
    11. // 三角形です。
    12. return true;
    13. }
    14. }
    ■命令網羅(C0)
    
      No.  パス             (a, b, c)
     ---- ---------------- ----------------------
       1.  
       2.  
       3.  
    
    ■分岐網羅(C1)
    
      No.  パス             (a, b, c)
     ---- ---------------- ----------------------
       1.  
       2.  
       3.  
    
    ■条件網羅(C2)
    
      No.  条件                      戻り値  データ
           (1) (2) (3) (4) (5) (6)           (a, b, c)       (1) a <= 0  
     ---- -------------------------  ------  -----------     (2) b <= 0
       1.                                                    (3) c <= 0 
       2.                                                    (4) a >= b + c 
       3.                                                    (5) b >= c + a 
       4.                                                    (6) c >= a + b
       5. 
       6. 
       7. 
    

  2. 上記メソッドは "Triangle01.java" にあるとします。テストは、JUnit によって行います。テスト・プログラムは、"Triangle01Test.java" です。

    □ 実行結果

    
    
Top

ブラックボックス・テスト

Top
同値分割
Top
同値分割の形式の例
Top
限界値分析
Top
エラー推測
Top
ブラックボックス・テストの手順
Top
例題

  1. 前の例題 「任意の 3 つの数値 a, b, c が与えられたとき、その 3 つの数値が 3 角形を作るか否かを判定するメソッド "isTriangle()" を作り、それをテストするケースを作成してください。」で、テスト・ケースを同値分割 / 限界値分析で補足してください。
     ---- ------------------------ --------------
                                   1 2 3 4 5 6 7
     ---- ------------------------ --------------
      条  a > 0                    Y Y Y Y Y Y N
      件  b > 0                    Y Y Y Y Y N Y
          c > 0                    Y Y Y Y N Y Y
          a < b + c                Y Y Y N
          b < c + a                Y Y N Y
          c < a + b                Y N Y Y
     ---- ------------------------ --------------
      結  三角形になる             X         
      果  三角形にならない           X X X X X X 
     ---- ------------------------ --------------
    
     ----------- ------------  ------------- --------------
     有効同値    無効同値      限界値(有効)  限界値(無効)
     ----------- ------------  ------------- --------------
     a > 0       a <= 0        [1, 1, 1](1)  [0, 1, 1](2)     [a, b, c] を表す
     b > 0       b <= 0        [1, 1, 1](1)  [1, 0, 1](3)
     c > 0       c <= 0        [1, 1, 1](1)  [1, 1, 0](4)
     a < b + c   a >= b + c    [1, 1, 1](1)  [2, 1, 1](5)
     b < c + a   b >= c + a    [1, 1, 1](1)  [1, 2, 1](6)
     c < a + b   c >= a + b    [1, 1, 1](1)  [1, 1, 2](7)
     ----------- ------------  ------------- --------------
    
     * 結果として、ホワイトボックス・テストとデータは変わりません。
    

  2. 上記メソッドは "Triangle01.java" にあるとします。テストは、JUnit によって行います。テスト・プログラムは、"Triangle01Test.java" です。

    □ 実行結果

    
    
Top
実習

  1. 上記クラス "Triangle01.java" に、つぎのメソッド getTriangleType() を追加します("Triangle02.java")。このメソッドをテストする単体テスト・ケース "Triangle02Test.java" を作成してください。なお、テスト・ケースは、C1 レベルを使ってください。また、ケースを同値分割 / 限界値分析で補足してください。

  2. "Eclipse のインストールとJavaアプリケーション開発""実習2" の単体テスト・ケースを作成してください。なお、テスト・ケースは、C1 レベルを使ってください。また、ケースを同値分割 / 限界値分析で補足してください。

    エラー組込みソース サンプル解答ソース テスト・ケース
    "Fibonacci01.java" "Fibonacci01.java" テスト・ケース
    "Match02.java" "Match02.java" テスト・ケース
    "Igo01.java" "Igo01.java" テスト・ケース

    1. コマンドラインから指定した値までのフィボナッチ数列を表示するアプリケーション"Fibonacci01.java"(サンプル解答)を作成してください。なお、フィボナッチ数列は、つぎの性質を満たす数列です。
      • F0 = 1, F1 = 1
      • Fn = Fn-2 + Fn-1, n >= 2
      1. public class Fibonacci01 {
      2. public static void main(String[] args) {
      3. int n = parseInt(args[0]);
      4. int f = 1;
      5. int g = 1;
      6. int h = 0;
      7. System.out.print(f + " " + g + " ");
      8. while (f + g < n)
      9. System.out.println(h + " ");
      10. f = g;
      11. g = h;
      12. }
      13. System.out.println();
      14. }
      15. }
      • 正しい実行結果
      $ java Fibonacci01 1000
      1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
      
    2. コマンドラインから入力した3つの数字(同じ数字でも可)が、アプリケーション内で設定されている3つの数字といくつあっているかどうかを判定するアプリケーション"Match02.java"(サンプル解答)を作成してください。このとき、合っている数によって、つぎのようにメッセージを変えてください。
      • 0個 まったく違います。
      • 1個 やっと合いましたね。
      • 2個 もう少しです。
      • 3個 おめでとうございます。
      また、ソース中で使用している"ArrayUtil.java"クラスのsort()メソッドは、修正済みとします。
      1. public class Match02 {
      2. public static void main(String[] args) {
      3. int[] a = {(int)(Math.random() * 10), (int)(Math.random() * 10), (int)(Math.random() * 10)};
      4. int[] n = {Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])};
      5. long s = 0;
      6. System.out.println("コンピューターの数字 = " + ArrayUtil.toString(ArrayUtil.sort(a)));
      7. System.out.println(" あなたの数字 = " + ArrayUtil.toString(ArrayUtil.sort(n)));
      8. int i = 0, j = 0;
      9. while (i < a.length || j < n.length) {
      10. if (a[i] < n[j]) {
      11. i++;
      12. } else if (a[i] = n[j]) {
      13. s++;
      14. i++;
      15. j++;
      16. } else {
      17. j++;
      18. }
      19. }
      20. switch (s) {
      21. case 0:
      22. System.out.println("まったく違います。");
      23. break;
      24. case 1:
      25. System.out.println("やっと合いましたね。");
      26. break;
      27. case 2:
      28. System.out.println("もう少しです。");
      29. break;
      30. default:
      31. System.out.println("おめでとうございます。");
      32. break;
      33. }
      34. }
      35. }
      • 正しい実行結果
      $ java Match02 2 4 4
      コンピューターの数字 = [4, 5, 7]
              あなたの数字 = [2, 4, 4]
      やっと合いましたね。
      
      $ java Match02 2 4 4
      コンピューターの数字 = [1, 1, 7]
              あなたの数字 = [2, 4, 4]
      まったく違います。
      
    3. 乱数を利用して、模擬的に囲碁の結果をプリントするアプリケーション"Igo01.java"(サンプル解答)を作成してください。なお、乱数の計算には、java.lang.MathクラスのMath#random()メソッドを利用することができます。
      このとき、char型の2次元配列を下記の実行結果のようにプリントするメソッドArrayUtil#printArray(char[][])は、"ArrayUtil.java"クラスに作成されています。
      1. public class Igo01 {
      2. public static void main(String[] args) {
      3. int n = 19;
      4. char[] ban = new char[n];
      5. for (int i = 0; i < ban.length; i++) {
      6. for (int j = 0; j < ban[i].length; i++) {
      7. ban[i][j] = setIshi();
      8. }
      9. }
      10. ArrayUtil.printArray(ban);
      11. }
      12. static char setIshi() {
      13. switch ((long)(Math.random()*3)) {
      14. case 1:
      15. return '●';
      16. case 2:
      17. return '◯';
      18. default:
      19. return '\u3000';
      20. }
      21. }
      22. }
      • 正しい実行結果
      $java Igo01
           ● ◯ ●   ◯     ● ●   ◯ ●   ● ●   ●
       ● ◯ ● ◯ ◯ ● ◯   ● ◯     ●       ●   ●
         ◯ ● ●   ◯ ● ●   ◯ ◯     ◯   ◯ ◯    
         ◯ ◯ ● ◯ ◯ ◯ ● ◯ ●   ◯ ◯ ◯ ◯ ◯ ◯ ●  
       ◯     ● ◯   ◯ ● ● ◯ ●   ◯ ◯   ●   ●  
       ● ● ◯ ● ◯ ◯ ●     ● ● ◯ ◯ ◯   ● ◯ ●  
         ◯ ● ● ◯     ◯ ●   ◯   ◯     ● ●   ◯
       ◯ ◯ ◯     ◯ ●   ●   ● ◯     ● ◯   ● ●
         ● ◯ ● ●   ●   ●   ◯ ◯     ● ◯ ●   ◯
           ◯ ●       ◯ ◯   ◯ ◯ ● ◯   ◯ ◯ ● ●
         ● ● ◯ ● ●   ◯         ◯ ●     ◯   ◯
       ● ● ● ● ◯ ◯ ◯ ● ●   ● ◯ ● ◯ ●   ◯ ●  
         ◯ ● ◯   ◯ ● ◯ ◯ ◯ ◯ ●           ●  
             ◯ ● ◯   ●     ● ◯   ◯   ● ●    
       ● ● ● ● ● ◯ ◯ ● ●         ◯ ◯     ◯ ●
       ◯ ● ◯ ●   ◯ ◯ ◯ ◯ ◯ ◯   ◯ ● ● ◯   ● ●
             ●   ● ◯ ●   ● ◯   ◯   ◯ ●   ◯  
       ◯ ● ● ● ◯     ◯ ● ● ◯       ● ●   ●  
       ◯   ●   ◯ ◯     ●   ●   ●   ● ◯ ●   ●
      
Top

inserted by FC2 system