テスト駆動開発を支援するための デバッグ関心事グラフ

18
テテテテテテテテテテテテテテテ テテテテテテテテテテ テテ テ テテ テテ テテテテテテ

description

テスト駆動開発を支援するための デバッグ関心事グラフ. 塩塚 大  鵜林 尚靖 九州工業大学. 概要. 今回はDCG生成の 仕組み について説明. TDD. 生成. 実行. DCG. 利用. モチベーション 同じバグ,失敗を繰り返したくない しかし,修正過程をいちいち手作業で記録するのは大変 アプローチ 修正過程 を 自動収集 する仕組みを提案 テスト駆動開発(TDD)に着目しテスト失敗 / 成功をもとに実現 修正過程の表現 ⇒  デバッグ関心事グラフ( Debug Concern Graph: DCG). 目次. 1.問題意識 - PowerPoint PPT Presentation

Transcript of テスト駆動開発を支援するための デバッグ関心事グラフ

Page 1: テスト駆動開発を支援するための デバッグ関心事グラフ

テスト駆動開発を支援するための

デバッグ関心事グラフ

  塩塚 大 鵜林 尚靖

九州工業大学

Page 2: テスト駆動開発を支援するための デバッグ関心事グラフ

2

DCG

生成

概要

利用

TDD実行

• モチベーション– 同じバグ,失敗を繰り返したくない– しかし,修正過程をいちいち手作業で記録するのは大変

• アプローチ– 修正過程を自動収集する仕組みを提案– テスト駆動開発(TDD)に着目しテスト失敗 / 成功をもとに実現– 修正過程の表現 ⇒ デバッグ関心事グラフ( Debug Concern Graph: DCG)

今回はDCG生成の仕組みについて説明

Page 3: テスト駆動開発を支援するための デバッグ関心事グラフ

目次

1.問題意識2.デバッグ関心事グラフ(DCG)3.DCGを用いたデバッグ4.議論と今後の課題

3

Page 4: テスト駆動開発を支援するための デバッグ関心事グラフ

1.問題意識失敗したケースAST操作で生じたバグ - insert メソッドー修正過程を記録する際の課題

4

Page 5: テスト駆動開発を支援するための デバッグ関心事グラフ

失敗したケース

• 慣れていない言語でプログラミングし失敗したケース

– PHP 言語の例• 型が曖昧な言語 

⇒同じ変数が配列になったりオブジェクトになったりする

• このことを十分に理解していなくて発生したバグ ⇒具体例:AST(抽象構文木)操作で発生した

バグ

5

Page 6: テスト駆動開発を支援するための デバッグ関心事グラフ

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へ変換エラー発生

Page 7: テスト駆動開発を支援するための デバッグ関心事グラフ

修正過程を記録する際の課題

• 既存のアプローチ– 修正過程のドキュメント化 / コミットの際のコメント

⇒手作業で作成するのは大変– バージョン管理ツール

⇒履歴だけ見ても,どういったバグ / テストに関わったか分からない

• 本研究のアプローチ– 修正過程の自動収集 

⇒手作業の負担を軽減– バージョン間にテスト結果を関連させて表現

⇒ある修正に関係したバグ,テスト,テスト結果が分かる

7

insert(Ver. 0.1)

testInsert

insert(Ver. 0.2)

error succeeds

アプローチのイメージ

Page 8: テスト駆動開発を支援するための デバッグ関心事グラフ

2.デバッグ関心事グラフ(DCG)自動収集の仕組み

修正履歴の管理方法関心事グラフとの関係

8

- Debug Concern Graph -

Page 9: テスト駆動開発を支援するための デバッグ関心事グラフ

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 メソッドの修正過程の自動収集

Page 10: テスト駆動開発を支援するための デバッグ関心事グラフ

修正履歴の管理方法

• テスト失敗の後に再びテスト失敗した場合⇒ テスト失敗ごとにコードの差分だけを保存

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

Page 11: テスト駆動開発を支援するための デバッグ関心事グラフ

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プログラム

Page 12: テスト駆動開発を支援するための デバッグ関心事グラフ

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 = 関心事グラフ + 修正情報(テスト情報 / バージョン情報)

Page 13: テスト駆動開発を支援するための デバッグ関心事グラフ

3.DCGを用いたデバッグAST操作で生じたバグ - replace メソッドーDCGの選択DCGの利用

13

Page 14: テスト駆動開発を支援するための デバッグ関心事グラフ

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へ変換エラー発生

Page 15: テスト駆動開発を支援するための デバッグ関心事グラフ

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(一部)

Page 16: テスト駆動開発を支援するための デバッグ関心事グラフ

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

Page 17: テスト駆動開発を支援するための デバッグ関心事グラフ

4.議論と今後の課題

17

Page 18: テスト駆動開発を支援するための デバッグ関心事グラフ

議論と今後の課題• 議論

– 選択方針• 膨大なDCGから欲しいものをどうやって見つけるか

– グラフ間の距離– マイニング

– 利用方針• 見つけた後それをどう活用するか

– 単純に参照するだけなのか– 履歴 / テストを活用し,ある程度自動修正できないのか

– グラフ構造• ルート はそもそも必要なのかノード

• 今後の課題– 今回はDCG生成の仕組みを説明

今後は上記の解決と,システムの実装 18