テスト駆動開発を支援するための デバッグ関心事グラフ
-
Upload
chandler-ewing -
Category
Documents
-
view
13 -
download
2
description
Transcript of テスト駆動開発を支援するための デバッグ関心事グラフ
テスト駆動開発を支援するための
デバッグ関心事グラフ
塩塚 大 鵜林 尚靖
九州工業大学
2
DCG
生成
概要
利用
TDD実行
• モチベーション– 同じバグ,失敗を繰り返したくない– しかし,修正過程をいちいち手作業で記録するのは大変
• アプローチ– 修正過程を自動収集する仕組みを提案– テスト駆動開発(TDD)に着目しテスト失敗 / 成功をもとに実現– 修正過程の表現 ⇒ デバッグ関心事グラフ( Debug Concern Graph: DCG)
今回はDCG生成の仕組みについて説明
目次
1.問題意識2.デバッグ関心事グラフ(DCG)3.DCGを用いたデバッグ4.議論と今後の課題
3
1.問題意識失敗したケースAST操作で生じたバグ - insert メソッドー修正過程を記録する際の課題
4
失敗したケース
• 慣れていない言語でプログラミングし失敗したケース
– PHP 言語の例• 型が曖昧な言語
⇒同じ変数が配列になったりオブジェクトになったりする
• このことを十分に理解していなくて発生したバグ ⇒具体例:AST(抽象構文木)操作で発生した
バグ
5
AST操作で発生したバグ - insert メソッドー
• insert メソッドを実装中– insert の定義:ASTを操作し指定した箇所に式を挿入するメ
ソッド– insert 内では,あるクラスのフィールド $statements を参照
( reads )– $statements を常に配列であると勘違いし実装– しかし,実はオブジェクトの場合もありテスト testInsert でエ
ラー発生
6
if ( 1 ) { return $a == 1;}
ASTへの入力(括弧あり)
IfStatement Object|_ $condition => 1|_ $statements Array |_ [0] => Statement Object |_ $expr => return $a == 1;
ASTのイメージ
配列
if ( 1 ) return $a == 1;
ASTへの入力(括弧なし)
IfStatement Object|_ $condition => 1|_ $statements Statement Object |_ $expr => return $a == 1;
ASTのイメージ
オブジェクト
ASTへ変換 ASTへ変換エラー発生
修正過程を記録する際の課題
• 既存のアプローチ– 修正過程のドキュメント化 / コミットの際のコメント
⇒手作業で作成するのは大変– バージョン管理ツール
⇒履歴だけ見ても,どういったバグ / テストに関わったか分からない
• 本研究のアプローチ– 修正過程の自動収集
⇒手作業の負担を軽減– バージョン間にテスト結果を関連させて表現
⇒ある修正に関係したバグ,テスト,テスト結果が分かる
7
insert(Ver. 0.1)
testInsert
insert(Ver. 0.2)
error succeeds
アプローチのイメージ
2.デバッグ関心事グラフ(DCG)自動収集の仕組み
修正履歴の管理方法関心事グラフとの関係
8
- Debug Concern Graph -
9
① ルートノード新規作成② testInsert の追加③ insert(Ver. 0.1) の追加
c) testInsert の成功b) コード修正a) testInsert の失敗⑤ insert(Ver. 0.2) の追加 ⑥ 修正履歴の追加⑦ 修正理由の追加
TDD プロセス
DCG プロセス
「この修正はこのテストでエラーが発生したからなんだ」というのが自動で残る!
自動収集の仕組み
④ $statements の追加
insert(Ver. 0.1)
testInsert
insert(Ver. 0.2)
error succeeds
insert のバグ修正(ルー
ト)
修正履歴
$statements
修正理由
①
②
③
④
⑤
⑥
⑦adds to
reads
adds toadds to
:テストの失敗を 契機に作られる:テストの成功を 契機に作られる:開発者が適宜付け足す
reads
例: insert メソッドの修正過程の自動収集
修正履歴の管理方法
• テスト失敗の後に再びテスト失敗した場合⇒ テスト失敗ごとにコードの差分だけを保存
10
insert(Ver. 0.1)
testInsert
insert(Ver. 0.2)
error succeeds
insert のバグ修正(ルー
ト)
修正履歴
$statements
修正理由adds to
reads
adds toadds to
reads
差分 n
差分1Ver. 0.1
テスト失敗
テスト単位でリプレイが可能!普段は圧縮,必要に応じて展開
Ver. 0.2
DCG = 関心事グラフ + TDD
– 関心事グラフ• プログラムの構造を大ざっぱに理解したい
例:クラス間をまたいで,大規模なプログラムの修正をするときなど• クラス / メソッド / フィールドを declares, reads, writes などを関係とするグラフで表
現
関心事グラフとの関係
11
Robillard, M. P., et al. 2002
replace
insert
ASTConverter
$statements
class ASTConverter { public function insert ($IfSta, $sta, $idx) { $block = &$IfSta->statements; if (!is_array($block)) $block = array($block); $pre = array_slice($block, 0, $idx); $post = array_slice($block, $idx); $block = array_merge($pre, array($sta), $post); }
public function replace ($IfSta, $sta, $idx) { …. }}
declares
declares
reads抽象化
クラス
メソッド
フィールド
関心事グラフPHPプログラム
12
replace
insert(v. 0.1)
ASTConverter
$statements
declaresdeclares
reads
DCG
insert(v 0.2)
error succeeds
insert のバグ修正(ルー
ト)
修正履歴 修正理由
adds to adds toadds to
reads
testInsert
• DCG:あるデバッグに関連した主要な要素を大ざっぱに把握したい例:あるバージョンでテスト失敗の原因となった要素を知りたいときなど
⇒ DCG = 関心事グラフ + 修正情報(テスト情報 / バージョン情報)
3.DCGを用いたデバッグAST操作で生じたバグ - replace メソッドーDCGの選択DCGの利用
13
AST操作で発生したバグ - replace メソッドー
• replace メソッドを実装中– replace の定義:ASTを操作し式を別の式で置換するメソッド– replace 内では,あるクラスのフィールド $statements を参照– $statements を常に配列であると勘違いし実装– しかし,実はオブジェクトの場合もありテスト testReplace で
エラー発生
14
if ( 1 ) { return $a == 1;}
ASTへの入力(括弧あり)
IfStatement Object|_ $condition => 1|_ $statements Array |_ [0] => Statement Object |_ $expr => return $a == 1;
ASTのイメージ
配列
if ( 1 ) return $a == 1;
ASTへの入力(括弧なし)
IfStatement Object|_ $condition => 1|_ $statements Statement Object |_ $expr => return $a == 1;
ASTのイメージ
オブジェクト
ASTへ変換 ASTへ変換エラー発生
DCGの選択
• 既存のDCGを利用したい–類似したDCGを探す
⇒部分グラフの探索
15
class ASTConverter {
public function insert ($IfSta, $sta, $idx) {
….
}
public function replace ($IfSta, $sta, $idx) {
$block = &$IfSta->statements;
$block[$idx] = $sta;
}
}
replace
ASTConverter
$statements
declares
reads
replace のDCG(一部)
insert
ASTConverter
$statements
declares
reads
insert のDCG(一部)
DCGの利用
16
① ルートノード新規作成② testReplace の追加③replace(Ver. 0.1) の追加
④ 「 insert のバグ修正」 DCG の参照⑤ 修正理由の確認⑥ 修正履歴の取出しと 修正方法の決定
TDD プロセス
DCG プロセス
c) testReplace の成功b) コード修正a) testReplace の失敗
insert(Ver. 0.1)
testInsert
insert(Ver. 0.2)
error succeeds
insert のバグ修正
修正履歴
$statements
修正理由adds to
reads
adds toadds to
reads
replace のバグ修正
replace(Ver. 0.1)
testReplace
error
adds to
①
②
③
④
⑤⑥
例:「 insert のバグ修正」のDCGを利用した replace のデバッグ
⑦ replace(Ver. 0.2) の追加
⑧ 修正履歴の追加⑨ 修正理由の共有
replace(Ver. 0.2)
succeeds
修正履歴
adds to
⑦
⑧⑨adds to
4.議論と今後の課題
17
議論と今後の課題• 議論
– 選択方針• 膨大なDCGから欲しいものをどうやって見つけるか
– グラフ間の距離– マイニング
– 利用方針• 見つけた後それをどう活用するか
– 単純に参照するだけなのか– 履歴 / テストを活用し,ある程度自動修正できないのか
– グラフ構造• ルート はそもそも必要なのかノード
• 今後の課題– 今回はDCG生成の仕組みを説明
今後は上記の解決と,システムの実装 18