😊

[testCode] テストコード入門

2021/09/16に公開

テストコードとは

メソッドなどの実行結果が適切かどうかをコード上で試験するもの

public int sum(int a, int b) {
    return a + b;
}

test
 assertEqualsは、第一引数と第二引数が同一であればテスト成功とみなす

public void testSum() {
    int result = sum(1,2);
    assertEquals(result, 3);
}

テストの意図

プログラマとプログラムの認識齟齬をはじめ、単なるバグや仕様外の事象などの、あらゆる異常を検出してくれる手助けとなる

例:有名な浮動小数点の丸め誤差
コードを見てもすぐには気付けない

public double subtract(double a, double b) {
    return a - b;
}

予想外の動き

subtract(1, 0.9);       // -> 0.09999999999999998

テスト設計

上記観点から、テスト設計技法が存在する

懸念

  • テストは、考えられる入力に対し、正常な値が出力されているかを調べるものですが、値の取決めや範囲など、闇雲に決めていては正確性を欠く
  • かといって、考えられる入力を全て試そうと思うと、莫大な時間がかる
    • 100までの数字を2つ受け取るメソッドをテストするだけでも1万通りのテストが必要
      • 現実的ではない

ブラックボックステスト

プログラムのコードは無視し、仕様から与えるべき値を取り決める技法

同値分割

各範囲から値をひとつ抽出し、テスト用の値とする手法

仕様

メソッドは、年齢と基礎料金を入力する。
年齢が6歳未満の場合は、基礎料金の0%を出力する。
年齢が6歳以上で、かつ13歳未満の場合は、基礎料金の50%を出力する。
年齢が13歳以上で、かつ18歳未満の場合は、基礎料金の80%を出力する。
年齢が18歳以上で、かつ60歳未満の場合は、基礎料金の100%を出力する。
年齢が60歳以上の場合は、基礎料金の90%を出力する。
小数点は切り捨てる。

この場合だと、以下の5つの値が必要

N < 6
6 <= N < 13
13 <= N < 18
18 <= N < 60
60 <= N

5つの各範囲より、任意の数字を抽出(同値分割)

3
9
15
30
65

境界値分析

???

無効値

public int sum(int a, int b) {
    return a + b;
}

intの最大値と1を与えて明らかに変な値が出力された

sum(2147483647, 1);     // -> -2147483648

本来であればバリデータなどで排除されるべき

ホワイトボックステスト

コードに着目して試験を行う
ソースコード上でのミスを発見したい

命令網羅

すべての命令を実行するようにテスト

分岐網羅

条件網羅

判定条件 / 条件網羅

複合条件網羅

単体テスト(ユニットテスト)に対するテスト設計の考え方

実際のテスト設計では、

  • 同値分割・境界値分析を組み合わせたブラックボックステスト
  • 複合条件網羅のホワイトボックステスト

を組み合わせてテストケースを作成するのが望ましいでしょう。

テストコーディング

基本的には、テスティングフレームワークを利用して、テスト設計のとおりに書く

各言語やテストフレームワークでコードに多少の違いはありますが、基本的には入力値に対して期待される値が出力されているかを検査するにすぎませんから、大きな違いはない

まとめ

https://www.deep-rain.com/programming/program/615

Discussion