ソフトウェアの品質を学びまくる2.0

旧ブログからゆっくり移行中です。http://blog.livedoor.jp/prjmng/

TABOK粗読による自動化の座学 - カテゴリー10「デバッグの技術」

 カテゴリー10は、「デバッグの技術」です。
 ここでいうデバッグはもちろん、テストスクリプトのデバッグ。
 自動テストで避けるべきは、テストの対象であるアプリは悪くないのに間違って欠陥と判定してしまう擬陽性と、アプリが悪いのに気づかず素通りしてしまう擬陰性ですね。これらの原因になるバグを、どう片付けるかがカテ10のテーマです。
 ところでこのカテ10に「error」という言葉が出てきますが、これは普通ぼくらが「欠陥」と呼んでいるもの、JSTQBでいうところの「defect」にあたるようです。このエントリーで「エラー」と呼ぶことにしますが、本来は統一した方がいい気がする。
 ちなみにJSTQB(pdf)でいう「error」は、「間違った結果を生み出す人間の行為」という定義でした。

エラーの種類

 TABOKでは、エラーを4つに分類していあます。
 スクリプト側のエラーは、Syntax Errors、Run-time Errors、Logic Errors。アプリケーション側のエラーは、Application Errors。
 Syntax Errorsはそのまま、プログラミング言語の文法に従っていないエラー。Run-time Errorsは、文法としては間違っていないが、ゼロ割りなど不適切な処理でもたらされるエラー。Logic Errorsは、文法も処理も、プログラミング言語的には問題ないが、ロジックが誤っているもの。たとえば、>と≧と間違いですね。
 Application Errorsはそのまま、自動テストが見つけるべきバグそのものです。

デバッグの技術

 何らかのおかしな挙動が出た場合のデバッグの手順を、エラーの存在の識別→再現→特定→改修としています。

エラーの識別

 テストスクリプト自体の検証には3つあると言っています。
 Positive Verification Point testsは、アプリが正しく動いているときに「正しい」と判断することの確認。Negative Verification Point testsはその逆で、期待どおりでない動きをしたときに「正しくない」と判断することの確認。ブレークポイントを使ってアプリを止めるなどして、正しく判定していることを検証します。
 もう1つのBatch Run testsは謎。最後の6行ほどで、「個別にスクリプトを流していただけでは何もでなくても、パラで流せば問題が出ることがある」と言っています。これがデバッグ?
 先に現象があって原因を見つけるというよりは、スクリプト開発時のデバッグのことかも知れません。

エラーの再現

 再現させられないければ直せないぞ!よしんば直せたとしても、直ったことを確認できないぞ!

エラーの特定

 実際に誤りを含んだ箇所と、その影響で事象が出る箇所は異なる。だからエラーの箇所の特定って難しいよってことで、4つの特定方法を紹介しています。プログラマーの方は、こういう分類を意識せずデバッグされてるものなんでしょうか。
 事象発生箇所からコードを遡っていく「バックトラック」。変数の箇所を定数にするなどコードを単純化して被疑箇所を絞っていく「エラー単純化」。コード全体を2分割してエラーの有無を見て、エラーのある方をまた2分割して・・・とやってく「二分木探索」。典型的なエラー事例から仮説を立てる「仮説」
 詳しくはTABOKを参照のこと!#ステマ

典型的なエラー

 ありがちなエラー原因として、「同期」「データ」「初期化」「オブジェクトのプロパティ変更」を上げ、説明しています。
 テスト自動化研究会で、ぼくはこのカテゴリー10の解説をさんと担当予定ですので、詳細はそこでがんばりまーす。

エラーの改修

 直すんだ!