More Related Content Similar to ソフトウェアテストの再検討 (20) ソフトウェアテストの再検討 2. ソフトウェアテストの再検討
コンピュータ・アーキテクチャ
正しいプログラムとは?
科学哲学とソフトウェアテスト
ソフトウェアテストの方法論
3. ノイマン型コンピュータ
現在のコンピュータはノイマン型アーキテクチャ
– 主記憶装置上に命令とデータを区別することなく格
納し、データを命令として解釈実行
– 計算を開始する準備のためにプログラムとデータを
外部から主記憶装置に入力
– 計算結果を他で利用するためにメモリから外部にデ
ータを出力
メモリ空間の電子配列が手続きとデータを兼ねる
– 究極的には「状態」の実存のみが全てをあらわす
– 時間 N → 時間 N+1 の状態変化は決定論的
– ノイマン・アーキテクチャはチューリングマシンの
一形態
4. 正しいプログラムとは?
論理においては何ひとつ偶然はない。もし、あるも
のがある事態のうちに現れることが可能であるのな
らば、その事態の可能性は、そのものの中にあらか
じめ先決されていなければならない。 (ウィトゲ
ンシュタイン)
状態において決定論的に決まるため「プログラムは
思った通りには動かない。作った通りに動く」点に
おいて論理的には常に正しい。
観測者(お客様)の思ったとおりに動くという評価
によって価値を決定づけられるというコンテキスト
においてのみ、「観測者にとって有用なプログラム
」を「正しいプログラム」と定義づけることが可能
5. 正しいプログラムとは?
「正しい」の定義
– 前述までのとおり、観測者にとって有用であるか
– バグや不具合がある期間までにおいて認識されない
「バグや不具合」の定義
– 法的な文書ではバグのことを瑕疵と記述
– 瑕疵は瑕疵責任期間中であれば無償で改修する義務
を負う契約が多い(明白な「正しくない」)
– 原因や責任の所在などが不明なもの不具合と記述
– コンパイルエラー、ランタイムエラー、論理バグ
「期間」の定義
– 結合テスト、システムテスト、瑕疵責任、耐用年数
6. 正しいプログラムとは?
「正しいプログラム」の判断のための主流な考え方
– 主記憶装置上に命令とデータを区別することなく格納し、デ
ータを命令として解釈実行するのだから、主記憶装置に展開
される前段階のバイナリ(やソースコード)が観測者にとっ
て正しければ正しいプログラム(演繹的・ソースコードレ
ビュー)
– メモリから入力された結果は、なんらかの形で出力されるの
だから入力と出力が観測者にとって正しければ正しいプログ
ラム(帰納的・ブラックボックステスト)
ここでの「観測者」はお客様じゃない可能性が高い
– エキスパート・ジャッジの共犯性
お客様にとって、これが正しいであろう
プロが正しいと言っているから、これで正しいであろう
– お客様が判断できるところは積極的に判断いただく必要性
– 可能な限り客観的かつ明確な記述である必要性
7. 科学哲学とソフトウェアテスト1
科学哲学
– 歴史的に科学と哲学は一体であった
– 科学の方法論的基礎、存在論的基礎は「正しさ」を
計る尺度の「正しさ」を計るメタ理論
– ソフトウェアテストは「正しさ」を計るものであり
、「正しさ」の基準が明示されなければ闇雲に制限
時間まで動かすだけの試行となる
– 「正しいプログラム」を対象にするため、パフォー
マンスやキャパシティ等については今回は対象外と
する
8. 科学哲学とソフトウェアテスト2
科学的実在論
– 知覚不能な物について理論が行なう主張は真である
か偽であるかどちらか
– それを測る規準はその理論で話題となる実体が理論
で言及された通りの仕方で実在しているか否か
– 理論によって記述されるものは例え知覚不可能であ
っても、その心とは独立に客観的に実在する
– メモリ空間上の電子配列を読む事は事実上はできな
くても、理論で言及されたとおりに実在しているに
相違ないだけの根拠があれば正しく実在していると
見なす
9. 科学哲学とソフトウェアテスト3
道具主義
– 理論によって現象の説明・予測がどれだけうまくい
っていても「理論が観察可能な現象の背後にある観
察不可能な隠れた実在についての真なる 記述にな
っている証明にはならない
– 現象を説明するための いくつかの理論が存在する
場合は、理論はその正しさではなく、現象をどれだ
けうまく予測・説明できるかの有用性によって決め
る
– 入力と出力を積み上げて正しい結果を出し続けてい
れば、メモリ空間上の電子配列は少なくとも「有用
」であると判断する(電子配列自体の正しさに踏み
込まない)
10. 科学哲学とソフトウェアテスト4
その他(観念論・社会構成主義など)
– 観念的もしくは精神的なものが外界とは独立した地
位を持っているという確信により、観念的なものが
自存し、実在性をもつとする
– 私がこのソースコードは正しいと思うから正しく実
存しているはず→独立性テーゼと呼ばれる客観性が
欠けるため、ソフトウェアテストの議論には不向き
(逆に科学的実在主義と道具主義は独立性テーゼを
保っている)
– ただし間主観的に他者の目から明白な誤りを低コス
トで除去できる可能性があるため不要ではない
11. ソフトウェアテストの全体論
プログラムにおいての「正しさ」は特定期間内における社会領域
の「認識」によって定義付けられる点で道具主義に近い。このた
め普遍的な正しさの実存は問題対象せず、確率論としての正しさ
を合意する態度設定が優位となる
また科学的実在論であっても道具主義であっても、文脈や状況に
より定義が変わりうる曖昧な概念を特定の操作によって得られる
変数の集まりの形とする(実験)ことで、その概念を測定可能と
する「操作主義」が必要となる
故に全ての仕様書は測定可能な変数を網羅的に定義した存在とし
て記述し、かつお客様のもちいるコード体系において反証可能、
合意可能な表現形態であるべきである
– 「語る」ことよりも「示す」ことの優位性
– デシジョンテーブル・画面写真・モックアップ
12. 単体テストの方法論
単体テストを含めて製造工程(進行度=テストパス率)
単体テストは JUnit などによる機械的アプローチ
– 繰り返しによるデグレートの防止(要件が変わることは前提)
– 変数(引数・状態)、結果は全てベクトルで表現可能
変数ベクトルの 1 次元集合 → 2 次元行列
手続きテンプレート+ Excel で表現可能
テスト仕様書や実行体は自動生成可能
– 他者性の確保
最終的な成果の検証はプログラムを作った人間がしても意味が薄
い
インターフェイスの合意を主とする遅延評価型ペアプログラミン
グ
テスト仕様書は事後的であって他者の判断を仰げる形にする
単純な単体テストを組み合わせても総体としての正しさに言及し
ていないため費用対効果を見極める必要がある。
13. 結合テストの方法論1
認識論的なとしての正しさの合意
– 要件定義・外部仕様とテスト仕様書の整合性を常に意識する
– お客様の判断を仰ぎやすい形にする
組み合わせ問題のカバレッジを高めることで確率論的
に不具合の事前発見の可能性を高めることができる
– 組み合わせは無限大
状態と操作の組み合わせが非常に膨大
試行回数は有限にせざるをえない
– 以下の方法論により、試行時間や組み合わせの妥当な削減
単体画面操作テスト
組み合わせ変数選択
14. 結合テストの方法論2
試行時間の削減(単体画面操作テスト)
– 状態 A → 操作1 → 状態 B → 操作2 → 状態 C を
分解
状態 A → 操作1 → 状態 B
状態 B → 操作2 → 状態 C
– 分解可能性の証明(着目状態変数の抜け落ちがない)が可能
であれば組み合わせ変数を一気に削減できる
変数A 変数B 変数C
試行1 0 0 0
変数が取りうる値の組み合わせを削減 試行2 0 1 1
– 変数のクラス分類 試行3 1 0 1
試行4 1 1 0
境界値、頻出値、特殊動作など
– 実験計画法(直交表実験)
試行 × 変数群の行列において任意の2列に着目した場合のみに全
組み合わせがでるようにする方法論(ラテン方格)
15. ソフトウェア修正の方法論
アブダクション(仮説的推論 )
– 関連する証拠が真である場合に、最もよく説明する仮説を選
択する推論方法
理論 T に従う観測変数集合 O についての諸説明の集
合を導き、その中から最良の説明 E を選択する
– 説明 E に基づいて反証を行うための実験やソースコードの検
証を行い、的中していれば理論の修正を行う
– そうでないのであれば T から E を選び直すが、この過程で O
に観測変数が追加されるため T に影響がでる可能性が高い
– 理論選択と検証の方法論として説明候補を大量に棄却(枝狩
り)できるものを選択すると効率がよい
修正後はリグレッションテスト(回帰テスト)
16. まとめ
現在のコンピュータは全て「状態」で定義され
る
観測者(判断者)の転換が起こる事を認識する
正しいプログラムの検証ためには科学的手法が
必要であるが、絶対の真理ではなく、その実存
は確率的な事実と割り切る
確率的な事実の検証を有限のリソースで行うた
めに費用対効果において最大効率を得るための
理論が重要となる