Rのこと。

記事は引っ越し作業中。2023年中までに引っ越しを完了させてブログは削除予定

テストの技法

テストの技法

テストの技法はデータ分析でも役立てれそうということで、テストの紹介とまとめ。同値クラステスト、境界値テスト、ドメイン分析テスト、デシジョンテーブルテスト、ペア構成法(直交表)をまとめておく。

ソフトウェアテストの概念

テストの抜け漏れをなくす「網羅性」が大切。これを行うにあたり、怪しいところを察知して気づける必要がある。そのためには、「テストの観点」を学ぶ必要がある。

例えば、具体的な例を考え、「間」「逆」「類推」「外側」を考えてみることや、変なバグがでそうな条件をわざと考えること、あとは、当たり前の内容ををテストしてみるなど。こういったテストを通じて、バグを発見し、品質を向上させていく。可能であれば、テストケースは少なく、多くのバグを発見できるのが望ましい。

単純な理論の場合

変数が1つの条件で、簡単な判定の場合に用いられるテスト。同値クラステストと境界値テスト。

同値クラステスト

同値クラステストとは「同じ意味になる値」をテストする方法のこと。例えば条件分岐にx==3x==10という判定が混じっている場合、テストではxに3xに10を入れることで、正しく処理が行われるかをテストする。この場合のテストケースは、条件判定の数分、テストを書けばよい。

境界値テスト

境界値テストとは「同値クラスの境界値の前後を調べる」方法のテスト。例えば条件分岐にx<=3x>=10という判定が混じっている場合、テストではxに3xに2.9xに3.1xに10xに9.9xに10.1を入れることで、境界値で正しく処理が行われるかをテストする。この場合のテストケースは、条件判定の境界値分のテストを書けばよい。

複雑な理論の場合

変数が1つの条件で、簡単な判定の場合は、先ほどのテストで事足りることもあるが、変数が3つもあるような複雑な論理の場合、同値クラステストや境界値テストでは対応できない。

例えば、どこかのECサイトでは、書籍を購入し、かつ、4000円以上で、離島の人は配送料+500円という判定の場合、「商品」「購入金額」「都道府県」の3つの変数の組み合わせを判定する必要が出てくる。

このような複雑なテストを行うために、「ドメイン分析テスト」や「ディシジョンテーブル」を利用する。これらのテストの使い分けは、「複数の条件が数式で結ばれる」場合はドメイン分析テストが有効で、「複数の条件が論理式で結ばれる」場合はデシジョンテーブルが有効。

ドメイン分析テスト

ドメイン分析テストは、このような判定の場合に使えばよい。とある学校の入試で科目Aは100点満点、科目Bは50点満点、合計90点以上なら合格となるが、90点以上であっても科目Aが60点未満だと不合格と判定する。つまり、条件式は下記のようになる。

  • 科目A >= 60
  • 科目A + 科目B >= 90

f:id:AZUMINO:20200901101423j:plain

ドメイン分析テストを実行するためには「ON」「OFF」「IN」「OUT」を理解する必要がある。内容は下記のテーブルの通り。

OFFポイントは、ONポイントがドメイン内ならばドメイン外の隣接値、ONポイントがドメイン外ならドメイン内の隣接値にする。

3列目のOFFポイントが9になるのは、ONポイントがx>=10なので、ドメイン内ならばドメイン外の隣接値にするためで、4列目のOFFポイントが11になるのは、ONポイントがx>10で、ドメイン外なのでドメイン内の隣接値にするというルールから。

ポイント 概要 x >= 10 x > 10
ON 境界上の値 10 10
OFF 境界上ではない境界隣接値 9 11
IN ON/OFF以外のドメイン内の値 15 etc 15 etc
OUT ON/OFF以外のドメイン外の値 5 etc 5 etc

f:id:AZUMINO:20200901102242j:plain

これらのポイントを組み合わせたドメインテストマトリクスで確認する。考える上でのポイントは「着目する1つの変数だけON、OFFポイントを動かして、その他はINポイントに入れて条件を満たして固定しておく」ということ。こうすると欠陥が欠陥を隠すということはない。ドメインテストマトリクスの書き方は下記の通り。

  • 変数をリストアップ
  • 各変数のON、OFF、INポイントを割り振る
  • 1番下に期待される結果の行を挿入する
  • 1つの変数以外はINポイントにして、着目するONポイント、OFFポイントをテストする

f:id:AZUMINO:20200901105914p:plain

ここで1列目のテストがこのように書けるのは、まず科目Aを検証したいので、科目BはINポイントにする。つまり、条件を満たしている状態にして固定する。なのでINポイントは「ON/OFF以外のドメイン内の値」なので、科目Aを60点、科目Bを40点として、条件を満たす、つまり、ドメインの内側に設定している。そしてONポイントは境界上の値なので60点となる。科目Aが60点で、科目Bを30点でも問題ない。

次に2列目のテストがこのように書けるのは、まず科目Aを検証したいので、科目BはINポイントにする。ここまでは同じ。そしてOFFポイントは境界上にはない境界に隣接する値なので59点となる。さきほど説明したように、OFFポイントはONポイントがx>=60なので、ドメイン内ならばドメイン外の隣接値に設定するルールから来ている。そうなると59点となり、59点で2つ目の条件を満たすためには、科目Aが59点で、科目Bを41点とする。科目Aが59点で、科目Bを31点でも問題ない。

f:id:AZUMINO:20200901104722j:plain

デシジョンテーブルテスト

デシジョンテーブルテストは、「書籍を購入し、かつ、4000円以上で、離島の人」のように論理式で繋げる場合に利用する。この場合、変数は3つでYes/Noで2値なのであれば、2の3乗個の組み合わせがあるので、8通りのテストパターンができる(テストケースの圧縮法は後述)。

f:id:AZUMINO:20200901171335p:plain

デシジョンテーブルテストは場合によっては、テストケースを圧縮できる。条件分岐の判定順がわかっており、どれかがFALSEであれば判定しない場合などは圧縮できる。

f:id:AZUMINO:20200901171709p:plain

さらに条件判定が複雑な場合

これまでよりも変数が多く、条件判定が複雑な場合、全部テストを行うのは困難。そのため、網羅性は確保したまま、重要な組み合わせに絞ってバグを発見するような方法が必要。それが直行表を用いたペア構成テスト。

直交表

「2値判定」で「条件が3つ」ある場合、すべての組み合わせは23=8通りだが、直交表であれば4通りで問題ない。「3値判定」で「条件が4つ」ある場合はすべての組み合わせは34=81通りだが、直交表であれば9通りで問題ない。列が条件で、行がテストケース。

「2値判定」で「条件が3つ」ある場合の直交表がどうなっているかを確認すると、「A-B」の2列に注目すると、「0-0」「0-1」「1-0」「1-1」の全ての組み合わせがあり、「B-C」の2列に注目すると、「0-0」「0-1」「1-0」「1-1」の全ての組み合わせがあり、「C-A」の2列に注目すると、「0-0」「0-1」「1-0」「1-1」の全ての組み合わせがある。「3値判定」で「条件が4つ」の方も、2列に注目すると「0-0」「0-1」「0-2」「1-0」「1-1」「1-2」「2-0」「2-1」「2-2」が確認できる。

f:id:AZUMINO:20200901173356p:plain

左の表はL4(23)直交表とよび、右の表はL9(34)直交表と呼ぶ。実際の直交表はカタログから取得する。例えば下記のような条件だと

  • 条件A:1,2
  • 条件B:1,2,3
  • 条件C:1,2,3
  • 条件D:1,2,3

「4条件の2値分類と3値分類」となるので、大きい方に合わせ「4条件の3値分類」、つまり、L9(34)の直交表を選ぶ。

f:id:AZUMINO:20200901174641p:plain

直交表の使い方は理解できたが、なぜこれで良いのかが理解できないので、その点を深堀りする。

直交表の基礎は「ペア構成テスト」にある。ペア構成テストというには、これまでのようにすべての条件の組み合わせをテストするのではなく、「条件の全てのペアをテストする」方法。

3条件(A,B,C)の2値分類(0,1)の場合、全てのペアは「A-B」「B-C」「C-A」の3通りの組み合わせに、ペアごとに「0-0」「0-1」「1-0」「1-1」の4通りの組み合わせがある。

これである程度網羅できる理由は、欠陥の大部分は「シングルモード欠陥」「ダブルモード欠陥」に分類できるため。「シングルモード欠陥」とは、単体で欠陥が発生することで、「ダブルモード欠陥」は複数に組み合わせることで欠陥が生じる欠陥のこと。そのため、すべてのペアを網羅できれば、「シングルモード欠陥」「ダブルモード欠陥」は網羅できるので、これらの欠陥を網羅できれば、大部分はカバーできるという理屈。