単体テスト | 作成したモジュールのひとつひとつの論理テスト |
統合テスト(結合テスト) | プログラム単位,サブシステム単位でのインターフェースの検証 |
システム・テスト | 外部設計書どおりに機能することの確認.システムが実際の業務として使用に耐え得ることの確認 |
運用テスト | 利用部門およびオーナー(システムについての客先の責任者)の承認を得るテスト |
図 信頼度成長曲線
ブラックボックス・テスト | ホワイトボックス・テスト | |
---|---|---|
特徴 | 仕様書から設計. 入力データに依存. | ロジックから設計. 経路,条件に依存. |
短所 | すべての経路をテストできたと保証できない. | モジュールと仕様書が一致していることが保証できない. データに依存するバグは発見できない. 機能の確認ができない. |
手法 | 同値分割 限界値分析 原因―結果グラフ エラー推測 | 論理網羅基準 |
ケース例(*) | (1) a と b に差がない (2) a と b に差がある | (1) a <= bのとき (2) a > bのとき |
public int difference(int a, int b) { if (a <= b) { return b - a; } else { return a - b; } }
- if (x > 1 && y == 0) { // (A)
- z /= x; // true のとき: (B), false のとき: (C)
- }
- if (x == 2 || z > 1) { // (D)
- z++; // true のとき: (E), false のとき: (F)
- }
経路 | データ(x, y, z) |
---|---|
A-B-D-E | (2, 0, 3) |
- if (x > 1 && y == 0) { // (A)
- z /= x; // true のとき: (B), false のとき: (C)
- }
- if (x == 2 || z > 1) { // (D)
- z++; // true のとき: (E), false のとき: (F)
- }
経路 | データ(x, y, z) |
---|---|
A-B-D-E | (2, 0, 3) |
A-C-D-F | (1, 1, 0) |
- if (x > 1 && y == 0) { // (A)
- z /= x; // true のとき: (B), false のとき: (C)
- }
- if (x == 2 || z > 1) { // (D)
- z++; // true のとき: (E), false のとき: (F)
- }
条件 | データ(x, y, z) | 経路(参考) |
---|---|---|
x > 1, x == 2, y == 0, z > 1 | (2, 0, 4) | A-B-D-E |
x <= 1, x != 2, y != 0, z <= 1 | (1, 1, 1) | A-C-D-F |
□ソース・コード "Triangle01.java"
- public class Triangle01 {
- public static boolean isTriangle(int a, int b, int c) {
- // どれかひとつでも負またはゼロなら三角形ではありません。
- if (a <= 0 || b <= 0 || c <= 0) {
- return false;
- }
- // ある辺が残りの2つの和よりも長いか等しければ、三角形ではありません。
- if (a >= b + c || b >= c + a || c >= a + b) {
- return false;
- }
- // 三角形です。
- return true;
- }
- }
■命令網羅(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.
□ 実行結果
入力/外部条件 | 有効同値クラス | 無効同値クラス |
---|---|---|
数値として0から100までを指定 | 0 <= 数値 <= 100 | 数値 < 0, 数値 > 100 |
入力/外部条件 | 有効同値クラス | 無効同値クラス |
---|---|---|
英字のみを指定 | 英字を指定 | 英字を指定しない |
入力/外部条件 | 有効同値クラス | 無効同値クラス |
---|---|---|
"MAIL"または"FEMAIL"を指定 | "MAIL", "FEMAIL" | 左記以外を指定 |
---- ------------------------ -------------- 1 2 3 4 5 6 7 ---- ------------------------ -------------- 条 年は 4 桁 Y Y Y Y N Y Y 件 1 <= 月 <= 12 Y Y Y Y Y N Y 1 <= 日 <= 31 Y Y Y Y Y Y N "MAIL" Y N N N Y Y Y "FEMAIL" N Y N N - - - 無指定 N N Y N - - - 上記以外 N N N Y - - - ---- ------------------------ -------------- 結 正しい年月日 / 性別 X X X 果 正しくない年月日 / 性別 X X X X ---- ------------------------ --------------
有効同値クラス | 無効同値クラス | 限界値(有効) | 限界値(無効) |
---|---|---|---|
年は4桁(1) | 4桁以外、無指定(2) | 4桁 | 3桁(3), 5桁(4) |
1 <= 月 <= 12 | 月 < 1, 月 > 12, 無指定(7) | 1(5), 12(6) | 0(8), 13(9) |
1 <= 日 <= 31 | 日 < 1, 日 > 31, 無指定(12) | 1(10), 31(11) | 0(13), 32(14) |
"MAIL"(15) | "FEMAIL"(16) | 無指定(17) | 左記以外(18) | - |
番号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
値 | 1960 | - | 200 | 20003 | 1 | 12 | - | 0 | 13 | 1 | 31 | - | 0 | 32 | "MAIL" | "FEMAIL" | - | "MAN" |
正常ケース | ||||||||||||||||||
1 | x | x | x | x | ||||||||||||||
2 | x | x | x | x | ||||||||||||||
3 | x | x | x | x | ||||||||||||||
エラー・ケース | ||||||||||||||||||
4 | x | x | x | x | ||||||||||||||
5 | x | x | x | x | ||||||||||||||
6 | x | x | x | x | ||||||||||||||
7 | x | x | x | x | ||||||||||||||
8 | x | x | x | x | ||||||||||||||
9 | x | x | x | x | ||||||||||||||
10 | x | x | x | x | ||||||||||||||
11 | x | x | x | x | ||||||||||||||
12 | x | x | x | x | ||||||||||||||
13 | x | x | x | x |
---- ------------------------ -------------- 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) ----------- ------------ ------------- -------------- * 結果として、ホワイトボックス・テストとデータは変わりません。
□ 実行結果
エラー組込みソース | サンプル解答ソース | テスト・ケース |
---|---|---|
"Fibonacci01.java" | "Fibonacci01.java" | テスト・ケース |
"Match02.java" | "Match02.java" | テスト・ケース |
"Igo01.java" | "Igo01.java" | テスト・ケース |
- public class Fibonacci01 {
- public static void main(String[] args) {
- int n = parseInt(args[0]);
- int f = 1;
- int g = 1;
- int h = 0;
- System.out.print(f + " " + g + " ");
- while (f + g < n)
- System.out.println(h + " ");
- f = g;
- g = h;
- }
- System.out.println();
- }
- }
$ java Fibonacci01 1000 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
- public class Match02 {
- public static void main(String[] args) {
- int[] a = {(int)(Math.random() * 10), (int)(Math.random() * 10), (int)(Math.random() * 10)};
- int[] n = {Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])};
- long s = 0;
- System.out.println("コンピューターの数字 = " + ArrayUtil.toString(ArrayUtil.sort(a)));
- System.out.println(" あなたの数字 = " + ArrayUtil.toString(ArrayUtil.sort(n)));
- int i = 0, j = 0;
- while (i < a.length || j < n.length) {
- if (a[i] < n[j]) {
- i++;
- } else if (a[i] = n[j]) {
- s++;
- i++;
- j++;
- } else {
- j++;
- }
- }
- switch (s) {
- case 0:
- System.out.println("まったく違います。");
- break;
- case 1:
- System.out.println("やっと合いましたね。");
- break;
- case 2:
- System.out.println("もう少しです。");
- break;
- default:
- System.out.println("おめでとうございます。");
- break;
- }
- }
- }
$ java Match02 2 4 4 コンピューターの数字 = [4, 5, 7] あなたの数字 = [2, 4, 4] やっと合いましたね。 $ java Match02 2 4 4 コンピューターの数字 = [1, 1, 7] あなたの数字 = [2, 4, 4] まったく違います。
- public class Igo01 {
- public static void main(String[] args) {
- int n = 19;
- char[] ban = new char[n];
- for (int i = 0; i < ban.length; i++) {
- for (int j = 0; j < ban[i].length; i++) {
- ban[i][j] = setIshi();
- }
- }
- ArrayUtil.printArray(ban);
- }
- static char setIshi() {
- switch ((long)(Math.random()*3)) {
- case 1:
- return '●';
- case 2:
- return '◯';
- default:
- return '\u3000';
- }
- }
- }
$java Igo01 ● ◯ ● ◯ ● ● ◯ ● ● ● ● ● ◯ ● ◯ ◯ ● ◯ ● ◯ ● ● ● ◯ ● ● ◯ ● ● ◯ ◯ ◯ ◯ ◯ ◯ ◯ ● ◯ ◯ ◯ ● ◯ ● ◯ ◯ ◯ ◯ ◯ ◯ ● ◯ ● ◯ ◯ ● ● ◯ ● ◯ ◯ ● ● ● ● ◯ ● ◯ ◯ ● ● ● ◯ ◯ ◯ ● ◯ ● ◯ ● ● ◯ ◯ ● ◯ ◯ ● ● ◯ ◯ ◯ ◯ ◯ ● ● ● ◯ ● ◯ ● ● ● ◯ ● ● ● ● ◯ ◯ ● ◯ ● ◯ ◯ ● ◯ ◯ ◯ ◯ ● ◯ ◯ ◯ ● ● ● ● ◯ ● ● ◯ ◯ ● ◯ ◯ ● ● ● ● ◯ ◯ ◯ ● ● ● ◯ ● ◯ ● ◯ ● ◯ ● ◯ ◯ ● ◯ ◯ ◯ ◯ ● ● ◯ ● ◯ ● ● ◯ ◯ ● ● ● ● ● ● ● ◯ ◯ ● ● ◯ ◯ ◯ ● ◯ ● ◯ ● ◯ ◯ ◯ ◯ ◯ ◯ ◯ ● ● ◯ ● ● ● ● ◯ ● ● ◯ ◯ ◯ ● ◯ ◯ ● ● ● ◯ ◯ ● ● ◯ ● ● ● ◯ ● ◯ ◯ ● ● ● ● ◯ ● ●