TestNGの紹介

1概要

この記事では、TestNGテストフレームワークを紹介します。

私たちは、フレームワークのセットアップ、簡単なテストケースと設定の作成、テストの実行、テストレポートの生成、そして同時テストの実行に焦点を当てます。

2セットアップ

まず、 pom.xml ファイルにMaven依存関係を追加します。

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.11</version>
    <scope>test</scope>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.testng%22%20AND%20a%3A%22testng%22[Mavenリポジトリ]にあります。

Eclipseを使用している場合、TestNGプラグインはhttps://marketplace.eclipse.org/[Eclipse Marketplace]からダウンロードしてインストールすることができます。

3テストケースを書く

TestNGを使ってテストを書くには、テストメソッドに org.testng.annotations.Test アノテーションを付けるだけです。

@Test
public void givenNumber__whenEven__thenTrue() {
    assertTrue(number % 2 == 0);
}

4テスト構成

テストケースを書いている間、テスト実行の前に設定や初期化命令を実行したり、テスト完了後にクリーンアップをしなければならないことがよくあります。 TestNGは、メソッド、クラス、グループ、スイートの各レベルで、多数の初期化およびクリーンアップ機能を提供します。

@BeforeClass
public void setup() {
    number = 12;
}

@AfterClass
public void tearDown() {
    number = 0;
}

@ BeforeClass アノテーションが付けられた setup() メソッドはそのテストクラスのメソッドの実行前に呼び出され、 tearDown() はテストクラスのすべてのメソッドの実行後に呼び出されます。

同様に、メソッド、グループ、テスト、およびスイートレベルでの設定には、 @ BeforeMethod、@AfterMethod、@ Before/AfterGroup、@ Before/AfterTest および @ Before/AfterSuite アノテーションを使用できます。

5テスト実行

Mavenの "test"コマンドでテストケースを実行することができます、それはそれらをデフォルトのテストスイートに入れて @ Test でアノテーションを付けられたすべてのテストケースを実行します。 https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.maven.plugins%22%を使用して、TestNGテストスイートのXMLファイルからテストケースを実行することもできます。 20AND%20a%3A%22maven-surefire-plugin%22[maven-surefire-plugin]:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <suiteXmlFiles>
            <suiteXmlFile>
               src\test\resources\test__suite.xml
            </suiteXmlFile>
        </suiteXmlFiles>
    </configuration>
</plugin>

すべてのテストケースをカバーする複数のXMLファイルがある場合は、それらすべてを suiteXmlFiles タグに追加できます。

<suiteXmlFiles>
    <suiteXmlFile>
      src/test/resources/parametrized__test.xml
    </suiteXmlFile>
    <suiteXmlFile>
      src/test/resources/registration__test.xml
    </suiteXmlFile>
</suiteXmlFiles>

テストをスタンドアロンで実行するには、クラスパスにTestNGライブラリとXML設定ファイルと共にコンパイルされたテストクラスが必要です。

java org.testng.TestNG test__suite.xml

6. グループ化テスト

テストはグループで実行できます。たとえば、50のテストケースのうち15をまとめて実行し、他のテストケースをそのままにして実行できます。

TestNGでは、スイートのグループ化テストはXMLファイルを使用して行われます。

<suite name="suite">
    <test name="test suite">
        <classes>
            <class name="com.baeldung.RegistrationTest"/>
            <class name="com.baeldung.SignInTest"/>
        </classes>
    </test>
</suite>

テストクラス RegistrationTest、SignInTest はどちらも同じスイートに属し、スイートが実行されると、このクラスのテストケースが実行されることに注意してください。

テストスイートとは別に、テストクラスの代わりにメソッドをグループ化したTestNGでテストグループを作成することもできます。そのためには、 @ Test アノテーションに groups パラメーターを追加します。

@Test(groups = "regression")
public void givenNegativeNumber__sumLessthanZero__thenCorrect() {
    int sum = numbers.stream().reduce(0, Integer::sum);

    assertTrue(sum < 0);
}

XMLを使用してグループを実行しましょう。

<test name="test groups">
    <groups>
        <run>
            <include name="regression"/>
        </run>
    </groups>
    <classes>
        <class
          name="com.baeldung.SummationServiceTest"/>
    </classes>
</test>

これは、 SummationServiceTest クラスのgroup regression、 でタグ付けされたテストメソッドを実行します。

7. パラメータ化テスト

パラメータ化された単体テストは、いくつかの条件下で同じコードをテストするために使用されます。パラメータ化された単体テストの助けを借りて、我々はいくつかのデータソースからデータを取得するテストメソッドを設定することができます。主な考え方は、単体テスト方法を再利用可能にし、異なる入力セットでテストすることです。

TestNGでは、@ Parameter または @ DataProvider アノテーションを使用してテストをパラメータ化できます。 XMLファイルを使用している間は、テストメソッドに@__Parameterという注釈を付けます。

@Test
@Parameters({"value", "isEven"})
public void
  givenNumberFromXML__ifEvenCheckOK__thenCorrect(int value, boolean isEven) {

    assertEquals(isEven, value % 2 == 0);
}

そしてXMLファイルを使用してデータを提供します。

<suite name="My test suite">
    <test name="numbersXML">
        <parameter name="value" value="1"/>
        <parameter name="isEven" value="false"/>
        <classes>
            <class name="baeldung.com.ParametrizedTests"/>
        </classes>
    </test>
</suite>

XMLファイルのデータを使用すると便利ですが、より複雑なデータが必要になることがよくあります。

@ DataProvider アノテーションは、これらのシナリオを処理するために使用されます。これらのシナリオは、メソッドをテストするための複雑なパラメータ型をマッピングするために使用できます。プリミティブデータ型の場合は @DataProvider

@DataProvider(name = "numbers")
public static Object[][]evenNumbers() {
    return new Object[][]{{1, false}, {2, true}, {4, true}};
}

@Test(dataProvider = "numbers")
public void
  givenNumberFromDataProvider__ifEvenCheckOK__thenCorrect(Integer number, boolean expected) {
    assertEquals(expected, number % 2 == 0);
}

__ @ DataProvider __オブジェクト用:

@Test(dataProvider = "numbersObject")
public void
  givenNumberObjectFromDataProvider__ifEvenCheckOK__thenCorrect(EvenNumber number) {
    assertEquals(number.isEven(), number.getValue() % 2 == 0);
}

@DataProvider(name = "numbersObject")
public Object[][]parameterProvider() {
    return new Object[][]{{new EvenNumber(1, false)},
      {new EvenNumber(2, true)}, {new EvenNumber(4, true)}};
}

これを使用して、テストする必要があるすべてのオブジェクトを作成してテストで使用することができます。これは統合テストケースに最も役立ちます。

8テストケースを無視する

開発プロセスの間、一時的に特定のテストケースを実行したくない場合があります。これは@ Test アノテーションに enabled = false、 を追加して行うことができます。

@Test(enabled=false)
public void givenNumbers__sumEquals__thenCorrect() {
    int sum = numbers.stream.reduce(0, Integer::sum);
    assertEquals(6, sum);
}

9依存テスト

最初のテストケースが失敗した場合、後続のすべてのテストケースを実行し、スキップするようにマークするというシナリオを考えてみましょう。 TestNGは、 @ Test アノテーションの dependsOnMethods パラメーターを使用してこの機能を提供します。

@Test
public void givenEmail__ifValid__thenTrue() {
    boolean valid = email.contains("@");

    assertEquals(valid, true);
}

@Test(dependsOnMethods = {"givenEmail__ifValid__thenTrue"})
public void givenValidEmail__whenLoggedIn__thenTrue() {
    LOGGER.info("Email {} valid >> logging in", email);
}

ログインテストケースは、電子メール検証テストケースによって異なります。したがって、電子メールの検証に失敗した場合、ログインテストはスキップされます。

10同時テスト実行

TestNGを使用すると、テストを並列モードまたはマルチスレッドモードで実行できるため、これらのマルチスレッドコードをテストできます。

メソッド、クラス、およびスイートを独自のスレッドで実行するように構成でき、合計実行時間を短縮できます。

10.1. 並列のクラスとメソッド

テストクラスを並行して実行するには、XML設定ファイルの suite タグの parallel 属性に値__classesを付けます。

<suite name="suite" parallel="classes" thread-count="2">
    <test name="test suite">
        <classes>
        <class name="baeldung.com.RegistrationTest"/>
            <class name="baeldung.com.SignInTest"/>
        </classes>
    </test>
</suite>

XMLファイルに複数の test タグがある場合は、 parallel =” tests”と記述することでこれらのテストを並列に実行することもできます。個々のメソッドを並列で実行する場合は、 parallel =” methods”。

** 10.2. テストメソッドのマルチスレッド実行

複数のスレッドで実行するときにコードの動作をテストする必要があるとしましょう。 TestNGは複数のスレッドでテストメソッドを実行することを可能にします。

public class MultiThreadedTests {

    @Test(threadPoolSize = 5, invocationCount = 10, timeOut = 1000)
    public void givenMethod__whenRunInThreads__thenCorrect() {
        int count = Thread.activeCount();

        assertTrue(count > 1);
    }
}

threadPoolSize は、メソッドが前述のように n 個のスレッドで実行されることを示します。 invocationCount timeOut は、テストが複数回実行され、時間がかかるとテストに失敗することを示します。

11.機能テスト

TestNGには、機能テストにも使用できる機能が付属しています。 Seleniumと組み合わせて、Webアプリケーションの機能をテストするために使用することも、http://hc.apache.org/httpcomponents-client-ga/index.html[HTTPクライアント]でWebサービスをテストするために使用することもできます。

SeleniumとTestNGによる機能テストの詳細については、リンク:/java-selenium-with-junit-and-testngを参照してください[ここ]。また、このリンクの統合テストに関するいくつかの点については、/integration-testing-a-rest-api[article]を参照してください。

12.結論

この記事では、TestNGのセットアップ方法と簡単なテストケースの実行方法、レポートの生成方法、テストケースの同時実行方法、そして関数型プログラミングについて少し説明しました。依存テスト、テストケース、テストグループ、スイートの無視などの機能については、JUnit vs TestNGの記事リンク/junit-vs-testng[こちら]を参照してください。

すべてのコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testng[Githubに追加]を参照してください。