Transcript s - qwik.jp

make test-zesti:
A Symbolic Execution Solution for
Improving Regression Testing
NTT ソフトウェアイノベーションセンタ 丹野 治門
目的と貢献

目的


ソフトウェアにおけるより多くのバグを見つけたい
現状の問題点


開発者が作るテスト(○意味あるテスト,✕高コスト)
機械的に作るテスト(○低コスト, ✕無意味なものが多い)


提案


(例) パスカバレッジ向上を目指したSymbolic Execution
開発者が作った(回帰テスト向け)テストケースを種にし
て様々なバリエーションを生成
主な貢献点

2
OSSでしっかり評価,未知のバグを発見
ICSE'12 勉強会
2012/8/30
着眼点
Sensitive Operationsの周辺を徹底的にテスト
するようにする



Sensitive Operation = バグ混入しやすい箇所
具体例:配列へのアクセス
int v[100];
void f(int x){
if(x > 99){
x = 99;
}
v[x] = 0;
}
3
回帰テスト用テストケース
(開発者が作成)
この2つのテストケースでパスカバレッジ
TestCase01
(分岐網羅)は100%だが・・・
x = 100
TestCase02
x = 50
x = -1のとき配列不正アクセスエラー
Sensitive Operation周辺はバグが存在
する可能性が高い!
ICSE'12 勉強会
2012/8/30
着眼点
Sensitive Operationsの周辺を徹底的にテスト
するようにする



Sensitive Operation = バグ混入しやすい箇所
具体例:配列へのアクセス
int v[100];
void f(int x){
if(x > 99){
x = 99;
}
v[x] = 0;
}
4
回帰テスト用テストケース
(開発者が作成)
この2つのテストケースでパスカバレッジ
TestCase01
(分岐網羅)は100%だが・・・
x = 100
TestCase02
x = 50
x = -1のとき配列不正アクセスエラー!
提案手法
ICSE'12 勉強会
TestCase03
x = -1
2012/8/30
手法


テスト実行と同時にSymbolic Executionを実施
「Symbolic Execution結果+追加条件」で新規テスト生成
提案手法によるテストケース生成の一例
TestCase02
x = 50
int v[100];
void f(int x){
if(x > 99){
x = 99;
}
v[x] = 0;
}
5
Symbolic
Execution
追加!
入力変数:
x = x0
パス条件:
not(x0 > 99)
テスト
ケース
生成
TestCase03
x = -1
境界値条件
x0 > 0 &&
x0 <100
ICSE'12 勉強会
2012/8/30
評価
評価に用いたOSS(3つ)


GNU Coreutils,libdwarf,readelf
評価結果



合計58件(うち,52件は未知)のバグを検出
OSSコミュニティに報告,バグ改修も進んでいる
提案手法で発見したCoreutilsのバグ一覧
Min Depth
バグに到達するまでの
「条件分岐」の数
通常のSymbolic Execution
では時間がかかりすぎて
発見しにくいバグ
6
ICSE'12 勉強会
2012/8/30
Paul Dan Marinescu and Cristian Cadar “make test-zesti: A Symbolic Execution Solution for Improving Regression Testing” ICSE2012. Table1より引用
BALLERINA: Automatic Generation and
Clustering of Efficient Random Unit Tests
for Multithreaded Code
NTT ソフトウェアイノベーションセンタ 張 暁晶
背景・目的・貢献
背景



マルチスレッドを用いるソースコードの単体試験は、手間がかかる

テスト対象が持つオブジェクトを、複数のスレッドで触るような試験である

生成された単体試験の実行が遅い
並行性バグをうまく見つけられない
バグじゃないのにバグだという誤報(false alarm)が出る
このような単体試験を「ランダム生成」する従来手法では・・・


目的


並行性バグをうまく見つけられるような単体試験をランダム生成する
貢献

1.
2.
3.
8
並行性バグをうまく見つけられるような単体試験をランダム生成す
る手法を提案
生成された単体試験でのfailureを、人手で点検する手間を軽減でき
る「クラスタリング手法」も提案
評価:実際のバグ検出による効果確認
ICSE'12 勉強会
2012/8/30
手法概要1
単体試験のランダム生成:


2つのスレッドのみ用意する

それぞれが、ランダムに選ばれたテスト対象のメソッドを1つだけ実行する

並行性バグにあたる確率を上げるために、上記のような「シンプルな」並行コー
ドを、「より複雑な」シーケンシャルなランダム生成コードの後ろに追記する
BALLERINAが生成した単体試験
シーケンシャルな
ランダム生成コード
→既存手法Randoop algorithm[1]を改造
並行実行する
2つのスレッド
Adrian Nistor et al. “BALLERINA: Automatic Generation and Clustering of Efficient Random Unit Tests for Multithreaded Code”, In
Proc. of ICSE 2012, pp.727-737, Figure 2 より
[1] C. Pacheco, S. K. Lahiri, M. D. Ernst, and T. Ball, “Feedbackdirected random test generation,” in ICSE, 2007.
9
ICSE'12 勉強会
2012/8/30
手法概要2

点検すべきfailureを絞り込むクラスタリング手法:


Test Oracleとして既存手法linearizability[2]を採用してい
るので誤報が出る可能性がある
「似たような」バグレポートはたぶん、
全部誤報か全部本物のバグかだろう
→バグレポートを下記2点によりクラスタリングする




Failure発生時に実行していたメソッド
Failureの種類
評価では、1個の本物のバグに対して、数百個の誤報が出る
→非実用的
クラスタリングの導入後では誤報は3~4個にまで減った
[2] S. Burckhardt, C. Dern, M. Musuvathi, and R. Tan, “Line-Up: A complete and automatic linearizability checker,” in PLDI, 2010.
10
ICSE'12 勉強会
2012/8/30
評価

6件のOSSに含まれる14個の本物のバグで評価




Groovy, JDK, JFreeChart, Apache Log4j,
Apache Lucene, Apache Pool
提案手法は、既存ランダム生成手法より、
2~10倍速くバグを見つけた
クラスタリング手法により、点検すべきfailure
の数を4~8倍減らした
未知のバグをさらに3件検出できた

11
Apache Log4j, Apache Poolから
ICSE'12 勉強会
2012/8/30
On-Demand Test Suite Reduction
Dan Hao@Peking University
(株)NTTデータ 技術開発本部 朱峰 錦司
背景(1/2)

従来のテストケース削減手法は、コードカバ
レッジを一定に保てれば減らしてよい、という
ものが多い
チョシャ
裁判長!コードカバレッジを保っていて
も・・・バグ発見能力には疑いの余地が
あります!
13
ICSE'12 勉強会
2012/8/30
背景(2/2)

2つの既存手法を試してみると…
20%以上の確率で
バグ発見能力6割減
20%以上の確率で
バグ発見能力4割減
※元論文P.2から抜粋
14
ICSE'12 勉強会
2012/8/30
目的

バグ発見能力を一定に保ちながらテストケース
を削減する手法の提案
全てのテストケースの集合
以下を満たす最小のテストケースの集合
・バグ発見能力の低下は l% 以下
・(統計学に頼るので)信頼度は c%
テストケース削減によるバグ発見能
力低下の実績データをもとに、この
集合を線形計画法で発見する!
15
ICSE'12 勉強会
2012/8/30
手法概要(1/2)

実績データの作成


既存のソフトウェアをもとに、テストケースの削減と
バグ発見能力の低下との相関を分析
信頼度は90%,95%,99%の3パターンに決め打ち
テストケース数を4から2に
減らすと、99%の確率で
バグ発見能力は(最高で)
83.3%減少してしまう
※元論文P.4から抜粋
16
ICSE'12 勉強会
2012/8/30
手法概要(2/2)

線形計画法の適用

2種類のモデル式を提案

あるテストケースの部分集合において、q行目
のソースコードをカバーするケースがもともと
p_j個あった状態からq個に減少した際に…
local constraintsに基づく式
全ての行個別
で不等式が成
り立たたない
といけない

※元論文P.5から抜粋
global constraintsに基づく式
ソースコード
全体で成り立
てばよい

過去の実績では、テストケース
をp_j個からq個に減らすとこれ
ぐらい能力が落ちる
※元論文P.5から抜粋
モデル式の簡易化(省略)
17
ICSE'12 勉強会
2012/8/30
評価

3つのシナリオで手法を評価
対象
実績データ
適用対象
1
8つのCプログラム
1つのプログラ
ムの半分
プログラムの
残り半分
全てのプログラムにおいて、2つ
のモデル式の場合ともに、結果は
妥当であった
2
1つのJavaプログラ
ムの3リビジョン
前バージョン
後バージョン
バージョン番号が近いほうがより
結果は妥当であった
3
7つのCプログラム
6プログラム
残り1プログラ
ム
globalの場合のほうが削減効果は
大きいが、localの場合のほうがバ
グ発見能力が高い

結果
他手法との比較

18
テストケース削減効果は少ないが、バグ発見能力を維
持したい場合は非常に効果的
ICSE'12 勉強会
2012/8/30