junitテストjunitテスト:異常テスト

5928 ワード

問題を投げ出す


実験4では異常の処理をテストする必要がある:3.1節に現れた多種の不法な状況を考慮して、1組のテスト用例を設計して、人為的に不法入力のファイルと不法入力の図操作指令を製造して、プログラムに対して頑丈性と正確性のテストを行って、方法を設けてプログラムを崩壊させたい(つまりプログラムに誤り許容能力があるかどうかを検証する).問題が来ました.異常をどのようにテストすればいいですか?

異常をテストする方法


1.@Test(expected…)


@Test注記にはオプションのパラメータがあります.「expected」では、Throwableのサブクラスを設定できます.上記のcanVote()メソッドが予想される異常を投げ出すことを検証したい場合は、次のように書くことができます.
@Test(expected = GrammarException.class)
    public void test_vertex_args() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException {        
        GraphPoet g = (GraphPoet) new GraphPoetFactory().creatGraph("test/file/GraphPoet_vertex_args.txt");      
    }

簡単に明らかに、このテストにはいくつかの誤差があります.異常は方法のある位置で投げ出されますが、特定の行にあるとは限りません.同時に異常な情報が投げ出されたことをチェックすることはできません.

2.ExpectedException


JUnitフレームワークのExpectedExceptionクラスを使用する場合は、ExpectedException例外を宣言する必要があります.
@Rule
public ExpectedException thrown= ExpectedException.none();

その後、より簡単な方法で予想される異常を検証することができます.また、予期される例外のプロパティ情報を設定できます.
@Test
    public void test_vertex_args() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException {        
        thrown.expect(GrammarException.class);
        thrown.expectMessage("The vertex args is lack.");
        GraphPoet g = (GraphPoet) new GraphPoetFactory().creatGraph("test/file/GraphPoet_vertex_args.txt");      
    }

この方法は,異常の属性情報を設定できるほか,異常が放出される位置をより正確に見つけることができるという利点がある.もう一つの書き方:
thrown.expect(IllegalArgumentException.class, “age should be +ve”);

3.Try/catch with assert/fail


JUnit 4以前のバージョンではtry/catch文ブロックを使用して例外をチェック
@Test
    public void test_vertex_args() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException {        
        try {
        GraphPoetFactory().creatGraph("test/file/GraphPoet_vertex_args.txt");   
    } catch (GrammarException ex) {
        assertThat(ex.getMessage(), containsString("The vertex args is lack."));
    }
    fail("expected for GrammarException of The vertex args is lack.");
    }

この方法は古くなったが、非常に効果的だ.主な欠点はcatch文ブロックの後にfail()メソッドを書く必要があることを忘れやすく、異常が投げ出されないと情報の誤報を招くと予想されることです.私はかつてこのような過ちを犯したことがある.

テストIOException


IOExceptionでは、対応するファイルが見つからない場合、ユーザーに新しいファイルを入力し、ファイルの読み取りを再開するように要求します.
try{

}catch (IOException e) {
            logger.warn(e.getClass().getName() + ":" + e.getMessage());
            System.out.println("Please input a new file:");
            Scanner in = new Scanner(System.in);
            String newFilePath = in.nextLine();
            g = (GraphPoet) new GraphPoetFactory().creatGraph(newFilePath);
        }

テストの際、ユーザーが正しいファイル名を入力するのをシミュレートする必要があります.この場合、IOストリームの内容の知識が必要です.
@Test
    public void test_io() throws GrammarException, VertexNotExistException, MismatchException, WeightException, LabelException , OtherPropertyException{        
        GraphPoetFactory  factory = new GraphPoetFactory();
        String string = "test/file/GraphPoet.txt\r
"
; InputStream stdin = System.in; System.setIn(new ByteArrayInputStream(string.getBytes())); factory.creatGraph("test/file/GraphPoet_3333.txt"); System.setIn(stdin); }

stringが正しい入力ファイルのアドレスの内容であるため、入力ストリームを新規作成し、文字列の内容を入力ストリームに入力し、最後に実行時にIOExceptionを投げ出し、新しいファイルアドレスを入力するように要求します.異常がなければ、実行に失敗します.

参考文献


JUnitを使用した予期しない例外のテストhttps://blog.csdn.net/tayanxunhua/article/details/20570457