最近ソフトウェアテストについての知識を深めようと頑張っている中でTDDのテストとQAのための単体テストの差というものを考えてみたくなりました。
もちろんこれらが違うものであることは認識にあったのですが、より正確に認識するために、そして人に聞かれて納得できる説明ができるように自分の中で整理してみることにしました。ここで書くことは私の独自見解であったりするので、「ここは違う」だったり、「そこはこうじゃないか」といった意見があればコメントなどに書いてもらえると幸いです。
TDDのテスト vs. QAのための単体テスト
とりあえず最初にそれぞれのテストについて雑多に書きだすことにしてみました。ただ現状TDDはいろいろな解釈や派生形があることを考慮して、まずはKent Beck氏のテスト駆動開発入門で書かれていたTDDを元にして考えていくことにしました。
TDDのテスト | 単体テスト |
---|---|
コーディングのため | 品質(保証)のため |
開発促進のため | 欠陥を取り除くため |
リファクタリングのため | 品質確認のため |
テストファーストで行う | コーディング後に行う |
詳細設計によるテスト | 単体テスト設計によるテスト |
設計技法としてのテスト | 検証と妥当性確認のためのテスト |
開発者が即座にフィードバックを得るため | |
プログラマのためのテスト | |
三角測量 |
まだまだあると思うのですが、テストに焦点を当てた場合に思いつくのはここまででした。
ここまで書きだして、やはり違いとして大きい点は「何のためか」という点でした。
書きだしていった中でも「〜ためのテスト」というフレーズが多くなっていました。
他に気になった点としてはTDDでは単体テストの設計があるかどうかはわからないため、基本的には詳細設計をもとにテストコードが書かれる可能性も十分にあるということでした。この点はVモデルやWモデルと言った開発モデルによってできるかどうかに大きな差がでるのではないかと思いました。
そして最後にTDDのテストは原則に則って行った場合、「三角測量」で作られていることが非常に気になりました。
「三角測量」で作ったテストは基本的には「同値分割」としてのテストが行えること以外保証できていないことに気が付きました。もちろんプログラマー自身が境界値分析などを無意識に行ってそれがTDDのテストコードに反映されている可能性もあると思いますが、基本的にはそれは保証されていないということがあるのではと思いました。
このあたりを考えているときに@kyon_mmさんから
@Naoki_Rin 不安解消、受け入れ基準に対するテスト っていうのと、保証や検証のためのテスト だからかな。TDDに楽に組みこめるのは検証のテストだと思う。
2012-02-02 13:26:05 via fuyutiger to @Naoki_Rin
@kyon_mm その辺りはVOTDDが目指している部分ですよね。現状テスト技法をいろいろ勉強中ですが、VOTDDはやってみたいなぁと思ってます。コーディング段階で検証のテストを意識するっていうのは身につけたいですね
2012-02-02 13:45:19 via Tween to @kyon_mm
@Naoki_Rin (あくまで現状の)VOTDDは保証型のテストがおおきいんじゃないかな。検証型テストのくみこみはプログラマー+テストエンジニアで探索的テストやるかんじがあるかなぁ。。。
2012-02-02 13:47:20 via fuyutiger to @Naoki_Rin
@Naoki_Rin 検証型のテストを事前にできることじゃないかな。
2012-02-02 13:57:09 via fuyutiger to @Naoki_Rin
@kyon_mm なるほどです。確かに後に回っている検証型テストを先にできるという点はいいですね。
2012-02-02 14:00:25 via Tween to @kyon_mm
このあたりはあまり詳しくないのでまだまだ知識不足でしたが、TDDのテストとQAの単体テストの差を意識すると逆によりTDDのテストを良く書くための方向性が見えてきた気がしました。
以上、雑記でした。
追記:
その時気が付いていなかったのですがTwitterでリプライをもらっていました。QAテストに関してすごく有用な情報だと感じたので追記で載せさせてもらうことにしました。
「前に作ってもok」というより、製造業出身の私から言わせてもらうと、「部品のスペック(=単体テストケース)は、部品の製図(=コーディング)前に決まってなければ、作れん!」 QT @kimukou2628: @Naoki_Rin @biac 前に作ってもokなものなのでしょうか?
感覚で書きだしていたので、知識が足りてない部分が露呈した気がします…。
Wモデルの場合はテストが先にあるはずなのでどちらかと言うと「TDDでは“必ず”テストファーストのはず」というのが大きくて、単体テストの場合は「必ずしも先にテストがなくてもいい」という程度だった気がします。リプライありがとうございました。