発行:11月10、2020
マルチスレッド実行による並列テストの改善
今日の急速に変化する世界では、 市場投入までの時間を短縮 あらゆる規模の企業にとって、QAは重要な要件です。そのため、企業はQAチームにソフトウェア製品に関する迅速なフィードバックを提供することを期待しています。 テスト自動化 テスト時間を大幅に短縮し、運用効率を向上させますが、特定のコードの実行に時間がかかり、テスト自動化プロジェクトが停滞してしまう場合があります。そこで役立つのが並列実行です。並列テストとは、複数のブラウザとプラットフォームでテストスクリプトを同時に実行するプロセスです。
並列実行はテスト時間を大幅に短縮しますが、いくつかの課題も伴います。並列実行用にテストスクリプトを分離するのは複雑な作業です。また、スレッドについても検討する必要があります。 safeマルチスレッド実行では、複数のプロセスが同時に実行されるため、処理速度が速くなります。スレッド同士がどのように相互作用するかを明確に理解しておく必要があります。そのため、マルチスレッド実行はソフトウェアテストプロジェクトの重要な要素となります。
マルチスレッド実行の概要
統合テスト ソフトウェアテストの一部であり、ソフトウェアモジュールを論理的にグループとして統合し、相互にどのように相互作用するかをテストします。複数の異なるモジュールがどのようにデータを通信するかに焦点を当てます。マルチスレッド実行は、スレッドの特定の機能をテストする統合テストの一部です。スレッドとは、マシンが実行できる最小の作業単位です。これは通常、統合テストの開始時に実行され、主にクライアントサーバーアーキテクチャのテストに使用されます。
初期段階では、統合されたスレッドはまずサブシステムとしてテストされ、次にシステム全体としてテストされます。この統合テストは増分モデルで実行され、タスクを順次処理するため、スレッドインタラクションテストとも呼ばれます。これは、オブジェクト指向のリアルタイムシステムに最適です。一般的に、マルチスレッド実行は単一の個別のスレッドのテストから始まり、次にマルチスレッド実行のテストに進みます。
スレッド実行は 2 つの方法で実行できます。
- シングルスレッドテスト: シングル スレッド テストは、一度に 1 つのアプリケーション トランザクションをテストして、アプリケーション ロジックがどのように機能するか、入出力データ トランザクションを必要に応じてどのように実行するかを確認します。
- マルチスレッドテスト: マルチスレッドテストとは、アプリケーションの複数のトランザクションが同時に実行されるテストです。単一のマシンで実行することも、複数のマシンに分散して実行することもできます。クライアントサーバーアーキテクチャでは、単一のスレッドが他のスレッドが保持するオブジェクトとやり取りしていない場合は正常に動作する可能性があるため、スレッドテストは非常に重要です。しかし、同じスレッドがマルチスレッド環境で実行されると、動作が失敗する可能性があります。そのため、スレッド間のやり取りは確認すべき重要な側面です。
マルチスレッドテストを実行する際、ユニットテスト用の再現可能なコードを書くことは大きな課題です。同様に、メモリ、ストレージ、速度などのリソースはハードウェアごとに異なるという事実を考慮する必要があります。そのため、コードを慎重に記述することが鍵となります。これらの課題に対処すれば、スレッドテストのメリットをすべて享受できます。クライアントサーバーベースのアプリケーションの機能、パフォーマンス、そして機能性を簡単に確認できるようになります。
スレッドテストのための並列実行
並列テストを実行することで、アプリケーション内のマルチスレッドコードをテストしながらテスト実行時間を短縮できます。TestNGは、マルチスレッド実行の並列テスト実行を支援する、人気のテスト自動化フレームワークです。
スレッド ID を確認する例を次に示します。
[java] public void ExperitestThreadOne() { long id = Thread.currentThread().getId(); System.out.println(“Experitest スレッド id: ” + id); } [/java]
ここで、2 つのメソッドを実行してスレッド ID を確認する小さなテスト スクリプトを作成しましょう。
Eclipse IDE を開いて Java プロジェクトを作成し、そのプロジェクト内にクラスを作成して、次のコードを記述します。
[java] package ExperitestMultiThread; import org.testng.annotations.Test; public class ExperitestMTDemo { @Test public void ExperitestMethod1() { long id = Thread.currentThread().getId(); System.out.println(“Experitest Method 1 のスレッド ID は: ” + id); } @Test public void ExperitestMethod2() { long id = Thread.currentThread().getId(); System.out.println(“Experitest Method 2 のスレッド ID は: ” + id); } } [/java]
ここで、このプログラムを実行して出力を確認します。

出力を確認すると、両方のメソッドが 1 つのスレッドで順番に実行されています。
それでは、両方のメソッドを並列実行してみましょう。そのためには、新しいファイルを作成し、TestNG.xml という名前を付けて、次のコードを追加します。
[xml] [/xml]
または、プロジェクトを右クリックして、TestNG -> TestNGに変換をクリックすることもできます。
ここで、並列モード -> メソッドとスレッド数を 2 に選択して、ファイルを保存します。

TestNG.xml ファイルを TestNG スイートとして実行します。

各メソッドが別々のスレッドで実行されていることがわかります。(スレッド 14、15、14)
同様に、テスト、スイートなどに基づいて並列テストを実行することもできます。
TestNG では、「threadPoolSize」属性と「invocationCount」属性を使用して、マルチスレッド環境で並列テストを実行することもできます。
マルチスレッド環境で並列テストを実行する方法の例を次に示します。
[java] package ExperitestMultiThread; import org.testng.annotations.Test; public class ExperitestMT { @Test(threadPoolSize = 4, invocationCount = 8, timeOut = 1000) public void ExperitestMTEnvironment() { Long id = Thread.currentThread().getId(); System.out.println(“Experitest マルチスレッドテストが Thread: ” + id で実行されています); } } [/java]
この例では、threadPoolSizeを4に設定しています。これは、プログラムが4つの異なるスレッドで実行されることを意味します。同様に、invocationCountを8に設定すると、メソッドが8回実行されることを意味します。
次に、testng.xml ファイルを作成し、次のコードを追加します。
[xml] [/xml]
testng.xml を実行すると、4 つのスレッドを使用して同じメソッドが 8 回実行されます。

ここでは、プログラムが4つの異なるスレッド(スレッド14、15、16、17)で実行されていることがわかります。
SeeTestプラットフォームでのマルチスレッド実行
複数のテストケースを並行して実行するには、十分なコンピューティングリソースが必要です。SeeTestは、複数のブラウザとプラットフォームで並行テストを実行できる強力なテスト自動化プラットフォームを提供します。
以下は、テスト クラスを並列モードで実行する例です。
Javaプロジェクトを作成し、その中に2つのクラスを作成します。最初のクラス(ExperitestSearch.java)に次のコードを追加します。
[java] private static final String ACCESS_KEY = “ここにアクセスキーを入力してください”; private RemoteWebDriver driver; private URL url; private DesiredCapabilities dc = new DesiredCapabilities(); @BeforeMethod public void setUp() throws Exception { url = new URL(“https://cloud.seetest.io/wd/hub”); dc.setCapability(CapabilityType.BROWSER_NAME, BrowserType.CHROME); dc.setCapability(CapabilityType.PLATFORM, Platform.ANY); dc.setCapability(“accessKey”, ACCESS_KEY); dc.setCapability(“testName”, “Quick Start Chrome Browser Demo”); driver = new RemoteWebDriver(url, dc); long id = Thread.currentThread().getId(); System.out.println(” Experitest Search Setup Method Thread id is: ” + id); } @Test public void browserTestGoogleSearch() { driver.get(“https://www.google.com”); new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.name(“q”))); WebElement searchBar = driver.findElement(By.name(“q”)); searchBar.click(); searchBar.sendKeys(“Experitest”); searchBar.sendKeys(Keys.ENTER); long id = Thread.currentThread().getId(); System.out.println(“Experitest Search Test Method Thread id is: ” + id); } @AfterMethod public void tearDown() { System.out.println(“Report URL: “+ driver.getCapabilities().getCapability(“reportUrl”)); driver.quit(); long id = Thread.currentThread().getId(); System.out.println(” Experitest Search Teardown Method スレッドIDは: ” + id); } [/java]
private static final String ACCESS_KEY = “ここにアクセスキーを入力してください”;
このプログラムはSeeTestプラットフォームにログインし、Googleブラウザを開いてキーワード「Experitest」を検索します。検索結果が表示されたらブラウザを閉じます。各メソッドのスレッドIDが表示されます。
ここで、別のクラス (SeeTestSearch.java) を作成し、次のコードを追加します。
[java] package ExperitestMultiThread; import org.openqa.selenium.*; import org.openqa.selenium.remote.BrowserType; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.net.URL; public class SeeTestSearch { private static final String ACCESS_KEY = “ここにアクセスキーを入力してください”; private RemoteWebDriver driver; private URL url; private DesiredCapabilities dc = new DesiredCapabilities(); @BeforeMethod public void setUp() throws Exception { url = new URL(“https://cloud.seetest.io/wd/hub”); dc.setCapability(CapabilityType.BROWSER_NAME, BrowserType.FIREFOX); dc.setCapability(CapabilityType.PLATFORM, Platform.ANY); dc.setCapability(“accessKey”, ACCESS_KEY); dc.setCapability(“testName”, “Quick Start Firefox Browser Demo”); driver = new RemoteWebDriver(url, dc); long id = Thread.currentThread().getId(); System.out.println(” SeeTest Search Setup Method Thread id is: ” + id); } @Test public void browserTestGoogleSearch() { driver.get(“https://www.google.com”); new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.name(“q”))); WebElement searchBar = driver.findElement(By.name(“q”)); searchBar.click(); searchBar.sendKeys(“SeeTest”); searchBar.sendKeys(Keys.ENTER); long id = Thread.currentThread().getId(); System.out.println(“SeeTest Search Test Method Thread id is: ” + id); } @AfterMethod public void tearDown() { System.out.println(“Report URL: “+ driver.getCapabilities().getCapability(“reportUrl”)); driver.quit(); long id = Thread.currentThread().getId(); System.out.println(“SeeTest Search Teardown Method Thread id is: ” + id); } } [/java]
このプログラムは、SeeTest クラウド プラットフォームにログインし、Firefox ブラウザを開き、Google 検索サイトを開いて、キーワード「SeeTest」を検索します。
これで2つのクラスが作成されました。次のステップは、これらを並列実行することです。TestNG.xmlファイルを作成し、以下のコードを追加してください。
[xml] [/xml]
次に、TestNG.xml ファイルを実行します。

両方のクラスが異なるスレッド(スレッド16と15)で同時に実行されていることがわかります。同様に、TestNGフレームワークを使用すると、メソッド、テスト、スイートを並列実行できます。
製品概要
マルチスレッド実行は、並列テストを実行するための強力な方法です。強力なSeeTestテスト自動化フレームワークとTestNGフレームワークを使用すると、 より優れた並列テストを構築し、マルチスレッド環境で簡単に実行します。 計算リソースを気にすることなく実行できます。ただし、スレッドテスト用に記述されたスクリプトは互いに独立しており、再現可能である必要があることに注意することが重要です。同じ入力とアプリケーションバージョンを使用した場合、毎回同じ結果が得られる必要があります。また、スレッドテスト用のスクリプトを使用することも重要です。safe テストで変数を使用することをお勧めします。スレッドテストのベストプラクティスに従うことで、マルチスレッド実行のためのより優れた並列テストを構築できるだけでなく、リソースを最適化し、テスト時間を大幅に短縮できます。