TestNGの紹介
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);
}
<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ファイル内のタグの場合、これらのテストは、言及することで並行して実行することもできます。
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のにあります。