大規模データセットと多種ミューテーション演算子を利用した欠陥限局に適するプログラム構造の再調査
久保 光生1

肥後 芳樹1

楠本 真二1

概要：プログラムに含まれる欠陥箇所を自動で推測する方法として，スペクトラムに基づく欠陥限局（SBFL）がある．SBFL では，各テストケースの成否と実行経路情報をもとに欠陥箇所を特定する．同じ機能を持つプログラムでも，その構造によって SBFL の欠陥限局精度には差が生じる．よって，プログラ
ム構造を SBFL に適する形に変更することで，機能を保ちつつ SBFL の精度向上が期待される．先行研究
では SBFL に適するプログラム構造を発見するために，SBFL スコアが提案された．SBFL スコアはプログラムが SBFL にどの程度適しているかを評価する指標の 1 つである．また，先行研究では，同じ機能を持つが構造の異なるプログラムペアを対象として SBFL スコアを計測し，SBFL に適したプログラム構造を得ている．しかし，実験対象のプログラム数が 10 個，ミューテーション演算子が 11 種類と少ないことが課題であった．そこで本研究では，実験対象のプログラム数を約 36 倍，ミューテーション演算子の種類
数を約 2.5 倍にして実験を行った．実験の結果，新たに SBFL に適したプログラム構造が 4 つ特定できた．

1. はじめに

コア計測の基本的なアイデアは，すべてのテストケースを通過するプログラムについて，ミューテーションテストを

ソフトウェア開発において，デバッグは多くの労力とコ用いて，様々な箇所に意図的に欠陥を発生させることであストを必要とする作業である．ソフトウェア開発に必要なる．これらの欠陥が SBFL によってどの程度正確に特定でコストのうち，半分以上をデバッグ作業が占めているとい

きたか計測することにより，元のプログラムの SBFL 適合

う報告もある [1]．そのため，デバッグを支援するための研性を評価できる．先行研究では同じ機能を持つが構造の異究が盛んに行われている．デバッグ支援に関する研究分野なる 5 組のプログラムペアを用いて SBFL スコアを計測の 1 つに欠陥限局がある．欠陥限局とは，プログラム中の欠することにより，SBFL に適するプログラム構造が調査さ陥箇所を推測する技術である．中でも近年，スペクトラムれた．しかし，計測対象のプログラム数が 10 個と少なく，に基づく欠陥限局 (Spectrum-Based Fault Localization, 以SBFL に適するプログラム構造が十分に明らかになったと

降 SBFL) に関する研究が盛んに行われている [2]．SBFL

はいえない．また，プログラムに意図的に欠陥を発生させでは，テストスイートに含まれる各テストケースがどの文るためのミューテーション演算子の種類数が 11 個と少なを実行し，どの文を実行しなかったかという情報を用いく，多くのプログラムで十分な数のミュータントを生成でて，プログラムの欠陥と疑われる箇所を自動的に特定する．

きない．この状況で測定された SBFL スコアは，SBFL 適

SBFL の基本的なアイデアは，多くの失敗テストで実行さ合性の評価指標として適切ではない．そこで本研究では，れる文ほど欠陥である可能性が高く，多くの成功テストで実験対象として 361 個のプログラムを用いて SBFL スコ

実行される文ほど欠陥である可能性が低いと判断すること

アを計測することにより，SBFL に適する新たなプログラ

である．

ム構造の発見を目指す．また，ミュータントの数を増加さ

SBFL の精度は，欠陥自体の性質やテストの内容など，せるために，16 種類の新たなミューテーション演算子を定様々な要因に左右される [3]．その中でも，佐々木らによ義する．これにより，合計で 27 種類のミューテーション

る先行研究 [4] は，プログラム構造に着目した．この先行演算子をプログラムに適用する．

研究では，プログラムがどの程度 SBFL に適するかを表す

ミューテーション演算子の追加の結果，約 98.6% の実

SBFL 適合性が提案されている．また，SBFL 適合性の評

験対象プログラムで，ミュータントの数の増加が確認でき価指標として，SBFL スコアが提案されている．SBFL ス

た．また，実験対象プログラムの SBFL スコアを計測し，その結果を目視で確認することにより，SBFL 適合性が高1

大阪大学大学院情報科学研究科 大阪府吹田市

いプログラム構造が新たに 4 つ特定できた．

susp

t1

t2

t3

t4

0.50
0.50
0.00
0.50
0.50
0.50

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓
✓

✓
✓

✓
✓

✓
✓

テスト結果：

P

P

P

F

プログラム (入力: a, b)

2. 準備
2.1 スペクトラムに基づく欠陥限局（SBFL）
デバッグを支援する技術の 1 つに，欠陥限局がある．欠陥限局とは，プログラム中の欠陥箇所を推測する技術である．
テストを用いた自動的な欠陥限局方法の 1 つに，スペクトラ
ムに基づく欠陥限局 (Spectrum-Based Fault Localization,

SBFL) がある．SBFL におけるスペクトラムとは，テスト
スイートの実行時にどの文が実行されたかという実行経路情報である．SBFL の基本的なアイデアは，多くの失敗テs 1 : boolean result = false;s 2 : if (0 < a)s 3 : result = true;! s 4 : if (0 <= b) //correct: 0 < bs 5 : result = true;s 6 : return result;(a)リファクタリング前
プログラム (入力: a, b)s' 2 : if (0 < a)s' 3 : return true;! s' 4 : if (0 <= b) //correct: 0 < bs' 5 : return true;s' 6 : return false;

ストで実行される文ほど欠陥である可能性が高く，多くの成功テストで実行される文ほど欠陥である可能性が低いとSBFL による欠陥箇所の特定方法について説明する．まず，すべてのテストケースを実行し，テストの成否と実行経路情報を記録する．次に，これらの情報を利用して，疑惑値と呼ばれる，欠陥である可能性の高さを示す値を文ごとに算出する．疑惑値の算出方法には様々あるが，Abreu らが

t1

t2

t3

t4

0.50
0.00

✓
✓

✓
✓

✓

✓

✓
✓

✓
✓

P

F

0.71
0.71
-

テスト結果：

PP(b)リファクタリング後テストケース

判断することである．

susp

t1:
t2:
t3:
t4:

入力 (a, b)(1, 1)(1, 0)(0, 1)(0, 0)

期待値
true
true
true
false

実際の値
true
true
true
true

(c) テストスイート

図 1: プログラム構造の違いにより SBFL 適合性が変化する例

SBFL で用いられる計算式の有効性を評価した結果，Ochiaiを実行すると，各文の疑惑値が算出される．プログラム (a)の計算式 [5] が最も優れていると結論づけている [6]．

では，欠陥がある文と同じ疑惑値を持つ文が 4 個存在する．

Ochiai の計算式における疑惑値 susp(s) の算出方法を式

一方，プログラム (b) では，欠陥がある文と同じ疑惑値を(1) に示す．ここで，f ail(s) は文 s を実行した失敗テスト

持つ文は 1 個である．欠陥がある文と同じ疑惑値を持つ文の数，pass(s) は文 s を実行した成功テストの数，totalF ailが少ないほど，確認しなくてはならない文が少なくなるたは失敗テストの総数である．

め，SBFL による欠陥限局の精度が高いといえる．よって，

f ail(s)susp(s) = √totalF ail × (f ail(s) + pass(s))

この場合，プログラム (b) の方が SBFL 適合性が高い．

(1)
2.3 SBFL スコア

susp(s) をすべての文 s に対して算出し，その値が高い

SBFL 適合性と同時に先行研究 [4] で提案された SBFL

文ほど，欠陥の原因箇所である可能性が高いと推測する．

スコアについて述べる．SBFL スコアは，SBFL 適合性の

なお，SBFL の疑惑値の算出においては，失敗テストの評価指標の 1 つとして提案された．SBFL スコアを計測す

実行経路情報が最も重要な要素となる．失敗テストでどのるための基本的なアイデアは，ミューテーションテスト [7]

ような文が実行され，どのような文が実行されなかったかの技術を活用し，与えられたプログラム中の可能な限り多が，欠陥の原因箇所に対する大きな手がかりとなるためでくの箇所に意図的に変更を加え，人工的な欠陥を生成するある．Ochiai の計算式では，分子が f ail(s) であることかことである．これらの人工的な欠陥を SBFL でどの程度正ら，失敗テストの実行経路情報の重要さが見て取れる．

確に特定できるか計測することにより，プログラム全体がどの程度 SBFL に適するかを測定できる．

2.2 SBFL 適合性

2.3.1 SBFL スコアの計測方法

先行研究 [4] で提案された SBFL 適合性について述べる．

先行研究 [4] で提案された，SBFL スコアの計測方法の

SBFL 適合性とは，プログラムが持つ品質特性の 1 つであ概要を示す．プログラム P の SBFL スコア計測時の入力

り，プログラム自体が SBFL にどの程度適しているかを表は以下の 2 つである．

す．プログラムの機能やテストスイートが同じでも，プログラム構造が異なれば SBFL を用いた欠陥限局の精度に違いが生じることがある．
プログラム構造の違いによる SBFL 適合性の変化につい• ミュータント生成器 G• テストスイート T
計測の大まかな流れを図 2 に示す．SBFL スコアの計測は以下の 3 つのステップで構成される．

て，例を用いて説明する．図 1 に示すプログラム (a) とプ(1) プログラムに対してミュータントを生成

ログラム (b) は，機能が同じだが，構造が異なる．図 1 に示

(2) ミュータントに対して SBFL を実行

すテストスイート (c) を用いて両方のプログラムに SBFL

𝑴𝑮 (𝑷)
𝑚! ...

𝑚"rScoreT (s) = 1 −rank T (s) − 1
totalStatementsT − 1(2)

また，ミュータント m に含まれる欠陥の疑惑値の正規𝑃化順位を rScoreT (m) と定義する．各ミュータントに含ま

𝐺

SBFL

れる欠陥は 1 箇所であるため，この値はミュータントごと

𝑟𝑆𝑐𝑜𝑟𝑒 $ 𝑚%𝑟𝑆𝑐𝑜𝑟𝑒 $ (𝑚

𝑇

&)

SBFL

に一意である．ミュータント m の欠陥を含む文を sm
f aultとすると，rScoreT (m) は文 sm
f ault の疑惑値の正規化順位である．ミュータントの rScore が高いほど，欠陥箇所を正確に特定できることを意味する．

𝑺𝑩𝑭𝑳𝑺𝒄𝒐𝒓𝒆𝑻,𝑮 (𝑷)
図 2: SBFL スコアの計測方法の概要(3) SBFL スコアを算出
以降では，各ステップの詳細を述べる．

Step1. プログラムに対してミュータントを生成
対象プログラムとテストスイートを用意する．プログラ
ムはテストスイート T に含まれるすべてのテストケース

rScoreT (m) = rScoreT (smf ault )Step3. SBFL スコアを算出
対象プログラムから生成されたすべてのミュータントのrScore の平均をとることにより，SBFL スコアが算出される．なお，|M G (P )| は，生成されたミュータントの総数を表す．

に通過することを前提とする．このプログラムに対して，
ミュータント生成器を用いてミュータントを生成する．こSBF LScoreT,G (P ) =1|M G (P )|のとき，各ミュータントは元のプログラムに対して 1 箇所だけが変更されるように生成する．プログラムには変更可
能な箇所が複数存在するため，ミュータントは複数生成される．ミュータント生成器 G によって生成されたすべてのミュータントの集合を M G (P ) と定義する．

Step2. ミュータントに対して SBFL を実行
M G (P ) に含まれる各ミュータントに対して，テストス
イート T を用いて SBFL を実行し，文ごとの疑惑値を算出する．ここで，あるミュータント m ∈ M G (P ) に含まれる各文 s について，以下を定義する．

• suspT (s) : 文 s の疑惑値
• rank T (s) : 文 s の疑惑値の順位∑

rScoreT (m)m∈M G (P )2.4 SBFL スコアの信頼性
本研究では，SBFL スコアについて，信頼性という性質を新たを設ける．SBFL スコアの信頼性とは，SBFL スコ
アが元のプログラムの SBFL 適合性をどれほど正確に示しているかを表す性質である．SBFL 適合性は，プログラ
ム中のあらゆる箇所の欠陥が SBFL でどの程度検出しやすいかを表すため，SBFL スコアを測定する際には，プロ
グラム中のできるだけ多くの箇所に欠陥を生成することが必要である．生成されたミュータントの個数が多いほど，

SBFL スコアが元のプログラムの SBFL 適合性を正確に表すため，SBFL スコアの信頼性は高まる．よって，SBFL• rScoreT (s) : 文 s の疑惑値の正規化順位

スコアの信頼性は，プログラムから生成されたミュータン

疑惑値の算出には Ochiai の計算式を用いる．疑惑値のトの個数から類推することができる．

順位は，疑惑値の高い順に文を並べた際に，欠陥が存在する文を発見するまでに最大で確認しなければならない文の総数とする．例えば，疑惑値 1.0 の文が 2 つ，0.8 の文が 1つ存在する場合は，疑惑値 1.0 の文はどちらも 2 位と扱い，
疑惑値 0.8 の文は 3 位とする．疑惑値の順位は，文の総数
により異なる価値を持つ．例えば，10 個の文のうちの 10
位と，100 個の文のうちの 10 位とでは，後者の方が順位としての価値が高い．そこで，各文が文全体の中でどの程度上位に位置するかを表すため，順位を 0 以上 1 以下の範囲
で線形に正規化する．文 s の正規化順位 rScoreT (s) を以下の式 (2) の通り算出する．1 が最も価値が高く，0 が最も価値が低いことを表す．(2) において，totalStatementsTはテストスイート T によって実行される文の数である．

2.5 先行研究の調査方法
先行研究 [4] では，Java で実装されたプログラムを対象として，プログラム構造の違いにより SBFL スコアがどのように変化するか確認するための実験が行われた．

2.5.1 実験対象プログラムとテストスイート
先行研究 [4] では，単一のメソッドで構成されるプログ
ラムに対して SBFL スコアを計測する実験が行われた．実験対象は，同じ入力が与えられると同じ出力を返すが，プ
ログラム構造が異なる 5 種類のメソッドペアである．なお，「プログラム構造」の正確な意味は 3.1 節で述べる．

5 種類のメソッドペアは，佐々木らによってリファクタ
リングを題材として作成された．リファクタリングには多くのパターンが存在するが，Fowler によって「条件記述1

int result = 0;の単純化」に分類されたリファクタリングパターン [8] の2

if ( x > 0)中から選定された単一のメソッド内で完結する 5 種類のリ

3

result = -10;

ファクタリングが題材となった．

4

else if ( y > 0)1

5result = -20;

2

また，各メソッドのテストスイートは佐々木らによって，以下を満たすように作成された．

• すべてのミュータントはいずれかのテストケースに失

6

3

else

7

result = -30;

48return result ;

5

敗する．

if ( x > 0)
return -10;
if ( y > 0)
return -20;
return -30;(a) 変換前• 条件網羅率が 100% になる．

(b) 変換後

図 3: SBFL 適合性を高めるために return 文を用いてメソッド

2.5.2 ミュータント生成器

を早期終了する例

先行研究 [4] では，表 1 に示す 11 種類のミューテーション演算子が用いられた．これらは，オープンソースのミュー

1

int result = 0;

テーションテストツールである PIT [9] の基本ミューテー

1

int result = 0;2

int tmp = 0;

ション演算子を参考に実装された．PIT は，ミューテー

2

int tmp = 0;

3

if ( x > 0)

ションテストの分野でミュータントの生成に広く用いられ3if ( x > 0)

4ている [10]．

45

2.6 先行研究の調査結果
先行研究 [4] での調査の結果，同一の条件分岐先で実行

tmp = y * 2;

換方法として，以下の 2 つが得られている．

• return 文を用いてメソッドを早期終了させる（図 3）• 同一の条件分岐先の文の数が多い方から少ない方へ文を移動する（図 4）

6

else

6

tmp = y * 3;77result = y + tmp ;88return result ;9

される文が少ないほど SBFL 適合性が高いことが明らかになった．また，SBFL 適合性を高めるプログラム構造の変

5(a) 変換前

tmp = y * 2;
result = y + tmp ;else
tmp = y * 3;
result = y + tmp ;return result ;(b) 変換後

図 4: SBFL 適合性を高めるために文を移動させる例

一般化可能性に欠ける．また，SBFL スコアが高くなるプ
ログラム構造を十分に調査しきれていない．
この問題の解決のために，本研究では，Java で実装された同機能メソッドを含むデータセット [11] を用いる．本3. 先行研究の課題とその解決策

データセットは，単一のメソッドからなるプログラムとテ

先行研究 [4] には，以下の 2 つの課題が存在する．

ストスイートをそれぞれ 728 個ずつ含む．これらはオープ• 実験対象プログラム数が少ない．

ンソースソフトウェアから収集された．また，メソッドは• ミューテーション演算子の種類数が少ない．

機能によって 276 組のグループに分類されている．各グ

以下では，課題の詳細と，その解決策について述べる．

ループは，同機能メソッドを 2 個から 12 個含む．各メソッドのテストスイートは Evosuite [12] によって自動生成さ3.1 実験対象プログラム数が少ない

れた．

先行研究の実験対象プログラムは 5 組のメソッドペアになお，本研究で用いるデータセットの中には，記述方法含まれる 10 個のメソッドであった．よって，調査結果のは異なるが，同一のテストスイートを実行した際の実行経路が同じになるメソッドペアが含まれる可能性がある．
「実

表 1: 先行研究で用いられたミューテーション演算子

行経路が同じ」とは，2 つのメソッドが以下の 3 つの条件

ミューテーション演算子 変換前

変換後を満たすことを指す．ここで，si は 1 つ目のメソッドの i

Conditional Boundary

a<b

a<=b

Increments

n++

n–-

番目の文を，s′i は 2 つ目のメソッドの i 番目の文を表す．

Invert Negatives

-n

n

Math

a+b

a-b

Negate Conditionals

a==b

a!=b

Void Method Calls

method();;Primitive Returns

return 5;

return 0;

いて，1 ≤ i ≤ m について，文 si における実行の有無

Empty Returns

return "str";

return "";False Returns

return true;

return false;

が，文 s′i における実行の有無と等しい．

True Returns

return false;

return true;

Null Returns

return object; return null;• メソッドに含まれる文の総数が同じである．
• テストスイートに含まれるすべてのテストケースにおいて，実行される文の総数 m が同じである．

• テストスイートに含まれるすべてのテストケースにお実行経路が異なるメソッドペアの例を図 5 に，実行経路が同じであるメソッドペアの例を図 6 に示す．2 つのメ

プログラム (入力: a) t 1
s 1 : if (a == 0)✓s2 :return 0;s 3 : else if (a > 0) ✓s4 :✓return 1;
s 5 : return -1;

t2

t3

✓

✓
✓

✓
✓

(a)

✓

プログラム (入力: a) t 1
s' 1 : if (a > 0)✓s' 2 :✓
return 1;
s' 3 : else if (a < 0)s' 4 :
return -1;
s' 5 : return 0;

t2

t3

✓

✓

✓

✓

✓
✓

(b)

図 5: 実行経路が異なるメソッドペア

s 1 : if (a > 0)
✓ ✓ ✓
s2 :
✓
return 1;
s 3 : if (b < 0 && a != 0)
✓ ✓
s4 :
✓
return -1;✓
s 5 : return 0;

プログラム (入力: a,b)
t1 t2 t3
s' 1 : if (a > 0)✓ ✓ ✓s' 2 :✓
return 1;
s' 3 : else if (a < 0 && b < 0)
✓ ✓s' 4 :✓
return -1;
else✓
s' 5 :
return 0;

(a)

(b)

プログラム (入力: a,b)

t1 t2 t3の増加数を記録する．このとき，プログラムの規模を考慮する必要がある．なぜなら，プログラムの規模が大きくなると，ミュータントの個数は増加する傾向にあるからである．プログラムの規模に対するミュータントの増加数を評価するための指標として，IMPL (Increased Mutants Per

LOC) を求める．IMPL は式 (3) で定義される．なお，論理 LOC とは，プログラムのうち，空行や括弧のみの行，コ
メントのみの行を除いた行数を指す．IMPL の値が大きい
ほど，SBFL スコアの信頼性が高まったことを表す．

IM P L =図 6: 実行経路が同じであるメソッドペア

ソッドの実行経路が同じになる場合，適用されるミュー
テーション演算子の違いのみによって，SBFL スコアに差が生じてしまう．このようなメソッドは実験対象として適

ミュータントの増加数
論理 LOC(3)

4. 実験
実験では，どのようなプログラム構造が SBFL に適するか明らかにする．

切でないと考えたため，実験対象から除外する必要がある．
よって，本研究では，プログラム構造を「同一のテストス

4.1 実験対象プログラムとテストスイート

イートを実行した際の実行経路」と定義する．記述方法が実験対象プログラムは，3.1 節で示したデータセットに含異なっても，同一のテストスイートを実行した際の実行経

まれる 728 個のメソッドのうち，以下の 4 つの条件を満た

路が同じ場合には，プログラム構造は同じであるとみなす．

す 131 組のグループに含まれる 361 個のメソッドである．

3.2 ミューテーション演算子の種類数が少ない
先行研究で使用されたミューテーション演算子は 11 種類であった．先行研究で実験対象となったプログラムは，
これらのミューテーション演算子が多くの箇所に適用でき
るように実装されたため，十分な量のミュータントが生成できていた．しかし，それ以外のプログラムを用いる場合，十分な量のミュータントを生成できない場合がある．この状態で計測された SBFL スコアは，プログラムの SBFL 適
合性を正確に表さないため，信頼性が低い．
この問題の解決のために，本研究では実験対象プログ

条件 1： グループ内のメソッドが同機能である．
条件 2： グループ内のメソッドをテストスイートに通したときの命令網羅率と条件網羅率が 100% になる．
条件 3： グループ内のメソッド間で，プログラム構造が互いに異なる．
条件 4： グループ内のメソッド中に switch 文を含まない．
表 2: 本研究で新たに用いるミューテーション演算子
ミューテーション演算子 変換前

変換後

Change String Literal"String""String1"

Change Instanceof

a instanceof A a instanceof B

ミューテーション演算子として，新たに表 2 に示す 16 種類

Nonvoid Method Calls

a=method()

a=nullのミューテーション演算子を実装した*1 ．なお，新たに追Constructor Calls

a=new A()

a=null加したミューテーション演算子は，既存のミューテーショ

Compound Operator

a+=1

a-=1

ン演算子と同じミュータントを生成する可能性がある．例

Change Numeric Literal if(x<0)

ラムを目視し，既存のミューテーション演算子が適用不可能である箇所を抽出した．抽出した箇所に適用可能な

if(x<1)

Change Boolean Literal true

false

Change Boolean Literal と，True Return が同じミュータン

Change Unary Operator !ismethod()

ismethod()

Add Not Operator

if(b)if(!b)

トを生成する．よって，同じミュータントは複数生成されMore Speciﬁc If

if(a&&b)

if(a), if(b),Less Speciﬁc If

if(a||b)

Break and Continue

break;

continue;
Object o1=null;

えば，プログラムに return false; という文がある場合，ないようにミュータント生成器を実装した．
また，SBFL スコアの信頼性の向上を検証するために，

if(a||b)if(a&&b)

ミューテーション演算子の追加前と追加後のそれぞれについて，実験対象プログラムから生成されたミュータント
*1「変換後」のコードがカンマ (,) で区切られている場合，そのミューテーション演算子が複数のミュータントを生成することを表す．

if(a), if(b),Null Assignment

Object o1=o2;

Empty Assignment

s=a.toString(); s="";Primitive Assignment

int a=b;

int a=0;

Throw Exception

throw new A;

throw new B;

条件 2 から条件 4 を設定した理由を以下に示す．

60

条件 2

50

100%の命令網羅率は，対象プログラムのすべての文か40

ら疑惑値を得るために必要である．100%の条件網羅率は，

30

様々な実行経路を持つテストケースを適用することで，各20プログラム文の疑惑値をできるだけ異なる値にするために必要である．

10

条件 3

0 ≤ (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ] (, ]
0
1
2
3
4
5
6
IMPL

本研究の目的はどのようなプログラム構造が SBFL に適

図 7: 各メソッドの IMPL の分布

するかを調査することであるため，プログラム構造が同じ
複数のメソッドを実験対象とする必要がないためである．
条件 4
メソッド中に switch 文が存在すると，正しく実行経路を取得できないためである．
条件の確認は以下の 2 つのステップで構成される．

(1) テストスイートを手動で修正(2) 条件を満たさないメソッドを除外
以下，これらの手順の詳細を述べる．

Step1. テストスイートを手動で修正
各メソッドのテストスイートは Evosuite [12] によって自動生成された．自動生成されたテストスイートでは，条件網羅率が 100% にならない場合がある．よって，テスト
スイートを手動で修正し，条件網羅率が 100% になるようにした．

Step2. 条件を満たさないメソッドを除外
メソッドを目視で確認し，switch 文が含まれるメソッドを除外した．また，すべてのメソッドをテストスイートに通し，各メソッドが条件 1 から条件 3 を満たすかどうか確認した．その結果，合計で 145 組のグループと 367 個のメソッドが実験対象から除外された．

報はファイルに保存され，計測後に確認できる．
また，計測ツール内のミュータント生成器に，2.5.2 節で示した 11 種類のミューテーション演算子と，3.2 節で示した 16 種類のミューテーション演算子を実装した．さらに，使用する演算子を切り替えられるようにした．これにより，演算子の追加前後におけるミュータント数の変化を記録できる．

Step B. SBFL スコアに差がないグループを考察対象から除外
プログラム構造が異なっても，SBFL スコアが同じになる場合が考えられる．SBFL スコアに差がないグループは，

SBFL スコアが高くなる要因を考察するためには不必要であるため，Step C. の対象から除外する．

Step C. SBFL スコアが高くなる要因を分類し，その理由を考察
各グループに含まれるすべてのメソッドを目視し，グループをプログラム構造の差（要因）ごとに分類する．分
類したそれぞれの要因について，統計的手法を用いて要因
によって生じた SBFL スコアの差が有意であるかを検定する．また，メソッド間で SBFL スコアや実行経路情報を比4.2 実験方法
実験は以下の 3 つのステップで構成される．

(A) 実験対象プログラムの SBFL スコアを計測

較することにより，各要因によって SBFL スコアが高くなる理由を考察する．

5. 実験結果と考察(B) SBFL スコアに差がないグループを考察対象から除外(C) SBFL スコアが高くなる要因を分類し，その理由を考察
以下では，これらの詳細を述べる．

Step A. 実験対象プログラムの SBFL スコアを計測
すべての実験対象プログラムについて，計測ツールを用いて SBFL スコアを計測する．計測ツールは SBFL スコアを

5.1 先行研究からの改善点の評価
ミュータントの増加数
各メソッドについて IMPL を計測した結果を図 7 に示す．IMPL が 0 より大きいメソッドは 361 個中 355 個であった．よって，ほとんどのメソッドにおいて，SBFL ス
コアの信頼性は向上したといえる．
考察対象プログラムの増加数計測するために，自動欠陥修正ツールである kGenProg [13]

実験対象である 131 組のグループのうち，119 組のグを用いて実行経路情報を取得する．kGenProg はプラグイ

ループで，グループ内のプログラムの SBFL スコアに差がンとして JaCoCo*2 を呼び出し，実行経路情報を得ている．

見られた．よって，考察対象プログラム数は先行研究から各ミュータントに対して SBFL を実行した際の実行経路情大幅に増加したといえる．

SBFL スコアに変化がないグループは 12 組存在した．
*2

https://www.jacoco.org/jacoco/

変化が生じない理由は，以下の 2 つのいずれかであった．

0.00

0.25

0.50
0.75
SBFLScore

yes
no

1.00

0.4

0.5
0.6
0.7
SBFLScore

yes

yes
no

0.8

A

no

0.014

no

condition

yes

0.0058yesnoCondition

condition

yes

Condition

no0.00032

Condition

condition

0.5

0.6

0.7
0.8
SBFLScore

B

0.9
C

(a) 三項演算子や Stream API 用いた文の (b) early return のための if 文を追加して (c) if 文の条件式に論理演算子を用いず，別いる
nocondition

yes

no
0.00

0.25

0.50
SBFLScore

no

yes
no

0.75

0.00

0.25

0.50
0.75
SBFLScoreD(d) 最初の文で例外が発生しない

yes

7.8e-11yes
0.12

Condition

conditionの文に分けている

Condition

代わりに制御文を導入している

1.00
E(e) 同一の条件分岐先で実行される文が少ない

図 8: 各要因の有無による SBFL スコアの差の分布• グループ内のいずれのメソッドにも分岐が全く存在しない．

岐先で実行される文が少ない」に当てはまるグループも存在した．

• グループ内のメソッドのプログラム構造の違いが，if

さらに，ミューテーションの違いによって SBFL スコア

文に含まれるの複数の条件の出現順序だけである．

に差が生じていると考えられるグループも存在した．SBFL
スコアが高くなる要因と，それに当てはまるグループの数を表 3 に示す．

5.2 SBFL スコアが高くなる要因
SBFL スコアが高くなる要因として，新たに以下の 4 つが特定できた．

5.3 SBFL スコアの差の有意性• 三項演算子や Stream API を用いた文の代わりに制御文を導入している

新たに発見した 4 つの要因と，先行研究によって発見された 1 つの要因を合わせた 5 つの各要因について，要因の• early return [14] のための if 文を追加している有無による SBFL スコアの差の分布を図 8 に示す．また，• if 文の条件式に論理演算子を用いず，別の文に分けてSBFL スコアの差の有意性を確認するために，ウィルコクいる

ソンの符号順位検定を用いて p 値を算出した．図 8 から分• 最初の文で例外が発生しない

かる通り，サンプル数が少ない「最初の文で例外が発生しまた，先行研究で発見された要因である「同一の条件分ない」以外の要因については，要因の有無による SBFL ス
コアの差が有意である (p<0.05) ことが確認できた．

表 3: SBFL スコアが高くなる要因とグループ数
要因

グループ数

5.4 SBFL スコアが高くなる理由
以下では，新たに発見した SBFL スコアが高くなる各要

三項演算子や Stream API 用いた文の代わりに制御文を導入している17

early return のための if 文を追加している

10

因について，なぜ SBFL スコアが高くなるかを具体例を用いて説明する．
三項演算子や Stream API を用いた文の代わりに制御文

if 文の条件式に論理演算子を用いず，を導入している

別の文に分けている

8

最初の文で例外が発生しない

4

図 9 のメソッド (b) には，if 文が用いられている．よっ56て，テストスイートを実行した際の実行経路に差が生じる

同一の条件分岐先で実行される文が少ない

ため，SBFL スコアが 0 よりも大きくなる．一方，メソッ

ミューテーションの違いによって

SBFL スコアに差が生じている

9

ド (a) には，三項演算子が用いられており，制御文が存在不明

15

しない．制御文がメソッド中にない場合，各文の疑惑値に

1
2
3
1

return a > b ? 1 : 0;

4

1

if (a > b )return 1;1

else
return 0;

if ( i < s || i > e )2(a)return -1;

3else if ( i > e )4

return -1;

3

5

return 0;

if ( i < s )2

return -1;
return 0;(b)(a)

図 9: if 文や for 文の有無を示すメソッドペア(b)

図 11: 論理演算子の有無を示すメソッドペア
1
2

if ( l < 1)
return 0;

1

int s = 0;

3

int s = 0;2

for ( int i =0; i < l ; i4for ( int i =0; i < l ; i

++)
3
4

1

String target ( String s , Object ... args ) {2StringBuilder b = new StringBuilder ( s .
length () + 16 * args . length ); // s =nullで例外発生++)

s += p [ i ];return s ;56s += p [ i ];return s ;

3
4
5

(a)

int templateStart = 0;
...
}

(b)
(a)

図 10: if 文による early return の有無を示すメソッドペア

差が生じないため，各ミュータントの rScore が 0 になり，

SBFL スコアも 0 になる．よって，三項演算子や Stream

1

String target ( String s , Object ... args ) {2

s = String . valueOf ( s );3

StringBuilder b = new StringBuilder ( s .

API を用いた文の代わりに制御文を用いることで，SBFL

length () + 16 * args . length ); // s =スコアは向上する．

nullで例外発生

また，すでに制御文が存在するメソッドでも，三項演算

4子や Stream API を用いた文が存在する場合，それを制御

5文を用いて書き換えると SBFL スコアが向上する．

early return のための if 文を追加しているメソッドの入力によっては，長い処理を行う前に出力が6

int templateStart = 0;
...
}
(b)

図 12: 例外発生位置の違いを示すメソッドペア

分かる場合がある．例えば，図 10 のメソッド (a) では，配列の内容の処理に for 文が用いられている．一方，メソッ

る．成功テストで多く実行される文の疑惑値は低下するた

ド (b) では if 文を追加することにより，配列の長さが 0

め，欠陥がない他の文の疑惑値の順位が上昇する．その結である場合には for 文による処理を行わずに 0 を返す．

果，rScore が低下し，SBFL スコアも低下する．反対に，

if 文による early return を追加することにより，一部の条件式を別の if 文に分けると，SBFL スコアは向上する．

成功テストの実行経路が新たに追加した if 文に移動する．

最初の文で例外が発生しない

これにより，その後に続く文に欠陥がある場合に，その文本研究で用いた SBFL スコア測定ツールは，例外が発生を実行する成功テストの数が減少する．よって，欠陥があした場合には，発生の原因となった文は実行されていないる文の疑惑値が上昇するため，SBFL スコアが向上する．

と判定する．これにより，SBFL スコアに影響が及ぶ場合

また，同様のことが例外発生にもいえる．例えば配列がある．例として，図 12 に示す 2 つのメソッドを用いての添字として配列の長さ以上の値を与える場合のように，説明する．図 12 のメソッド (a) では，入力として s=null

例外発生の条件が前もって分かる場合がある．その際に，が与えられた場合には 2 行目で例外が発生する．よって，

early return と同様の方法で throw 文を追加することで，例外発生を期待するテストケースを実行した際に，メソッ

SBFL スコアが向上する．

ド中のどの文も実行されていないと判定される．しかし，if 文の条件式に論理演算子を用いず，別の文に分けている

メソッド (b) では，入力として s=null が与えられた場合

図 11 のメソッド (a) では，条件式を論理 OR 演算子 (||)

には 3 行目で例外が発生する．よって，例外発生を期待す

でつなぎ，1 つの if 文を用いている．一方，メソッド (b)るテストケースを実行した際に，2 行目までが実行されたでは，条件式を分け，2 つの if 文を用いている．

と判定される．3 行目以降に欠陥がある場合，s=null を

条件式を論理 OR 演算子でつないだ場合，片方の条件式

与えると必ず 3 行目で例外が発生する．この場合，例外をに欠陥がある場合でも，もう片方の条件式が正しい場合，期待するテストケースは成功テストになる．成功テストに

その条件式をチェックするテストケースは成功テストとなより，実行された文の疑惑値が下がり，相対的に欠陥がある．よって，条件式を含む文が成功テストで多く実行される文の順位が向上する場合がある．これにより，最初の文

で例外が発生しないメソッド (b) の SBFL スコアが向上
する．

6. 本研究の妥当性について留意する点
SBFL スコアの信頼性は，プログラム中で欠陥が生成できた箇所の多さによって決まる．よって，SBFL スコアの

謝 辞

JP22K11985）の助成を得て行われた．
参考文献
[1]

信頼性を測定するためには，ミュータントの数ではなく，
ミューテーションを行った箇所がプログラム全体に分布し[2]ているかを見るほうが適切である．

SBFL の粒度としては，ステートメント単位以外にもブ
ロック単位などが存在する [15]．本研究ではステートメン[3]

ト単位での SBFL を用いたが，他の粒度を用いた場合には実験結果が変化する可能性がある．

SBFL スコアの計測結果は，テストスイート及びミュー[4]タント生成器に影響を受ける．よって，異なるテストス
イート及びミュータント生成器を使用すると，SBFL スコ[5]

アの値が変化し，異なる結果が現れる可能性がある．
また，本研究とは異なるプログラムを実験対象とすると，今回の実験で得られた結果を否定する事例が現れる可能性

[6]

がある．
本研究で用いた実行経路情報の取得ツールである JaCoCo
は，例外発生の原因である文は実行されていないと判断す[7]

る．実行経路情報の取得に別のプログラムを用いると，例
外発生の原因である文が実行されたと判断され，実験結果[8]が否定される可能性がある．
[9]

7. おわりに本研究では，先行研究 [4] の課題であるミューテーション
演算子の種類の少なさと実験対象プログラム数の少なさを[10]解決した．また，SBFL スコアの計測実験を行い，SBFL 適
合性が高いプログラム構造を調査した．調査の結果，新たに 4 つの SBFL 適合性が高いプログラム構造が得られた．

[11]

今後の課題としては，以下の 2 つが挙げられる．
自動変換ツールの作成
先行研究 [4] と本研究によって，SBFL 適合性が高いプ[12]ログラム構造が複数得られた．よって，SBFL 適合性を高めるようにプログラムを自動変換するツールを作成するこ[13]とが可能であると考えられる．また，作成したツールを用いて，すでに欠陥が存在するプログラムを変換して SBFLを用いた欠陥限局の精度が向上するかを確かめる実験を行う．

SBFL 適合性と他の品質特性との関連性調査[14]

SBFL 適合性が高くなる一方で，保守性が低下する場合がある．実際に，5.4 節で示したプログラムには，SBFL 適
合性が高いプログラムにコードクローンが存在する．よって，SBFL 適合性と，保守性などの他の品質特性との関連性を調査することは重要な課題である．

本 研 究 は JSPS 科 研 費（JP20H04166，

JP21K18302，JP21K11829，JP21H04877，JP22H03567，[15]

Hailpern, B. and Santhanam, P.: Software Debugging, Testing, and Veriﬁcation, IBM Systems Journal,
Vol. 41, No. 1, pp. 4–12 (2002).
Wong, W. E., Gao, R., Li, Y., Abreu, R. and Wotawa,
F.: A Survey on Software Fault Localization, IEEE
Transactions on Software Engineering, Vol. 42, No. 8,
pp. 707–740 (2016).
Ali, S., Andrews, J. H., Dhandapani, T. and Wang, W.:
Evaluating the Accuracy of Fault Localization Techniques, Proc. International Conference on AutomatedSoftware Engineering, pp. 76–87 (2009).
佐々木唯，肥後芳樹，柗本真佑，楠本真二： プログラムに対する欠陥限局の適合性計測，情報処理学会論文誌，Vol. 62, No. 4, pp. 1029–1038 (2021).
Abreu, R., Zoeteweij, P. and Van Gemund, A. J.: An
Evaluation of Similarity Coeﬃcients for Software Fault
Localization, Proc. Paciﬁc Rim International Symposium on Dependable Computing, pp. 39–46 (2006).
Abreu, R., Zoeteweij, P., Golsteijn, R. and vanGemund, A. J. C.: A Practical Evaluation of Spectrumbased Fault Localization, Journal of Systems and Software, Vol. 82, No. 11, pp. 1780–1792 (2009).
Jia, Y. and Harman, M.: An Analysis and Survey of theDevelopment of Mutation Testing, IEEE TSE, Vol. 37,
No. 5, pp. 649–678 (2011).
Martin, F.: Refactoring: Improving the Design of Existing Code, Addison-Wesley (1999).
Coles, H., Laurent, T., Henard, C., Papadakis, M. and
Ventresque, A.: PIT: A Practical Mutation Testing
Tool for Java (Demo), Proc. International Symposium
on Software Testing and Analysis, pp. 449–452 (2016).
Xuan, J. and Monperrus, M.: Test case puriﬁcation forimproving fault localization, Proc. International Symposium on Foundations of Software Engineering, pp.
52–63 (2014).
Higo, Y., Matsumoto, S., Kusumoto, S. and Yasuda,
K.: Constructing Dataset of Functionally EquivalentJava Methods, Proc. the International Conference on
Mining Software Repositories, pp. 682–686 (2022).
Fraser, G. and Arcuri, A.: EvoSuite: automatic test
suite generation for object-oriented software, Proc.
Symposium and the European Conference on Foundations of Software Engineering, pp. 416–419 (2011).
Higo, Y., Matsumoto, S., Arima, R., Tanikado, A.,
Naitou, K., Matsumoto, J., Tomida, Y. and Kusumoto,S.: kGenProg: A High-performance, High-extensibilityand High-portability APR System, Proc. the AsiaPaciﬁc Software Engineering Conference, pp. 697–698(2018).
Saca, M. A.: Refactoring improving the design of existing code, Proc. IEEE Central America and Panama
Convention, pp. 1–3 (2017).
Sarhan, Q. I. and Beszédes, c.: A Survey of Challenges
in Spectrum-Based Software Fault Localization, IEEE
Access, Vol. 10, pp. 10618–10639 (2022).