3.JUnitの断言を掘り下げる


この章では,Hamclestライブラリの利用方法,JUnitでの断言の使用方法について学習する.また、異常が発生したテストの作成方法も学習します.

1.JUnit断言


JUnitでは、テストに使用できる静的メソッド呼び出しと断言します.各断言は、どのような条件が本当の方法であるかを検証します.断言の条件が本当でない場合、テストはその場で停止し、失敗を報告します.

1. assertTrue


使用例は次のとおりです.
@Test
public void hasPositiveBalance() {
    account.deposit(50);
    assertTrue(account.hasPositiveBalance());
}
@Test
public void depoistIncreaseBalance() {
    int initialBalance = account.getBalance();
    account.deposit(100);
    assertTrue(account.getBalance() > initialBalance);
}

2.assertThatの比較的明確な値


ほとんどのブレークスルーは、期待値と返される実際の値を比較します.残高が0より大きいというよりは、所望の残高を明示的に断言します.
assertThat(account.getBalance(), equalTo(100));
assertThat()静的アプローチはハムレット断言の例である.ハムレットが断言した最初のパラメータは、実際の(実際の)式、すなわち、検証する値(ターゲットシステムのメソッド呼び出しがしばしば)である.2番目のパラメータはマッチングです.それぞれの場所で実際の値と式の結果が比較されます.各テストは毒性を大幅に向上させる.普通の文章のように、左から右まで読むことができます.例えば、上記の断言文は、「口座残高は100に等しくなければならない」と記述することができる.
Junitが提供するコアハンバーガーを使用して購入するには、コードに静的インポートを追加する必要があります.
import static org.hamcrest.CoreMatchers.*;
equalTo列挙にはjavaインスタンスとデフォルトのタイプ値が含まれます.equalTo売買は比較基準としてequals()手法を用いた.Java基本型は自動アセンブリオブジェクト型なので、どのタイプでも比較できます.
ブール(Boolean)式とハムレット(Hamcrest)列挙を使用してassertTree()呼び出しを次のように表すこともできます.
account.deposit(50);
assertThat(account.getBalance() > 0, is(true));
もう一つのハムレットの断言を見てみましょう.(CoreMatchersクラスで)startsWithメッセージを使用します.
assertThat(account.getName(), startsWith("xyz"));

3.重要なハムの包装を見る


JUnitに含まれるCoreMatchersクラスは、すぐに購入を開始できるコレクションを提供しています.
Java配列または集合オブジェクトを比較する場合はequalTo()メソッドを使用します.
assertThat(new String[]{"a", "b", "c"}, equalTo(new String[]{"a, b"}));
assertThat(Arrays.asList(new String[]{"a"}), equalTo(Arrays.asList(new String[]{"a", "ab"})));
場合によっては、is装飾子(decorator)を追加して、各表現の可読性を向上させることができる.isは、伝達された各データ(すなわち、何もしない)を返すだけです.
Account account = new Account("my big fat acct");
assertThat(account.getName(), is(equalTo("my big fat acct")));
何かを否定する断言をすれば、仲人は使いません.
assertThat(account.getName(), not(equalTo("plunderings")));
記号によってはisをis(「plumdings」)として表すこともできます.
Null以外の値またはNull以外の値をチェックする場合は、次のようになります.
assertThat(account.getName(), is(not(nullValue()))));
assertThat(account.getName(), is(notNullValue()));
JUnitハムレット取引を利用して、以下のことをすることができます.
  • オブジェクトタイプを確認します.
  • 2つのオブジェクトの参照が同じインスタンスであるかどうかを確認します.
  • と組み合わせて、両方または両方のいずれかが成功したかどうかを確認します.
  • 要素または条件に一致するセットをチェックします.
  • どのコレクションにいくつかのアイテムが含まれているかをチェックします.
  • は、どのコレクションのすべての要素が各項目を遵守しているかをチェックします.
  • 4.2つの浮動小数点を比較する


    コンピュータはすべての浮動小数点数を表すことはできません.Javaでは、浮動小数点タイプ(floatとdouble)のいくつかの数を近似して求めなければなりません.単位テストでは、2つの浮動小数点数を比較すると、必ずしも望ましくない場合があります.
    assertThat(2.32 * 3, equalTo(6.96));
    テストは合格するようですが、失敗しました.
    2つのfloatまたはdoubleを比較する場合は、2つの数で発生する可能性のある公差または許容誤差を指定する必要があります.assertTrue()を使用して直接作成できます.
    assertTrue(Math.abs((2.32 * 3) - 6.96) < 0.0005);
    しかし、読みやすさが悪く、失敗した情報も内容を把握するのが難しい.
    逆に、isCloseToというハムレット取引が利用できます.このメディアはCloseTo()静的メソッドを提供します.
    import static org.hamcrest.number.IsCloseTo.*;
    assertThat(2.32 * 3, closeTo(6.96, 0.0005));

    5.断言説明


    各JUnitアサーションのフォーマット(fail()、ハムレットassertThat()には、messageというオプションの最初のパラメータがあります.Messageパラメータは,断言の根拠を説明した.
    @Test
    public void testWithWorthlessAssertionCommnet() {
        account.deposit(50);
        assertThat("account balance is 100", account.getBalance(), equalTo(50));
    }
    この説明文はテストがはっきりしていない.
    説明文字のある注釈文が好きな場合は、断言に情報を追加できます.しかし、より良い方法は、コード自体だけで理解できるテストを書くことです.テスト名を変更したり、有意義な定数を導入したり、変数名を改善したり、複雑な初期化操作を有意義なヘルプメソッドに抽出したり、可読性に優れたハムレット断言を使用したりすることで、テストをよりよくすることができます.

    2.期待例外の3つの方法


    コードが予想された例外を投げ出したかどうかを確認したいかもしれません.JUnitは、予想される例外を投げ出すかどうかを3つの異なる方法で示すことができる.たとえば、クライアントが使用可能な残高よりも多くのお金を抽出しようとする場合、Accountコードは例外を投げ出す必要があります.

    1.簡単な方法:アニメーションを使う


    JUnitの@Testプレゼンテーションでは、所望の例外を指定できるパラメータを提供します.
    @Test(expected=InsufficientFundsException.class)
    public void throwsWhenWithdrawingTooMuch() {
        account.withdraw(100)
    }
    throwsWhenWithdrawingTooMuchメソッドを実行すると、InsuffectionFundsException例外が発生した場合、テストは合格します.テストに失敗します.

    2.古い方法:try/catchとfail


    try/catchブロックを使用して、発生した例外を処理することもできます.異常が発生していない場合はorg.junit.Assert.fail()メソッドの呼び出しに強制に失敗しました.
    try {
        account.withdraw(100);
        fail();
    }catch(InsufficientFundsException expected) {
    }
    アカウントから抽出中に異常が発生した場合、制御権はcatchブロックに移行し、テストは終了します.つまり、テストに合格しました.そうでなければ、制御権は失敗ゲートに移行します.
    従来の方法は、異常発生後の状態をチェックするときに役立ちます.たとえば、例外メッセージをチェックしてみます.
    try {
        account.withdraw(100);
        fail();
    }catch(InsufficientFundsException expected) {
        assertThat(expected.getMessage(), equalTo("balance only 0"));
    }

    3.新しい方法:ExpectedExceptionルール


    ExpectedExceptionルールを使用するには、テストクラスでExpectedException orインスタンスを宣言し、@Ruleコメントを追加します.
    import org.junit.rules.*;
    // ...
        @Rule
        public ExpectedException thrown = ExpectedException.none();
        
        @Test
        public void exceptionRule() {
            thrown.expect(InsufficientFundsException.class);
            thrown.expectMessage("balance only 0");
            
            account.withdraw(100);
        }
    }

    4.例外を無視


    checked Exceptionを扱うために、テストコードにtry/catchブロックを入れずに、発生した異常を再び投げ出す.
    @Test
    public void readsFromTestFile() throws IOException {
        String filename = "text.txt";
        BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
        writer.write("test data");
        writer.close();
        // ...
    }
    リファレンス
  • JavaとJUnitによる実用主義ユニットテスト
  • https://github.com/gilbutITbook/006814