2

JUnitフレームワークでテストカバレッジを実行する必要があります。

JUnit-Tutorialを読みましたが、この知識を私の例に結び付けることはできません。

ファイルから読み取ったメソッドを単独でテストする方法は理解していますが、パスとaskUserPathAndWordをテストしてこれを完全にテストする方法がわかりません。どうすればこれについて良いテストを行うことができますか?

package task;
import java.io.*;

class SearchPhrase {
    public void walk(String path, String whatFind) throws IOException {
        File root = new File(path);
        File[] list = root.listFiles();
        for (File titleName : list) {
            if (titleName.isDirectory()) {
                walk(titleName.getAbsolutePath(), whatFind);
            } else {
                if (read(titleName.getAbsolutePath()).contains(whatFind)) {
                    System.out.println("File:" + titleName.getAbsolutePath());
                }
            }
        }
    }

    // Read file as one line
    public static String read(String fileName) {
        StringBuilder strBuider = new StringBuilder();
        try {
            BufferedReader in = new BufferedReader(new FileReader(new File(
                    fileName)));
            String strInput;
            while ((strInput = in.readLine()) != null) {
                strBuider.append(strInput);
                strBuider.append("\n");
            }

            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return strBuider.toString();
    }

    public void askUserPathAndWord() {
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(System.in));
        String path, whatFind;
        try {
            System.out.println("Please, enter a Path and Word"
                    + "(which you want to find):");
            System.out.println("Please enter a Path:");
            path = bufferedReader.readLine();
            System.out.println("Please enter a Word:");
            whatFind = bufferedReader.readLine();

            if (path != null && whatFind != null) {
                walk(path, whatFind);
                System.out.println("Thank you!");
            } else {
                System.out.println("You did not enter anything");
            }
        } catch (IOException | RuntimeException e) {
            System.out.println("Wrong input!");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
            SearchPhrase example = new SearchPhrase();
            example.askUserPathAndWord();
    }
}

の質問:

  • 統合の依存関係を完全にテストし、パスを確認するにはどうすればよいですか?
  • どのポイントが良い、当然のことながらjunitテストを行う必要がありますか?
  • この状況で失敗テストを使用する必要がありますか?
  • どの最大パーセントプログラムをカバーできますか?
  • プライベートメソッドと保護されたメソッドを(一般的に)テストする必要がありますか?
4

1 に答える 1

5

最初はシンプルにすることをお勧めします。私の考えでは、基本的なレベルでは、単体テストを作成する目的は、コードが意図したとおりに動作することを実際に確認することです。

あなたのread方法は始めるのに良い場所だと思います。メソッドの目的はread、ファイル名を入力として受け取り、ファイルの内容を含む文字列を返すことです。

したがって、それが機能することを証明するテストを作成するには、まず「testFile」という名前のファイルをどこかに作成し、ファイル内に「my test」などのダミーテキストを挿入します。

次に、単体テストを次のように記述します。

@Test
public void read() {

    String testFileName = "/path/to/test/file/testFile";
    String expected = "my test";
    SearchPhrase searchPhrase = new SearchPhrase();
    String result = searchPhrase.read(testFileName);
    assertEquals(expected, result);

}

それはあなたが始めるためだけです。慣れてきたら、ハードコードされないようにテスト ファイルへのパスを更新するなどの改善を行うことができます。理想的には、テストはどこからでも実行できる必要があります。

おまけとして、単体テストを作成すると、パッケージ、クラス、およびメソッドをより再利用可能で理解しやすい方法で整理することを考えるようになります (その他の利点に加えて)。

たとえば、walkメソッドは現在作成されているため、テストが困難です。そのため、テストを簡単にする方法を考えてみてください。おそらく、検索結果を表す文字列のリストを返すことができますか? その変更を行い、文字列「test」の testFile を含むディレクトリを検索すると、リストに 1 つの結果が表示されるはずなので、次のようなものを使用してテストします。

assertNotNull(searchPhrase.walk());
assertEquals(1, searchPhrase.walk().size());

始めたばかりなので、テストがカバーするプログラムの割合について心配しないことをお勧めします。

テストを書くとき、他の誰かが私のコードを使用した場合、そのコードがどのように動作すると予想されるかを考えるのに役立ちます。次に、意図した動作を示すテストを書きます。

それが役立つことを願っています!

于 2013-01-25T17:48:11.250 に答える