オープンソースのGitHubプロジェクトで、JavaでSelenium WebDriverフレームワークの動作を展示するために作成されたプロジェクトを開発中でした。プロジェクトが成長するにつれて、異なるテストを実行するために複数のtestng.xmlファイルを作成する必要がありました。
これらの複数のファイルは、テストを分けるために作成され、それぞれのウェブサイトに関連するすべてのテストを1つのtestng.xmlに配置します(異なるデモウェブサイトを使用して、Selenium WebDriverを使用して自動化できる異なるアクションをデモするために使用しました)。
複数のtestng.xmlファイルの使用方法とテストの実行方法について説明しようと思いました。Mavenが使用されているビルドツールであるため、プロジェクト内のすべてのテストを実行するために1つのtestng.xmlファイルが必要です。また、単一のtestng.xmlファイルを実行することで、テストの失敗をデバッグするケースもありました。
このプロジェクトでは、9つの異なるtestng.xmlファイルを作成し、これらの9つの異なるtestng.xmlファイル内のすべてのテストを1つのtestng.xmlファイルを使用して実行しています。はい、それは可能です!
ですから、私が1つのtestng.xmlファイルを使用して複数のtestng.xmlファイルを実行する方法をデモする旅に参加してください。また、9つのうちの1つのtestng.xmlファイルを実行し、Mavenを使用してコマンドラインから実行する方法についても説明します。
単一のtestng.xmlファイルを使用して複数のtestng.xmlファイルの実行
まず、9つの異なるtestng.xmlファイルで全てのテストを実行してみましょう。これの解決策は、testng.xmlファイルで<suite-files> </suitefiles>
タグを使用し、このタグの間に他のtestng.xml ファイルのパスを提供することです。以下は、私が話している内容を示す例のファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Selenium 4 POC Tests ">
<suite-files>
<suite-file path="testng-saucedemo.xml"/>
<suite-file path="testng-automationpractice.xml"/>
<suite-file path="testng-theinternet.xml"/>
<suite-file path="testng-juice-shop.xml"/>
<suite-file path="testng-lambdatestecommerce.xml"/>
<suite-file path="testng-seleniumgrid-theinternet.xml"/>
<suite-file path="testng-lambdatest-selenium-playground.xml"/>
<!-- <suite-file path="testng-seleniumgrid-juiceshop.xml"/>-->
</suite-files>
</suite>
このファイルを実行すると、<suite-files>
タグの間に更新された順に、それぞれのtestng.xmlを実行します。つまり、"testng-saucedemo.xml"
が最初に実行され、次に、"testng-automationpractice.xml"
が実行され、それ以此になります。
上記の例に示されるtestng.xmlファイルは、複数のテストが含まれています。したがって、それぞれのtestng.xmlに含まれるすべてのテストが実行され、完了後、次のXMLファイルが実行のために選択されます。
以下はtestng-saucedemo.xmlファイルの内容です。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Sauce Demo Website Tests" parallel="tests" thread-count="4" verbose="2">
<test name="selenium 4 Tests with Chrome Browser">
<parameter name="browser" value="chrome"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
<test name="selenium 4 Tests with Firefox Browser">
<parameter name="browser" value="firefox"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
<test name="selenium 4 Tests with Edge Browser" enabled="false">
<parameter name="browser" value="edge"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
<test name="selenium 4 Tests with Opera Browser" enabled="false">
<parameter name="browser" value="opera"/>
<classes>
<class name="io.github.mfaisalkhatri.tests.saucedemo.SauceDemoTests">
<methods>
<include name="loginSauceDemoTest"/>
<include name="logOutSauceDemoTest"/>
</methods>
</class>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
このXMLファイルに含まれるすべてのテストが実行されると(成功または失敗に関わらず)、実行が完了すると、次のファイルがテストの別のセットを実行するために選択されます。
testngはスイートファイルを並列に実行することをサポートしていません。
Mavenを使用して单一のtestng.xmlファイルを実行します。
あなたはIDEにはテストを実行するためのオプションがあり、testng.xmlファイルを右クリックして実行するオプションを選択します。しかし、CI/CDパイプラインでテストを実行するときは、自動化パイプライン内でコマンドを使用してテストを実行する必要があり、そのオプションは適切ではありません。
コマンドラインを使用してsuite-xmlファイルを実行するためのプロジェクト設定
以下の設定を行い、testng.xmlファイルをMavenを使用して実行できるようにする必要があります。
pom.xml内のMaven Surefireプラグインを更新します。
上のスクリーンショットで<SuiteXmlFile>
タグに注意してください。suiteXmlFile
の値は${suite-xml}
と設定されています。以下のようにpom.xmlファイルのpropertiesブロック内で宣言のデフォルト値を設定します。
デフォルトのtestng.xmlへのパスは、このブログの前のセクションで使用したファイルに設定されており、suite-files
のパスを更新しました。
したがって、今mvn clean install
またはmvn clean test
コマンドを実行すると、Mavenはpropertiesブロックで更新されたファイルパスに基づいてtestng.xml デフォルトファイルを取得し、すべてのテストを実行します。
今、思い浮かべる質問は、「他のtestng.xml ファイルを実行したいときは何をすべきでしょうか?それは可能ですか?」
答えは「はい」: 私たちは、mvn
コマンドに -Dsuite-xml=<testng.xml ファイルのパス>
を追加することで、testng.xml ファイルをプロジェクト内で実行することができます。
覚えておいてください、この設定は先程 pom.xml の Maven Surefire プラグインのブロックで設定しました。
command line で suite-xml
属性変数の値を渡す必要があります。これは mvn
コマンドの -D
オプションを使用して行います:
mvn clean test -Dsuite-xml=<testng.xml file path>
今度は、これまで学んだように command line で Maven を使用して異なるtestng.xml ファイルを実行してみましょう。
私たちは testng-internet.xml
ファイルを実行し、既存のデフォルトのtestng.xmlを上書きし、command line で渡されたものだけを実行することを確認します。testng.xmlが保存されている完全なパスを渡す必要があります。私たちの場合、test-suite
フォルダにあり、完全なパスは test-suites\testng-theinternet.xml
です。私たちが実行するコマンドは以下の通りです(Maven コマンドを実行する前に、command line ウィンドウのプロジェクトのルートフォルダパスに移動してください):
mvn clean test -Dsuite-xml=test-suite\testng-theinternet.xml

“-Dsuite-xml” オプションは、以下のような他の Maven コマンドと一緒に使用できます:mvn clean install/ mvn clean verifyなど。
テストは成功して終了し、結果がコンソールに出力されました。32のテストが実行され、すべて成功しました。
正しいXMLファイルが選択されてテストが実行されたことを確認するために、testng-theinternet.xml
ファイルのテストをIDEで実行して、実行されたテスト数を確認します。
32のテストが実行され、成功したことが確認できます。これは、mvn
コマンドを使用して実行したテストが、渡したtestng.xmlファイルに対して正しく実行されたことを確認します。
結論
プロジェクト内の異なるモジュール/ウェブサイトに基づいてテストを分けるために複数のtestng.xmlファイルを持つことができ、これらの複数のtestng.xmlファイルは1つのtestng.xmlファイルを使用して実行することができます。
同様に、Maven Surefireプラグインを使用してコマンドラインからtestng.xmlファイルを実行することができます。
Source:
https://dzone.com/articles/working-with-multiple-testngxml-files