---
# System prepended metadata

title: M1清水：研究打ち合わせ

---


## テスト自動生成ツールによって生成されたテストは本当にバグ発見に役立つのか？

対象はJava
Javaのテスト生成ツールはEvosuite，カバレッジ測定ツールは不明．

やること
1.Javaのプロジェクトを複数とってくる（GitHubのAPIを叩く）
　→EvosutieがJava８でないと実行できない
　→Defect4jのプロジェクト
2.テストが付属しているメソッドに対して，Evosuiteでテスト生成する．
3.メソッドＡについて，人間テストでのFLの精度と，自動テストでのFLの精度比較

1. Javaのプロジェクトを複数とってくる（GitHubのAPIを叩く）
- 人間が書いたテストが付属していること
    - 実際に実行できるかの確認
    - カバレッジの収集
        - 久保さんから教えていただくツールの使用
        - スクリプトの準備
- GitHubでそれなりにスターがついていること
- どれくらいできたかの具体的な数字を出すこと
- ミューテーション　[pit](https://pitest.org/)　コンパイル後のバイトコードに対して
    - ソースコード上のバグは見られない→見られた方が良い
    - https://github.com/kusumotolab/Mutanerator
    
2. テストが付属しているメソッドに対して，Evosuiteでテスト生成する．
- classで定義された引数でつまずく可能性あり
- オブジェクト生成で引っかかる？
    - オブジェクト生成支援（新テーマ？）
- フィルタリングにslackに上げた[ツール](https://github.com/higolab/HowToUseJDTCore)
    - 自動生成ツールで生成しづらいオブジェクトの生成を除くため
    
- Evosuiteがバージョンが新しいプログラムに対して実行できない
    - Defect4jにのプロジェクトを対象に実行する
        - langなどがわかりやすい
3. メソッドＡについて，人間テストでのFLの精度と，自動テストでのFLの精度を比較する（Java用のFLについては他の学生に肥後が聞く）


 Defect4Jに対しての実験
- カバレッジの計測

- kGenProgの適用　→ できない
- 別のFLツール　[GZoltar](https://github.com/GZoltar/gzoltar/tree/master)

- 8/2 個別ミーティング
    -  Defects4Jのバージョンがある
    -  カバレッジはパーセントで出せるのが理想
        - Line Coverageは手作業でカウントする必要がある？
        - Condition Coverageはどのようのにカウントしているかがわからない
        - Gzoltarの方で計測できないか？
    -   同じメソッドは同じ傾向になる→データの偏りが出る？
        -   同じメソッドはまとめる？→バグによってソースコードは変わるのでまとめる必要はない？
        -   どのメソッドが同じかを情報として持っておいた方が良い
    - 自動テスト生成ではObject型の引数が生成できないのではないか
        - [メソッド呼び出し関係を用いたテストケース生成に関する調査](https://ken.ieice.org/ken/paper/20240725Xc3C/)
        - メソッドが呼び出される直前を見ればいいのでは？

||人間の書いた テストの方が良い結果|Evosuiteで生成した テストの方が良い結果|
|:-----|:-----|:----|
|Instrunction Coverage|7/52|9/52|
|Branch Coverage|4/52|16/52|


2/3

- 引数をプリミティブ型，基本ライブラリの型，プロジェクト独自の型の３種類に分類する
- 人間の書いたテストの書き方は一定ではないため，差が出たコードはこんな違いがあるよという事実を述べるしかない
- ミュータントの数が少ない，サンプルが少ないから一般的な傾向が掴めない？→とりあえずどんな傾向があるかを見てから
- sbflスコアについて，全体的に自動テストがちょっと高い理由を見る．自動テストが高いのは全体のうちいくつか，平均などのデータを数値で出す
- 全体のテストの数，対象のミュータントを通るテストケース数の数値を出す．テスト数とsbflスコアを一つのグラフで同時に見られるように
- プログラムの構造を見るのであれば，構文解析ツール作る必要がある
    - JDK→構文解析の方法→ツール作成→山本さんのツールをまずは動かす，わからなければ先生に聞く
    - 制御構造の深さ→条件分岐(if, while, for, swich)のネストの深さを見る，シンプルブロックを除く．ネストの深さとsbflスコアの相関関係を見る
        - Javaのシンプルブロック：意味的なまとまりを{}してインデント，分岐ではない
    - ifとswtchを区別して考える→if文などは単純なtrue,falseの二択だが，swichはn択→目でカウント？構文解析ツール？
- 分岐網羅の方が自動テストが高い→なぜ？43，自動テストにおいて引数がStrig型が原因の一つではないか？人間も低いのはなぜ？
- 21，命令網羅率は高いのに分岐網羅率が低いのはなぜ？
- 研究のゴールは「誰かにとって何かの役に立つのか」を言えること

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

第一希望：テスト自動生成ツールによって生成されたテストは本当にバグ発見に役立つのか？
第二希望：SBFL-SuitabilityやAutorepairabilityの変遷調査
第三希望：学習時に用いるデータセットの非独立性が機械学習モデルの性能に与える影響

  - [佐々木さんの論文](https://sdl.ist.osaka-u.ac.jp/pman/pman3.cgi?DOWNLOAD=527)
  - ミューテーションツール：[Mutanerater](https://github.com/kusumotolab/Mutanerator)

-----------------------------------------------------

新テーマ？4/11

- コミットの種類を調べる．ラージコミットを調べる
- 特定の場面で優れているとすればおけ
- ASTを作ってる？ リファクタリングマイナーを 使っている？リファクタリングを検出することで精度を上げている。
- 参考になったらSZZよくなる？
- Javaに依存した話。
- よーさんは言語依存しない（language ignosting）重たい解析をせずに、字句解析程度でリファクタリングを検出できないか。多言語で。
- リファクタリングを検出？
- 一行
- 意味的な空白行を着目する，どういう時に空白行が入るのか，ブロックをもっと細かくできるのでは？
- どこで区切るよいかを調べる，言語によって変わるのか？PythonやJava,Java Script?は今はTypeScriptが主流


||Z値（効果量）|両側検定p値|片側検定(手動＞自動)p値|片側検定(手動＜自動)p値|
|:-----|:-----|:----|:----|:----|
|Instrunction Coverage|-1.289|0.901|0.0984|
|Branch Coverage|-2.163|0.030|0.984|0.015|
|SBFL Score|2.206|0.027|0.013|0.986|


||Z値（効果量）|両側検定p値|片側検定(手動＞自動)p値|片側検定(手動＜自動)p値|
|:-----|:-----|:----|:----|:----|
|Instrunction Coverage|-1.289|0.196|0.901|0.098|
|Branch Coverage|-2.163|0.030|0.984|0.015|
|SBFL Score|2.206|0.027|0.013|0.986|
|ネスト1〜７|4.55||||
|ネスト2〜7|12.68||||
|ネスト3〜７|11.82||||
|ネスト4〜7|9.92||||
|ネスト5〜７|8.15||||
|ネスト6〜7|4.72||||

```
private void CopyTo (File dest) throws IOException {
    FileReader in = null;
    FileWriter out = null;
    int c;
    try {
        in = new FileReader (image);
        out = new FileWriter (dest);
        while ((c = in.read ()) != - 1) out.write (c);

    } finally {
        if (in != null) try {
            in.close ();
        } catch (Exception e) {
        }

        if (out != null) try {
            out.close ();
        } catch (Exception e) {
        }

    }
}
```
```
public String merge (int width, int height) throws Exception {
    htErrors.clear ();
    sendGetImageRequests (width, height);
    Vector files = new Vector ();
    ConcurrentHTTPTransactionHandler c = new ConcurrentHTTPTransactionHandler ();
    c.setCache (cache);
    c.checkIfModified (false);
    for (int i = 0;
    i < vImageUrls.size (); i ++) {
        if ((String) vImageUrls.get (i) != null) {
            c.register ((String) vImageUrls.get (i));
        } else {
        }
    }
    c.doTransactions ();
    vTransparency = new Vector ();
    for (int i = 0;
    i < vImageUrls.size (); i ++) {
        if (vImageUrls.get (i) != null) {
            String path = c.getResponseFilePath ((String) vImageUrls.get (i));
            if (path != null) {
                String contentType = c.getHeaderValue ((String) vImageUrls.get (i), ""content-type"");
                if (contentType.startsWith (""image"")) {
                    files.add (path);
                    vTransparency.add (htTransparency.get (vRank.get (i)));
                }
            }
        }
    }
    if (files.size () > 1) {
        File output = TempFiles.getFile ();
        String path = output.getPath ();
        ImageMerger.mergeAndSave (files, vTransparency, path, ImageMerger.GIF);
        imageName = output.getName ();
        imagePath = output.getPath ();
        return (imageName);
    } else if (files.size () == 1) {
        File f = new File ((String) files.get (0));
        File out = TempFiles.getFile ();
        BufferedInputStream is = new BufferedInputStream (new FileInputStream (f));
        BufferedOutputStream os = new BufferedOutputStream (new FileOutputStream (out));
        byte buf [] = new byte [1024];
        for (int nRead;
        (nRead = is.read (buf, 0, 1024)) > 0; os.write (buf, 0, nRead));

        os.flush ();
        os.close ();
        is.close ();
        imageName = out.getName ();
        return imageName;
    } else return """";

}
```