JGoTestingによるテスト

1概要

JGoTesting は、Goのテストパッケージ にヒントを得た JUnit互換のテストフレームワークです。

この記事では、JGoTestingフレームワークの主な機能を調べ、その機能を紹介するための例を実装します。

2 Mavenの依存関係

まず、 jgotesting 依存関係を pom.xml に追加しましょう。

<dependency>
    <groupId>org.jgotesting</groupId>
    <artifactId>jgotesting</artifactId>
    <version>0.12</version>
</dependency>

この成果物の最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.jgotesting%22%20AND%20a%3A%22jgotesting%22[ここ]にあります。 。

3前書き

JGoTestingはJUnitと互換性のあるテストを書くことを可能にします。 JGoTestingが提供するすべてのアサーションメソッドに対して、同じシグネチャを持つ がJUnitにあります。したがって、このライブラリを実装することは本当に簡単です。

ただし、 JUnitとは異なり、アサーションが失敗した場合、JGoTestingはテストの実行を停止しません 。代わりに、失敗は event として記録され、すべてのアサーションが実行されたときにのみ提示されます。

4 JGoTesting in Action

このセクションでは、JGoTestingをセットアップする方法の例とその可能性を探ります。

4.1. 入門

テストを書くために、まずJGoTestingのアサーションメソッドをインポートしましょう。

import static org.jgotesting.Assert.** ;//same methods as JUnit
import static org.jgotesting.Check.** ;//aliases starting with "check"
import static org.jgotesting.Testing.** ;

ライブラリには、 @ Rule アノテーションでマークされた必須の JGoTestRule インスタンスが必要です。これは、クラス内のすべてのテストがJGoTestingによって管理されることを示します。

そのような規則を宣言するクラスを作成しましょう。

public class JGoTestingUnitTest {

    @Rule
    public final JGoTestRule test = new JGoTestRule();

   //...
}

4.2. テストを書く

JGoTestingは私たちのテストを書くために2セットのアサーションメソッドを提供します。最初のセットのメソッドの名前は assert で始まり、JUnitと互換性のある名前で、その他の名前は check で始まります。

両方のメソッドセットは同じように動作し、ライブラリはそれらの間に一対一の対応を提供します。

両方のバージョンを使用して、数値が別の数値と等しいかどうかをテストする例です。

@Test
public void whenComparingIntegers__thenEqual() {
    int anInt = 10;

    assertEquals(anInt, 10);
    checkEquals(anInt, 10);
}

その他のAPIは一目瞭然なので、これ以上詳しく説明しません。以下のすべての例では、 check バージョンのメソッドにのみ焦点を当てます。

4.3. 失敗イベントとメッセージ

チェックが失敗すると、JGoTestingはテストケースが実行を継続するために失敗を記録します。 テスト終了後、失敗が報告されます

これがどのように見えるかを示す例です。

@Test
public void whenComparingStrings__thenMultipleFailingAssertions() {
    String aString = "The test string";
    String anotherString = "The test String";

    checkEquals("Strings are not equal!", aString, equalTo(anotherString));
    checkTrue("String is longer than one character", aString.length() == 1);
    checkTrue("A failing message", aString.length() == 2);
}

テストを実行した後、以下のような出力が得られます。

org.junit.ComparisonFailure: Strings are not equal!
  expected:<[the test s]tring> but was:<[The Test S]tring>//...
java.lang.AssertionError: String is longer than one character//...
java.lang.AssertionError: Strings are not the same
  expected the same:<the test string> was not:<The Test String>

各メソッドで失敗メッセージを渡すことに加えて、テストに少なくとも1つの失敗がある場合にのみ表示されるようにそれらをログに記録することもできます。

これを実践するテスト方法を書きましょう。

@Test
public void whenComparingNumbers__thenLoggedMessage() {
    log("There was something wrong when comparing numbers");

    int anInt = 10;
    int anotherInt = 10;

    checkEquals(anInt, 10);
    checkTrue("First number should be bigger", 10 > anotherInt);
    checkSame(anInt, anotherInt);
}

テスト実行後、以下のような出力が得られます。

org.jgotesting.events.LogMessage: There was something wrong
  when comparing numbers//...
java.lang.AssertionError: First number should be bigger

String.format() メソッドとしてメッセージをフォーマットできる logf() に加えて、条件式に基づいて logIf() および logUnless() メソッドを使用してメッセージを記録することもできます。

4.4. 中断テスト

JGoTestingはテストケースが与えられた前提条件に合格しなかったときにテストケースを終了するためのいくつかの方法を提供します。

これは、必要なファイルが存在しないために、時期尚早に終了するテストの例です。

@Test
public void givenFile__whenDoesnotExists__thenTerminated() throws Exception {
    File aFile = new File("a__dummy__file.txt");

    terminateIf(aFile.exists(), is(false));

   //this doesn't get executed
    checkEquals(aFile.getName(), "a__dummy__file.txt");
}

テストの実行を中断するために terminate() メソッドと terminateUnless() メソッドを使用することもできます。

4.5. 連鎖

JGoTestRule クラスには、チェックをチェーニングするために使用できる 流暢なAPIもあります

JGoTestRule のインスタンスを使用して String オブジェクトの複数のチェックをチェーン化する例を見てみましょう。

@Test
public void whenComparingStrings__thenMultipleAssertions() {
    String aString = "This is a string";
    String anotherString = "This Is a String";

    test.check(aString, equalToIgnoringCase(anotherString))
      .check(aString.length() == 16)
      .check(aString.startsWith("This"));
}

4.6. カスタムチェック

boolean 式と Matcher インスタンスに加えて、** JGoTestRule のメソッドは、チェックを行うためのカスタム Checker オブジェクトを受け取ることができます。これは、ラムダ式を使用して実装できる単一の抽象メソッドインタフェースです。

これは、前述のインターフェースを使用して String が特定の正規表現に一致するかどうかを検証する例です。

@Test
public void givenChecker__whenComparingStrings__thenEqual() throws Exception {
    Checker<String> aChecker = s -> s.matches("\\d+");

    String aString = "1235";

    test.check(aString, aChecker);
}

5結論

このクイックチュートリアルでは、JGoTestingがテストを書くために提供している機能について説明しました。

JUnit互換の assert メソッドと、それに対応する check メソッドを紹介しました。また、ライブラリが失敗イベントを記録および報告する方法を見て、ラムダ式を使用してカスタム Checker を作成しました。

いつものように、この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testing[Githubに追加]を見つけることができます。