woshidan's blog

そんなことよりコードにダイブ。

ソフトウェアテスト技法ドリルを読んだ

ソフトウェアテスト技法ドリル―テスト設計の考え方と実際

ソフトウェアテスト技法ドリル―テスト設計の考え方と実際

Web系のソフトウェアエンジニアだとある程度TDDの文脈でテストコードを書くと思います。

自分は今アプリ用のSDKの担当でSDKについてリリース前のQAも行うのですが、サーバや外部サービスとの連携部分で膨らみがちなテストを漏れが出ないようにしつつ、手早く設計&実行できるようにするか、みたいなところが気になって読みました。

前書きによると、この本は、Boris Beizerの「ソフトウェアテスト技法」に書いてあることの一部を初級者でも読めるように噛み砕きつつ、設計の際に利用できるツールの紹介をしたり、日本人の考えた手法も合わせて取り上げたり、といった感じです。

もともと敷居が高いものをさらっと取り上げた結果薄い、みたいな感じなので、TDD少しやったことあります、程度の自分にとっては、HAYST法あたりから結構噛み砕くのが重たいな、といった感じでした。

「異常値は他の異常値を隠す」、状態遷移表、Nスイッチカバレッジ(N=2~3)、タイミングも水準、あたりが明日からすぐ使えそうな感じでした。

以下、印象に残ったことをいくらかメモします。

  • 怪しい箇所の探し方
    • 間・対象・類推・外側、意地悪な条件を意識
  • 知っているものほど危うい
    • 外部連携などした時に、前提が異なってデータの移行ができないなどのトラブルの元IOS基準など外部基準を調べたり(日付のiCalenderなど)
  • 同値分割・境界値分析は、ふだん「テストや動作確認をする」という言葉を使う時に連想するようなことに近い
  • 有効な値は複数同時に確認できるが、無効な値については一回に一つずつ(=異常値は他の異常値を隠す)
  • 関係性がある複数の変数を同時にテストする「ドメイン分析テスト」
    • on/off/in/outで、ある因子(=関数に入れる一つの変数orテスト時に変化させる項目)をon/offさせるときは、他の因子はin(Binderのドメイン分析マトリクス)
    • 複数の条件の組み合わせをチェックしたいとき、原因結果グラフを使い、それに対応したツールを使うことでディシジョンテーブル(因子の値とその結果を表す表。)が自動生成できる
    • これが成り立たなかったら次はこの条件を考える… みたいなことをしたいときはCFD法で書くとスッキリしやすい
  • 仕様としては機能と機能の間に関連がないことになっているシステム上の要因どうしを組み合わせて「想定外」のバグがないかのテストを効率よくしたい
    • HAYST法やペアワイズを使う
    • 直交表-> 複数の条件のうち、任意の2~3つの因子の組を選んだら、因子の取りうる代表値(水準という)の全ての組合わせがテストができるようなテストを作る
    • HAYST法の詳細は、 https://www.fujixerox.co.jp/company/technical/tr/2015/pdf/p_04.pdf
    • HAYST法に関連して紹介された「エキスパートの知見を必要最小限とする」ためのプロセスは度々見返すと良さそう
    • 因子同士の組み合わせにより発生する、一緒に実行できない水準の組み合わせを禁則と言って、禁則がある場合の処理として、その因子の組み合わせを一つの因子として、禁則の部分を除いて水準を作り直す(相互排他因子融合手法)
    • 直交表の割り当ては因子の組み合わせが決まれば既存の割り当て表から選ぶ感じ?
    • ペアワイズはなんらかの行列的演算を持って、直交表が持っている「全組み合わせがどう数回あらわれるという性質」を崩してテストケース減らしたい時に使う
    • それぞれの機能で必要とわかっている前提の条件がいくつもあるような場合の成否をするのはこの章のテスト設計手法の話ではない
  • 状態遷移のテスト
    • C0 パスカバレッジ 100% 全ての状態を少なくとも一度以上
    • C1 パスカバレッジ 100% 全ての遷移も少なくとも一度以上
      • では足りないことがあるので、状態遷移表から「イベントが適用できない」(=遷移できない)場合、N/A(Not Applicable)を探す
    • ある遷移のあと、内部状態が変化したことももれなくテストしたい -> Nスイッチカバレッジ
      • 状態遷移表を関係行列に… それをN乗-> N回のイベントで到達できるすべてのパスがわかる
    • 状態が多すぎる場合はどうするか?
      • ラルフチャートから内部変数をリストアップしてやる。状態の遷移については、典型的な遷移パターンを因子としてまとめてしまう。タイミングも因子として扱うことが
  • 身体測定とソースコードの静的解析はいままで取ったことがある周りの状態と比較して現在のプロダクト(人間)の状態がやばいか早めに判断する、という点で似てるよね

直交表の例

3つの因子があるとき、そのうち2つの因子を選んで、2つ同士は、すべての水準の値の組み合わせがテストできるようにする表。

No コイン1の表裏 コイン2の表裏 コイン3の表裏
1
2
3
4

水準の値の組み合わせについて確認すると、

  • コイン1の表裏とコイン2の表裏を見ると {コイン1-表, コイン2-表}, {コイン1-表, コイン2-裏}, {コイン1-裏, コイン2-表}, {コイン1-裏, コイン2-裏} の4通りが全て出ている。
  • コイン2の表裏とコイン3の表裏を見ると {コイン2-表, コイン3-表}, {コイン2-表, コイン3-裏}, {コイン2-裏, コイン3-表}, {コイン3-裏, コイン3-裏} の4通りが全て出ている。
  • コイン3の表裏とコイン1の表裏を見ると {コイン3-表, コイン1-表}, {コイン3-表, コイン1-裏}, {コイン3-裏, コイン1-表}, {コイン3-裏, コイン1-裏} の4通りが全て出ている。