1. 概要

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

フレームワークのセットアップ、簡単なテストケースと構成の作成、テストの実行、テストレポートの生成、および同時テストの実行に焦点を当てます。

2. 設定

pom.xmlファイルにMaven依存関係を追加することから始めましょう。

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

最新バージョンは、Mavenリポジトリにあります。

Eclipseを使用する場合、TestNGプラグインは EclipseMarketplaceからダウンロードしてインストールできます。

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 で注釈が付けられたすべてのテストケースを実行し、デフォルトのテストスイートに配置します。 maven-surefire-plugin:を使用して、TestNGテストスイートのXMLファイルからテストケースを実行することもできます。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</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でテストグループを作成することもできます。この場合、テストクラスの代わりにメソッドがグループ化されます。 これを行うには、groupsパラメーターを@Testアノテーションに追加します。

@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クラスのグループ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ファイル内のタグの場合、これらのテストは、言及することで並行して実行することもできます。 parallel =”テスト”。 また、個々のメソッドを並行して実行するには、 parallel =”メソッド”。

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アプリケーションの機能をテストするために使用することも、HttpClientを使用してWebサービスをテストするために使用することもできます。

SeleniumとTestNGを使用した機能テストの詳細については、こちらをご覧ください。 また、この記事の統合テストに関するいくつかの記事もあります。

12. 結論

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

すべてのコードスニペットの実装は、Githubにあります。