日本ソフトウェア科学会第 38 回大会 (2021 年度) 講演論文集

ソフトウェアテストを評価するためのバグ入りアプリケーションの自動生成
安積 直道

丹野 治門

岩崎 英哉

アプリケーションにバグが含まれているかを確認するには，テストスイートという入力を与え，期待した動作を行うかを確認するソフトウェアテストを行う必要がある．テストスイートのバグ検出能力の評価手法として，アプリケーションに意図的にバグを埋め込みテストスイートを入力として実行し，どれほどのバグを検出できるかを測定する
ミューテーション解析がある．これを実用的に行うためには，適切なアプリケーションの選定や適切なバグの含まれるベンチマークの作成など様々な課題がある．本論文では, あらかじめ用意されたアプリケーションの構成要素を組み合わせて，バグ入りアプリケーションを自動的に生成するツールを設計し実装した．さらに，現実的に存在しえないような不自然な処理を行うアプリケーションの生成を防ぐため，メソッドの引数と戻り値の型の性質による制約と，処理順に関する制約を指定可能にした．その結果，不自然な処理を行うアプリケーションの生成を防ぐことができた．

Recently there are various applications everywhere. In order to check bugs in developed applications,
we need to give test inputs called test suites to the applications. There is a method called mutation analysis to measure a bug detection capability of test suites. It measures how many bugs can be detected byintentionally embedding bugs in the application and executing them using test suites. It has some problems
such as selecting an appropriate application and creating a benchmark that contains appropriate bugs. In
this paper, we present a tool that automatically generates buggy applications in Java. In the tool, we canspecify two kinds of constraints to avoid unnatural applications. The first is a constraint about propertiesof method arguments and return values in the application. The second is a constraint that specifies how
to connect methods. By specifying suitable constraints, the tool can generate various buggy applications ofhigh quality.

ケーションが開発されている．しかし, 実際に信頼性

1 はじめにの高いアプリケーションを開発することは容易ではな

近年, コンピュータやスマートフォンなどの電子機い．その理由のひとつは，多くの場合アプリケーショ器から，鉄道システムや市役所及び図書館システムなンにはバグが混入してしまい，それらを発見して修正どの公共の機関まで，至るところで様々なアプリケーする作業には多大な労力が必要であるためである．

ションが利用されている．また, 世の中をより便利に一般的に, アプリケーションのバグを検出するには，するために，現在も多くの企業によって多様なアプリそのアプリケーションにテストとなる入力を与え，開発者が期待した動作を行うかどうかを確認する必要

Automatic generation of buggy applications for evaluating software tests.
Naomichi Asaka, 電気通信大学大学院情報理工学研究科,Dept. of Information and Computer Science, The
University of Electro-Communications.
Haruto Tanno, 日本電信電話株式会社 ソフトウェアイノ
ベーションセンタ, Dept. Software Innovation Center,Nippon Telegraph and Telephone Corporation.
Hideya Iwasali, 電気通信大学大学院情報理工学研究科,
Dept. of Information and Computer Science, The
University of Electro-Communications.

がある．これをソフトウェアテスト [8] と言う．また，このテスト入力の集合をテストスイートと呼ぶ．ソフトウェアテストにおいて，テストスイートがバグを検出する十分な能力を持つかを評価する方法として，
ミューテーション解析 [4] [9] という手法が広く知られている．
ミューテーション解析では，開発されたアプリケーションに意図的にバグを埋め込み，テストスイートを入力として与えてそのアプリケーションを実行した際いてテスト行う手法である．それに対して，探索的テに，どれほどのバグを検出できるかを測定すること

ストとは事前にテストケースを用意せず，それまでので，テストスイートのバグ検出能力を評価する．しかテスト実行の結果などをもとに動的にテストケースし，実用的なミューテーション解析を行うためには，を作成する手法である．これらの手法を比較実験 [1]適切なアプリケーションを選定し，そのアプリケーする場合，各テストのバグ検出能力は重要な指標のションに対してミューテーション解析ツールを適用し1 つであり，これを計測するためにはバグ入りアプリて，適切なバグが含まれるベンチマークを作成する必ケーションが必要となる．

要がある．これらは，多大な労力を必要とする．

2. 1. 3 ケース 3

本論文では，あらかじめ用意されたアプリケーショ

デバッグ手法 [10] を比較する場合には、各手法にンの構成要素を組み合わせて，ソフトウェアテストをおいてどれほどのバグを特定できるかを測定するた評価するためのバグ入りアプリケーションを自動的にめにバグ入りアプリケーションが必要となる．

生成するツールを設計し実装した．そして，このツールを用いて，テストスイートのバグ検出能力測定用

2. 2 既存のバグ入りアプリケーション生成方法の，様々なバリエーションのバグ入りアプリケーショ

バグ入りアプリケーションを生成する既存の方法にンを自動生成した．また，その際に現実的に存在しえは，主に以下の 2 つがある．

ないような不自然なアプリケーションの生成を防ぐた

1 つ目は，現実的なバグが含まれるアプリケーショめ，型の性質に関する制約と操作順に関する制約を適ンを生成する方法である．この方法に基づいてバグ用可能にした．

入りアプリケーションを生成する研究として，Just

結果として，多くのバグ入りアプリケーションを生らによる研究 [5] や Gyimesi らによる研究 [3] がある．

成でき，かつ現実的に存在しえないような不自然な処

これらの研究では，実際のアプリケーション開発プロ理を行うアプリケーションの生成を抑制できた．

ジェクトのバグ報告データに基づいてバグを混入させる．そのため，開発者が実際に起こしそうな現実的2 バグ入りアプリケーションなバグを考えることができる．しかし，これらはあら2. 1 バグ入りアプリケーションの必要性

かじめ用意されているベンチマークの分しかアプリ

バグ入りアプリケーションは，主に以下の 3 つのケーションが存在しないため，生成できるアプリケーケースで必要となる．
ケース 1 自動生成したテストスイートのバグ検出
能力の測定

ションの数が限られている．

2 つ目は，ミューテーション解析によって人為的にバグ入りアプリケーションを生成する方法である．

ケース 2 手動テスト支援の手法の評価

ミューテーション解析では，テスト対象のソフトウェ

ケース 3 複数のデバッグ手法の比較評価

アを意図的に書き換えることにより，ミュータントと2. 1. 1 ケース 1呼ばれる人為的なバグを含むソフトウェアを生成す

テストスイートの自動生成については多くの研究がる．ミューテーション解析を用いる方法では，多くの行われている [2]．自動生成したテストスイートのバグ

バグ入りアプリケーションを自動生成できるが，等価検出能力の評価を行いたい場合，あるバグ入りアプリ

ミュータント [6] を手動で取り除く作業が必要になりケーションにそのテストスイートを与えて実行し，どコストがかかるという問題点がある．

れほどのバグを検出できるかを測定する必要がある．

2. 1. 2 ケース 2
手動テストの例として，記述式テストと探索的テス
トという 2 つのテスト手法がある．記述式テストとは事前にテストケースを用意しておき，それに基づ図 1: ツールの全体像たバグ入りメソッドに置換し，バグを含む操作列とす

3 提案手法る．最後にこれを Java プログラムとして出力するこ

3. 1 スコープと要件とにより，バグ入りアプリケーションを生成する．

3. 1. 1 スコープ

3. 1. 2 要件

既存手法の問題点を解決するため，本論文では事前提案するツールは，以下の 3 つの要件を満たすよに作成して用意された Java アプリケーションに対すうに設計する．

る構成要素をもとに，アプリケーションの様々なバリ

要件 1 事前準備のコストをなるべく小さくしたうエーションを自動生成する．ここで，構成要素とは，えで，生成されうる多くのバリエーションのアプ

対象アプリケーションを構成するバグのないメソッドリケーションを生成する．

定義を指す．また，各構成要素のメソッドに対して，

要件 2 生成されたアプリケーションは構文誤りや変異を混入させたバグ入りメソッドもあらかじめ用意型の誤りがなく，コンパイルが正常終了する．

しておく．これらのバグ入りメソッドは，等価ミュー

要件 3 現実的に存在しえない不自然なアプリケータントを発生させないことがあらかじめ保証されていションの生成を防ぐ．

るものとする．このようなバグ入りメソッドを用意する方法としては，手動による方法，既存のミューテー

3. 2 特徴

ション解析技術 [7] を活用する方法などが考えられる．

前節の要件を満たすため，本ツールは以下の特徴をユーザが指定した入出力の型をもとに，構成要素の持つものとする．

メソッドを直線的に接続したメソッド列を多数生成す• 事前に人為的に用意したアプリケーションの構る．個々のメソッド列を以下，操作列と呼ぶ．操作列

成要素を組み合わせ，様々なバグ入りアプリケーを構成するメソッドの一部をあらかじめ用意しておいションの自動生成を可能とする．(要件 1 に対応)• 構成要素を組み合わせる際，型の整合性を保証することで，正しくコンパイルが可能なプログラ
ムを生成する．(要件 2 に対応)

• 型の性質と操作順に関する制約を人が与えて適用することを可能にし，その制約を満たすように構成要素を組み合わせることで，不自然なアプリケーションの生成を防ぐ．(要件 3 に対応)

する．

• History クラス: 書籍の貸出履歴に関するデータを保持する．

• Member クラス: 図書館の会員に関するデータを保持する．
操作は 20 個のメソッドで定義されている．それらの操作の仕様を表 1 に示す．

3. 3 全体像

3. 5 操作列の生成

本ツールの全体像を図 1 に示す．本ツールにおい3. 5. 1 生成方法ては，以下の手順でバグ入りアプリケーションを生成する．
手順 1 アプリケーション構成要素のメソッドの構
文解析

図 1 の手順 2 では，まず構成要素内の操作の中で入力 (第 1 引数) と出力 (戻り値) の型が同じ操作をまとめ，操作をグループ化する．ユーザは生成したいバグ入りアプリケーションの入力の型と出力の型を指手順 2 操作列の生成定する．その指定に対して，本ツールはまずユーザ指手順 3 操作列を構成するメソッドの一部をバグ入定の入力の型と操作の引数の型が一致するグループりメソッドに置換
手順 4 バグ入りアプリケーションの出力からある操作を一つ選択する．その後，選択した操作の戻り値の型を引数の型に持つグループから同様に操作を選択する．この処理をユーザ指定の出力の型と3. 4 入力戻り値の型が一致するまで繰り返す．このようにして本ツールには，アプリケーションの構成要素を Javaできる操作の列を全て生成する．

プログラムとして入力する．さらに，操作順に関する例として，操作が図 2 のようにグループ化されて制約を適用する場合にはその制約について記した制いるとする．これに対して，生成されるアプリケー約ファイルも入力する必要がある．

ションの入力と出力の型をそれぞれ型 A，型 D と指構成要素のメソッド定義は，前提として以下のものを考える．

• 引数は 1 つ又は 2 つ• 第 1 引数は次節で説明するアプリケーション生成時に用いる．

• 第 2 引数がある場合は，フォームやプロンプトからの実行時のユーザ入力が与えられる．

定した場合に生成されうる操作列は全部で 27 個である．図 3 にはその中から，操作列 1: 操作 a1 → 操作 b2 → 操作 c3
操作列 2: 操作 a2 → 操作 b1 → 操作 c1
操作列 3: 操作 a3 → 操作 b1 → 操作 c2の 3 つの操作列が示されている．
また，生成される操作列のバリエーションを増や

以下，図書館の書籍管理に関するアプリケーションすため，条件分岐 (if) を含む操作列も生成可能とすを例として提案手法を説明する．このアプリケーショ

る．条件分岐でも型の整合性を失わないようにする

ンの構成要素は Library クラス上に用意されており，ため，条件分岐の直前の操作の戻り値は，条件式とこのクラス内にはデータモデルと操作が定義されていして用いる操作の引数と一致するようにする (戻り値

る．データモデルとは主にフィールドのことを指し，は boolean)．さらに，前の操作の戻り値からユーザ操作とはメソッドのことを指す．

指定の出力までの全ての操作列から 2 つ選び，then

データモデルは Library クラス内の以下の 3 つのクラスで定義されている．

• LibData クラス: 書籍に関するデータを保持部分と else 部分に割り当てる．例えば，表 1 の図
書館の書籍管理アプリケーションの構成要素での操作列を生成する場合において，次の操作の引数の型

表 1: 図書館の書籍管理アプリケーションにおける構成要素メソッドの仕様
引数

戻り値

StringList<LibData>

String

LibDataStringvoid

List<LibData>, String

LibData

List<LibData>

List<LibData>

List<LibData>

void

LibDataboolean

LibData

void

LibData
LibData
LibData
List<Member>
List<Member>
List<Member>
Member

List<LibData>
StringList<Member>
List<Member>
Membervoid
String

メソッド名search booksearch members books
search by booknameregister bookregister member
narrowdown book author
narrowdown book genre
sort by borrowers
borrow books
display bookList
is borrowedborrow bookdispose booksameAuthors bookget book author
get borrowers
sort member Jalphaorder
get top member
display memberList
get members name

図 2: グループの例

が LibData の場合，条件式として is borrowed が

図 3: 3 つの操作列の例

選択され，then 部分に borrow book，else 部分にdispose book が選択される新たな操作列が生成される．生成される操作列に条件分岐を含めるかどうか

3. 5. 2 型の性質による制約は，実行時にオプションとして指定できる．

図 1 の手順 2 において，単純な型の一致のみでこのように，型の整合性だけから操作を接続する操作列を生成すると，意味のない操作列が作成されと，現実的には不自然な処理を行う操作列も生成される可能性がある．例えば，書籍管理アプリケーショてしまう．それを回避するために，以下に述べるようンの search book メソッドの引数はある単語を示すな操作列に対する 2 種類の制約を指定可能とした．

String 型だが，get book author メソッドの戻り値は本の著者を示す String 型である．この時，操作中のget book author メソッドの次の操作に search bookメソッドを選択すると，search book メソッドの引4 実装数として本の著者の String 型が与えられることにな

4. 1 Java パーサの生成

り，この操作列は意味のないアプリケーションを生成する操作列となってしまう．

本論文では，パーサジェネレータとして，ANTLR(ANother Tool for Language Recognition) †1 を用

このような問題を解決するために，メソッドの引数いた．また，ANTLR でパーサを生成する為の Javaや戻り値の型に性質を付与し，操作を接続する際に，の文法ファイルとして，GitHub 上で公開されている
Java.g4 †2 を用いた．

型だけでなくその性質の一致も条件に加えた．

3. 5. 3 操作順に関する制約型の性質による制約以外に，操作順に関する制約も

4. 2 構成要素の構文解析指定可能とする．この制約は, 構成要素の各操作に対

図 1 の手順 1 では，生成されたパーサを用いて構して，型とは別の性質を自由に付与することができ，文解析を行い具象構文木 (CST) を生成する．生成さ次の操作で接続されないという制約と，それ以降の操れた CST の一部を図 4 に示す．これは，プログラム作で接続されないという二つの制約を指定できる．

中のフィールドへの値の代入”author = a;” というこの制約は，型の性質による制約によって防ぐこと部分の CST である．

ができない，現実的に存在しえないような不自然な処理を行うアプリケーションの生成を，独自に防止する

4. 3 操作の選択ために必要となる．例えば，書籍管理アプリケーショ

図 1 の手順 2 において，ユーザが指定したアプリンの search book メソッドや search by bookname

ケーションの仕様 (入力と出力の型) に合致する全てメソッドなどの本の検索を行う操作を図書館の利用者の操作列を生成するため，頂点を型，有向辺をメソッ側が行う操作，本の削除を行う dispose book メソッ

ドとするような有向グラフをまず構築する．ここで，ドを図書館の司書側が行う操作とみなしてこれらの操各辺の名前はメソッド名，始点は引数の型，終点は戻作を分離したい場合，型の性質による制約ではこれらり値の型とする．の操作が同時に現れる操作列の生成を防止できない．

例 え ば ，search book メ ソッド で は ，名 前 がこのような場合に操作順に関する制約が必要となる．

search book，始点が String，終点が List<LibData>の有向グラフとなる．

3. 6 バグ入りメソッドへの置換

図書館の書籍管理に関する構成要素をもとに生成さ

図 1 の手順 3 において，生成された各操作列に対れた有向グラフを図 5 に示す．この有向グラフにおして，操作列中に含まれる構成要素の一部をバグ入りいて，ユーザが生成したいバグ入りアプリケーションメソッドに置換する．の入力の型を始点，出力の型を終点として深さ優先探索を行って，辺の重複がない全ての経路 (操作列) を

3. 7 出力探索する．各操作列はメソッド呼び出しのつながりとバグ入りメソッドを含む操作列全てに対して，Javaいう形で，main メソッドから呼ばれる新しいメソップログラムとしてファイルに出力し，バグ入りアプリケーションとする．

ド invoke method として実装する．
ただし，選択された操作に第 2 引数が存在した場合，その操作の前に InputfromUser XXXX メソッド(XXXX は型名) を挿入する．このメソッドはプロンプ
トから指定された型のユーザ入力を受け取ってそれを†1 https://www.antlr.org/†2 https://github.com/antlr/grammars-v4

図 5: 生成される有向グラフ

public static void invoke_method(String arg) {List<Lib_Data> v1 = search_book(arg);
String input1 = InputfromUser_String();
Lib_Data v2 =narrowdown_book_genre(v1, input1);
borrow_book(v2);}

また，条件分岐を含む invoke method の例を以下に示す．
public static void invoke_method(String arg) {List<Lib_Data> v1 =search_members_books(arg);
String input1 = InputfromUser_String();
Lib_Data v2 =narrowdown_book_genre(v1, input1);
if(is_borrowed(v2)) {borrow_book(v2);} else {List<Lib_Data> v21 = sameAuthors_book(v2);borrow_books(v21);}}

図 4: 作成される CST の一部

4. 4 操作列の制約
図 1 の手順 2 で用いる型の性質による制約と操作順に関する制約は，Java のアノテーションを付与すそのまま返すメソッドである．
例えば操作列が，

1. search book2. narrowdown book genre
3. borrow bookの場合，invoke method を以下のように生成する．

ることで適用させる．

4. 4. 1 型の性質による制約型の性質は，構成要素のメソッド定義に，引数の性質を表す@Atype({v1 ,v2 ,· · ·}) と戻り値の性質を表す@Rtype({v1 ,v2 ,· · ·}) の 2 つのアノテーションを付与する．ここで，v1 ，v2 ，· · · は，性質を表す文字列とする．

5. 2 評価方法

例えば，register book メソッドの引数の文字列

図書館の書籍管理アプリケーションについて，表 1が書名を表すという性質は，@Atype({"bookname"})の構成要素を用いて，条件分岐を含めない時と含めるというアノテーションで与える．

時の両者に対し，制約を適用しなかった場合，型の性

4. 4. 2 操作列に関する制約

質による制約を適用した場合，操作順に関する制約を操作列に関する制約は，構成要素内のメソッドに適用した場合，両方の制約を適用した場合のそれぞれ@Atype，@Rtype 以外の新しいアノテーションを付与に対して，ツールを実行して出力されるアプリケーし，そのアノテーション間の接続関係を記述したテキションの数を評価した．このとき，実行する際の設定ストファイルを与えることで適用する．

は以下のようにした．

例 え ば ，書 籍 検 索 操 作 (search book，search• 生成されるアプリケーションの入力の型と出力

member books，search by bookname) に@Search との型を以下の 3 つの場合に設定して実行した．

い う ア ノ テ ー ション が ，書 籍 を 削 除 す る 操 作– String → void

(dispose book) に@Dispose というアノテーション– LibData → voidが付与されているものとする．このとき，検索操– String → String

作の後には削除操作を一切行わないという制約は@Search {@Dispose}と，検索操作の直後には削除操作を行わないという制約は@Search <@Dispose>と記述する．

• 操作の型の性質は表 2 のように付与した．各性
質は表 3 のような意味を持つ．

• 操作順に関する制約は，書籍の検索を図書館ユーザ側の操作，書籍の削除を司書側の操作とみなはじめに対象のアノテーションを記述し，その直後し，これらの操作を分離するものとした．具体に対象のアノテーションが付与されたメソッドが含ま的には，search book，search members books，れる操作列との接続関係を記述する．{} 内には操作

search by bookname を検索操作，dispose book

列にそれ以降接続したくないメソッドに付与されていを削除操作とした．

るアノテーション，<>内には次のメソッドに接続した
くないメソッドに付与されているアノテーションを記

5. 3 結果と考察述する．

アプリケーションの入出力の型を String → void，

LibData → void，String → String とした場合，4. 5 バグ入りメソッドの挿入

ツールを実行した際に生成されるアプリケーション数

図 1 の手順 3 において，各操作列に対して，操作と，その時の実行時間を表 4 に示す．しかし，条件列中に含まれる構成要素の一部をバグ入りメソッドに分岐を適用した場合において，制約なし及び操作順置換する．これは，操作列を表す CST を破壊的に書に関する制約を適用した場合は，生成されるアプリき換えることにより行う．

ケーションが非常に多く莫大な実行時間がかかってしまい，測定を行うことができなかった．

5 評価実験

これらの表より，入出力の型の設定によって生成さ5. 1 評価観点

れるアプリケーション数に大きく違いがあることもわ

型の性質による制約と操作順に関する制約によっ

かる．て，現実的に存在しえないような不自然な処理を行う

また，入力の型が String，出力の型が void の際，アプリケーションの生成を防止できているかを確認

型の性質による制約によって削除されるアプリケーする．

ションの例を以下に示す．
public static void invoke_method(String arg) {表 2: 各操作の性質
メソッド名
search booksearch members books
search by bookname
register bookregister member
narrowdown book author
narrowdown book genre
sort by borrowers
borrow books
sameAuthors bookget book author
get borrowers
sort member Jalphaorder
get top member
get members name

表 3: 各性質の意味
型

StringList<LibData>
List<Member>

性質

詳細

word
membername
booknameauthorpersonname
sort
unsortsort
unsort

文字や単語
会員名
書名
著者名
人名
ソート有
ソート無
ソート有
ソート無

引数の性質
word
membername
booknamebookname
personname
unsortunsortunsortunsortunsortsort-

戻り値の性質
unsortunsortunsortsort
unsortauthorunsortsort
membername

public static void invoke_method(String arg) {List<LibData> v1 = search book (arg);
LibData v2 = narrowdown_book(v1);
dispose book (v2 );}この例において，search book メソッドは本の検索操作に値し，dispose book メソッドは本の削除操作に値するため，このアプリケーションは制約違反となり，操作順に関する制約によって削除された．
これらの結果から，制約を適用しない場合は多くの意味のないアプリケーションが生成されてしまうが，2 つの制約によってこれらのアプリケーションの生成.
.
.
String v5 = get_members_name(v4);
List<LibData> v6 = search_book(v5 );.
.
.
}を防げていることが確認できた．特に今回用いた書籍管理アプリケーションの構成要素では，Java 標準の型である String 型を引数または戻り値に持つ操作が多く存在したため，型の性質による制約の効果が大きかった．

この例において，get members name メソッドは
図 書 館 の 会 員 名 を 表 す String 型 の 値 を 返 す が ，

6 おわりにsearch book メ ソッド は 本 に 含 ま れ る あ る 単 語 を

本論文では，テストスイートのバグ検出能力の測定

表す String 型の値を受け取るため，ここでは変数に用いるためのバグ入りアプリケーションを生成する

v5 が制約違反となり，型の性質による制約によってツールを実装した．このツールでは, 構文解析や有向削除された．

グラフの作成，引数及び戻り値の型や性質による操作

また，操作順に関する制約によって削除されるアプ
リケーションの例を以下に示す．の選択，操作順に関する制約の記述などを行い，様々なバリエーションを持ち，かつ現実的に自然なバグ入りアプリケーションを生成可能である．

表 4: 生成されるアプリケーション数と実行時間(a) 入力:String，出力:void
通常

条件分岐

アプリ数

実行時間 (ms)

アプリ数

実行時間 (ms)

制約なし

3,384

33,076--

操作順に関する制約

2,987

31,407--型の性質による制約

116

8,496

3,366

36,506

97

8,239

2,201

27,663型の性質による制約 +操作順に関する制約(b) 入力:LibData，出力:void
通常

条件分岐

アプリ数

実行時間 (ms)

アプリ数

実行時間 (ms)

制約なし

2,586

15,115--操作順に関する制約

2,063

13,364--型の性質による制約

42

7,870

2,000

14,322

36

7,405

1,448

11,490型の性質による制約 +操作順に関する制約(c) 入力:String，出力:String
通常

条件分岐

アプリ数

実行時間 (ms)

アプリ数

実行時間 (ms)

制約なし

599

9,322

-

-

操作順に関する制約

599

9,009

-

-型の性質による制約

30

7,261

250

8,318

30

7,856

250

8,211

型の性質による制約 +操作順に関する制約生成されるアプリのバリエーションをさらに増加させるため，繰り返しを含むアプリを生成できるようにすることが今後の課題である．また，生成されたアプリの類似度のような値を算出し，似ているアプリの生成を防ぐことも今後の課題である．これは，テストの際にかかるコストの削減だけでなく，ソフトウェアテストの教育の場でも，ある問題に対する類似問題を作成する際などに活用できると考えている．

参 考 文 献[1] Afzal, W., Ghazi, A. N., Itkonen, J., Torkar, R.,
Andrews, A., and Bhatti, K.: An Experiment on
the Eﬀectiveness and Eﬃciency of Exploratory Test-ing, Empirical Software Engineering, Vol. 20, 2015,
pp. 844–878.
[2] Anand, S., Burke, E. K., Chen, T. Y., Clark, J.,
Cohen, M. B., Grieskamp, W., Harman, M., Harrold, M. J., and McMinn, P.: An orchestrated survey of methodologies for automated software test
case generation, Journal of Systems and Software,Vol. 86, No. 8(2013), pp. 1978–2001.
[3] Gyimesi, P., Vancsics, B., Stocco, A., Mazinanian, D., Beszédes, Á., Ferenc, R., and Mesbah, A.:BugsJS: a Benchmark of JavaScript Bugs, ICST ,2019, pp. 90–101.
[4] Jia, Y. and Harman, M.: An Analysis and Survey of the Development of Mutation Testing, TSE ,Vol. 37, No. 5(2011), pp. 649–678.
[5] Just, R., Jalali, D., and Ernst, M. D.: Defects4J:
A Database of Existing Faults to Enable ControlledStudies for Java Programs, ISSTA , 2014, pp. 437–440.
[6] Madeyski, L., Orzeszyna, W., Torkar, R. andJózala, M.: Overcoming the Equivalent Mutant
Problem: A Systematic Literature Review and a
Comparative Experiment of Second Order Mutation, TSE, Vol. 40, No. 1(2014), pp. 23–42.
[7] Ma, Y. S., Oﬀutt, J., and Kwon Y. R.: Mujava:AMutation System for Java, ICSE, 2006, pp. 827–830.
[8] Orso, A. and Rothermel, G.: Software Testing:

A Research Travelogue (2000-2014), FOSE , 2014,
pp. 117–132.
[9] Papadakis, M., Kintis, M., Zhang, J., Jia, Y.,
Traon, Y. L., and Harman, M.: Mutation Testing
Advances: An Analysis and Survey, Advances in
Computers , Vol. 112, 2019, pp. 649–678.
[10] Wong, W. E., Gao, R., Li, Y., Abreu, R., andWotawa, F.: A Survey on Software Fault Localization, TSE , Vol. 42, No. 8(2016), pp. 707–740.