テストは特別なものではない
上手く言えませんが、「TDDではGUIのテストがネック」などと兎に角テストを別のものとして考えているという気がしてなりません。
しかしながら、私はテストをそこまで特別視した事がありません。何故ならば、テストプログラムも普通のプログラミングと同じだと考えているからです。
先ほどの例でいうと、GUIテストもただのGUIプログラミングです。GUIもプログラムが動いているだけです。最近のGUIはオブジェクト指向で作られているから余計にそう感じます。昔の関数のコールバックよりも簡単です。
コンピュータの全ては0と1で動いています。ですから、コンピュータにとって、人間が触る事とAPIで動く事は同じです。コンピュータは0と1をひたすら処理しているだけなので全ての出来事は同じなのです。
そう考える私は、現場で「GUIの部分はテストファースト出来ないよな」などと聞くたびに違和感を覚えます。GUIのテストもGUIプログラミングなのですから、GUIのテストを出来ないという事は、GUIプログラミングが出来ないと発言しているのと同じです。「ボタンが人間によりクリックされたら・・・」と「ボタンをクリックするプログラムを実行する」のはどう違うのでしょうか?「人間は何をするかわからない」と人間のランダム性について述べる人はそれなりに説得力がありますが、ボタンをクリックしたらどうなのか仕様で決まっているはずです。それに人間には思考パターンがあるのでのランダム性には限界があり、コンピュータのランダム性には勝てません。乱数に偏りがないように気をつけながら、ランダムなテストプログラムを実行すれば済む話しです。ボタンがクリックされた時の仕様は常に、オブジェクトもしくはコードの状態に依存します。
こういう事を言うと、想定外な事があると反論する人がいますが、それについてもテストを特別視しすぎる事の言い訳にはなりません。仕様には想定外がつきものですが、そもそもテストの目的は想定外を発見する事も含まれている筈です。原発事故などのニュースで「想定外」が連呼されているところをみると、日本人は想定外な事を考える事すらしていないという気がしてなりません。しかしながら、システムにとって「想定外」はバグ以外のなにものでもないので、想定外を検出するテストプログラムを考えるべきです。これは情報システム特有の利点です。
大半の情報システムは本当の現実ではありません。そもそも、情報機器で現実をモデル化する目的は、現実では出来ない事を実行する事です。ですから情報システムに限って言えば、テストを怠る理由は殆どありません。テストプログラミングも普通のプログラミングと同じです。
私は不思議で仕方がないので、この問題の真の理由を考えました。その結果一つの仮説にたどり着きました。それは、技術者の質が下がっているのが真の原因だという説です。何度も例に挙げているGUIプログラミングはRAD(Rapid Application Development)でお手軽にできるので仕組みを知らない人が多々見受けられます。仕組みを知らないから、GUIもただのコードの集まりだという発想に至らないのではないでしょうか?
開発の生産性を上げる事は必要です。ですがそれは、知識がなくてもよいという事ではありません。何時の時代も人間は学習をしなければならないのです。知らない便利なツールに頼り学習を怠る時、人は大きな痛手を受けます。分からないからテストしないのではなく、正しくテストする為の知識を身につけましょう。