Testng-quick-guide
TestNG-概要
テストとは、アプリケーションの機能をチェックして、要件に従って動作することを確認するプロセスです。 単体テストは、開発者レベルで全体像を描き、最終製品が要件を満たしていることを確認するために、すべての単一エンティティ(クラスまたはメソッド)をテストするための適切な手段が取られます。
JUnitは、他のテストフレームワークと比較して、テスト、特に単体テストの有用性を開発者が理解するように駆り立てています。 かなり単純で実用的で厳格なアーキテクチャを活用して、JUnitは多数の開発者に「感染」させることができました。 JUnitのチュートリアルを見て、その機能を十分に理解してください。 JUnitには、同時にいくつかの欠点もあります。以下にリストします-
- 当初は単体テストのみを有効にするように設計されていましたが、現在ではあらゆる種類のテストに使用されています。
- 依存関係テストを実行できません。
- 不十分な構成制御(setUp/tearDown)。
- 侵入的(クラスを拡張し、メソッドに特定の方法で名前を付けることを強制します)。
- 静的プログラミングモデル(不必要に再コンパイルするように強制します)。
- 複雑なプロジェクトのさまざまなテストスイートの管理は非常に難しい場合があります。
TestNGとは何ですか?
そのドキュメントによるTestNGの定義は次のとおりです-
_TestNGは、JUnitおよびNUnitから着想を得たテストフレームワークですが、より強力で使いやすいいくつかの新しい機能を導入しています。
TestNGは、オープンソースの自動テストフレームワークです。ここで、 NG は* N ext G *列挙を意味します。 TestNGはJUnit(特にJUnit 4)に似ていますが、JUnit拡張機能ではありません。 JUnitに触発されています。 特に統合クラスをテストする場合、JUnitよりも優れているように設計されています。 TestNGの作成者は_Cedric Beust_です。
TestNGは、古いフレームワークのほとんどの制限を取り除き、開発者がより柔軟で強力なテストを作成できるようにします。 Java Annotations(JDK 5.0で導入)からテストを定義するために大きく借用しているため、実際の実稼働環境でJava言語のこの新しい機能を使用する方法を示すこともできます。
TestNGの機能
- 注釈をサポートします。
- TestNGは、より多くのJavaおよびOO機能を使用します。
- 統合されたクラスのテストをサポートします(たとえば、デフォルトでは、すべてのテストメソッドに対して新しいテストクラスインスタンスを作成する必要はありません)。
- コンパイル時のテストコードを実行時の構成/データ情報から分離します。
- 柔軟なランタイム構成。
- 「テストグループ」を導入します。 テストをコンパイルしたら、TestNGにすべての「フロントエンド」テスト、または「高速」、「低速」、「データベース」テストなどを実行するように依頼できます。
- 依存テスト方法、並列テスト、負荷テスト、および部分的な障害をサポートします。
- 柔軟なプラグインAPI。
- マルチスレッドテストのサポート。
TestNG-環境
TestNGはJavaのフレームワークであるため、最初の要件はJDKをマシンにインストールすることです。
システム要件
JDK | 1.5 or above. |
Memory | No minimum requirement. |
Disk Space | No minimum requirement. |
Operating System | No minimum requirement. |
手順1-マシンでのJavaインストールの検証
コンソールを開き、システムにインストールしたオペレーティングシステムに基づいてjavaコマンドを実行します。
OS | Task | Command |
---|---|---|
Windows | Open Command Console | c:\> java -version |
Linux | Open Command Terminal | $ java -version |
Mac | Open Terminal | machine:~ joseph$ java -version |
すべてのオペレーティングシステムの出力を確認しましょう-
OS | Output |
---|---|
Windows |
java version "1.7.0_25" Java(TM)SEランタイム環境(ビルド1.7.0_25-b15) Java HotSpot(TM)64ビットサーバーVM(ビルド23.25-b01、混合モード) |
Linux |
java version "1.7.0_25" Java(TM)SEランタイム環境(ビルド1.7.0_25-b15) Java HotSpot(TM)64ビットサーバーVM(ビルド23.25-b01、混合モード) |
Mac |
java version "1.7.0_25" Java(TM)SEランタイム環境(ビルド1.7.0_25-b15) Java HotSpot(TM)64ビットサーバーVM(ビルド23.25-b01、混合モード) |
Javaがない場合は、https://www.oracle.com/technetwork/java/javase/downloads/indexlからJava Software Development Kit(SDK)をインストールします。 このチュートリアルのインストールバージョンとしてJava 1.7.0_25を想定しています。
ステップ2:JAVA環境を設定する
*JAVA_HOME* 環境変数を、Javaがマシンにインストールされているベースディレクトリの場所を指すように設定します。 例えば、
OS | Output |
---|---|
Windows | Set the environment variable JAVA_HOME to C:\Program Files\Java\jdk1.7.0_25. |
Linux | Export JAVA_HOME=/usr/local/java-current. |
Mac | Export JAVA_HOME=/Library/Java/Home. |
Javaコンパイラの場所をシステムパスに追加します。
OS | Output |
---|---|
Windows | Append the string C:\Program Files\Java\jdk1.7.0_25\bin at the end of the system variable, Path. |
Linux | Export PATH=$PATH:$JAVA_HOME/bin/ |
Mac | Not required |
上記の説明に従って、コマンド java -version を使用してJavaインストールを確認します。
ステップ3:TestNGアーカイブをダウンロードする
TestNG jarファイルの最新バージョンをhttp://testng.org/doc/downloadl[http://www.testng.org]からダウンロードします。 このチュートリアルを書いている時点で、_testng-6.8.jar_をダウンロードし、C:\> TestNGフォルダーにコピーしました。
OS | Archive name |
---|---|
Windows | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
ステップ4:TestNG環境を設定する
*TESTNG_HOME* 環境変数を設定して、マシン上のTestNG jarが保存されているベースディレクトリの場所を指すようにします。 次の表は、testng-6.8.jarをC:\> TestNGの場所に保存したと仮定して、Windows、Linux、およびMacで環境変数を設定する方法を示しています。
OS | Description |
---|---|
Windows | Set the environment variable TESTNG_HOME to C:\TESTNG. |
Linux | Export TESTNG_HOME=/usr/local/TESTNG |
Mac | Export TESTNG_HOME=/Library/TESTNG |
ステップ5:CLASSPATH変数を設定する
TestNG jarの場所を指すように CLASSPATH 環境変数を設定します。
OS | Description |
---|---|
Windows | Set the environment variable CLASSPATH to %CLASSPATH%;%TESTNG_HOME%\testng-6.8.jar. |
Linux | Export CLASSPATH=$CLASSPATH:$TESTNG_HOME/testng-6.8.jar. |
Mac | Export CLASSPATH=$CLASSPATH:$TESTNG_HOME/testng-6.8.jar. |
ステップ6:TestNGセットアップのテスト
- C:\> TestNG_WORKSPACE。*にTestNGSimpleTestという名前のJavaクラスファイルを作成します。
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class TestNGSimpleTest {
@Test
public void testAdd() {
String str = "TestNG is working fine";
AssertEquals("TestNG is working fine", str);
}
}
TestNGは、いくつかの異なる方法で呼び出すことができます-
- testng.xmlファイル。
- ANT付き。 *コマンドラインから
testng.xmlファイルを使用して呼び出しましょう。* C:\> TestNG_WORKSPACE *にtestng.xmlという名前のxmlファイルを作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestNGSimpleTest"/>
</classes>
</test>
</suite>
ステップ7:結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
C:\TestNG_WORKSPACE>javac TestNGSimpleTest.java
今、testng.xmlを呼び出して結果を確認します-
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG-テストの作成
TestNGでテストを作成するには、基本的に次の手順が必要です-
- テストのビジネスロジックを記述し、コードにTestNG注釈を挿入します。
- テストに関する情報を追加します(例: クラス名、実行したいグループなど)testng.xmlファイルまたはbuild.xmlで。
- TestNGを実行します。
ここでは、POJOクラス、ビジネスロジッククラス、およびTestNGによって実行されるテストxmlを使用したTestNGテストの完全な例を確認します。
*C:\> TestNG_WORKSPACE* に *EmployeeDetails.java* を作成します。これはPOJOクラスです。
public class EmployeeDetails {
private String name;
private double monthlySalary;
private int age;
//@return the name
public String getName() {
return name;
}
//@param name the name to set
public void setName(String name) {
this.name = name;
}
//@return the monthlySalary
public double getMonthlySalary() {
return monthlySalary;
}
//@param monthlySalary the monthlySalary to set
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
//@return the age
public int getAge() {
return age;
}
//@param age the age to set
public void setAge(int age) {
this.age = age;
}
}
*EmployeeDetails* クラスを使用して-
- 従業員の名前の値を取得/設定します。
- 従業員の月給の値を取得/設定します。
- 従業員の年齢の値を取得/設定します。
ビジネスロジックを含む C:\> TestNG_WORKSPACE に EmpBusinessLogic.java を作成します。
public class EmpBusinessLogic {
//Calculate the yearly salary of employee
public double calculateYearlySalary(EmployeeDetails employeeDetails) {
double yearlySalary = 0;
yearlySalary = employeeDetails.getMonthlySalary() * 12;
return yearlySalary;
}
//Calculate the appraisal amount of employee
public double calculateAppraisal(EmployeeDetails employeeDetails) {
double appraisal = 0;
if(employeeDetails.getMonthlySalary() < 10000) {
appraisal = 500;
} else {
appraisal = 1000;
}
return appraisal;
}
}
*EmpBusinessLogic* クラスは計算に使用されます-
- 従業員の年sal。
- 従業員の評価額。
それでは、C:\> TestNG_WORKSPACEに TestEmployeeDetails.java というTestNGクラスを作成しましょう。 TestNGクラスは、少なくとも1つのTestNGアノテーションを含むJavaクラスです。 このクラスには、テストするテストケースが含まれます。 TestNGテストは、@ BeforeXXXおよび@AfterXXXアノテーション(この章のリンク:/testng/testng_execution_procedure [TestNG-Execution Procedure]で確認できます)によって構成できます。これにより、特定のポイントの前後にJavaロジックを実行できます。
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestEmployeeDetails {
EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
EmployeeDetails employee = new EmployeeDetails();
@Test
public void testCalculateAppriasal() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double appraisal = empBusinessLogic.calculateAppraisal(employee);
Assert.assertEquals(500, appraisal, 0.0, "500");
}
//Test to check yearly salary
@Test
public void testCalculateYearlySalary() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double salary = empBusinessLogic.calculateYearlySalary(employee);
Assert.assertEquals(96000, salary, 0.0, "8000");
}
}
*TestEmployeeDetails* クラスは、 *EmpBusinessLogic* クラスのメソッドのテストに使用されます。 それは次のことを行います-
- 従業員の年salをテストします。
- 従業員の評価額をテストします。
テストを実行する前に、testng.xmlという名前の特別なXMLファイルを使用してTestNGを構成する必要があります。 このファイルの構文は非常に単純で、その内容は次のとおりです。 このファイルを C:\> TestNG_WORKSPACE に作成します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestEmployeeDetails"/>
</classes>
</test>
</suite>
上記のファイルの詳細は次のとおりです-
- スイートは1つのXMLファイルで表されます。 1つ以上のテストを含めることができ、<suite>タグによって定義されます。
- タグ<test>は1つのテストを表し、1つ以上のTestNGクラスを含めることができます。
- <class>タグはTestNGクラスを表します。 これは、少なくとも1つのTestNGアノテーションを含むJavaクラスです。 1つ以上のテストメソッドを含めることができます。
javacを使用してテストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac EmployeeDetails.java EmpBusinessLogic.java TestEmployeeDetails.java
今、次のコマンドでTestNG-
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
すべてが正しく行われた場合、コンソールにテストの結果が表示されます。 さらに、TestNGは test-output というフォルダーに非常に素晴らしいHTMLレポートを作成します。このフォルダーは現在のディレクトリに自動的に作成されます。 それを開いてindexlをロードすると、下の画像のようなページが表示されます-
TestNG-基本的な注釈
JUnit 3でテストメソッドを示す従来の方法は、名前の前にtestを付けることです。 これは、クラス内の特定のメソッドに特別な意味があるとタグ付けするための非常に効果的なメソッドですが、ネーミングはあまりうまくスケールしません(異なるフレームワークにさらにタグを追加したい場合はどうでしょうか?)追加のパラメーターをテストフレームワークに渡したいですか?)。
JDK 5ではJava言語に注釈が正式に追加され、TestNGは注釈を使用してテストクラスに注釈を付けることを選択しました。
TestNGがサポートする注釈のリストは次のとおりです-
Sr.No. | Annotation & Description |
---|---|
1 |
@BeforeSuite 注釈付きメソッドは、このスイートのすべてのテストが実行される前に一度だけ実行されます。 |
2 |
@AfterSuite 注釈付きメソッドは、このスイートのすべてのテストが実行された後に一度だけ実行されます。 |
3 |
@BeforeClass 注釈付きメソッドは、現在のクラスの最初のテストメソッドが呼び出される前に1回だけ実行されます。 |
4 |
@AfterClass 注釈付きメソッドは、現在のクラスのすべてのテストメソッドが実行された後に1回だけ実行されます。 |
5 |
@BeforeTest 注釈付きメソッドは、<test>タグ内のクラスに属するテストメソッドが実行される前に実行されます。 |
6 |
@AfterTest 注釈付きメソッドは、<test>タグ内のクラスに属するすべてのテストメソッドが実行された後に実行されます。 |
7 |
@BeforeGroups この構成メソッドが以前に実行されるグループのリスト。 このメソッドは、これらのグループのいずれかに属する最初のテストメソッドが呼び出される直前に実行されることが保証されています。 |
8 |
@AfterGroups この構成メソッドが実行されるグループのリスト。 このメソッドは、これらのグループのいずれかに属する最後のテストメソッドが呼び出された直後に実行されることが保証されています。 |
9 |
@BeforeMethod 注釈付きメソッドは、各テストメソッドの前に実行されます。 |
10 |
@AfterMethod 注釈付きメソッドは、各テストメソッドの後に実行されます。 |
11 |
@DataProvider メソッドをテストメソッドのデータを提供するものとしてマークします。 注釈付きメソッドは、Object [] []を返す必要があります。各Object []には、テストメソッドのパラメーターリストを割り当てることができます。 このDataProviderからデータを受信する@Testメソッドは、このアノテーションの名前と等しいdataProvider名を使用する必要があります。 |
12 |
@Factory TestNGがTestクラスとして使用するオブジェクトを返すファクトリとしてメソッドをマークします。 メソッドはObject []を返す必要があります。 |
13 |
@Listeners テストクラスのリスナーを定義します。 |
14 |
@Parameters @Testメソッドにパラメーターを渡す方法を説明します。 |
15 |
@Test クラスまたはメソッドをテストの一部としてマークします。 |
注釈を使用する利点
以下は、注釈を使用する利点の一部です-
- TestNGは、アノテーションを検索することにより、関心のあるメソッドを識別します。 したがって、メソッド名はパターンや形式に制限されません。
- 追加のパラメーターを注釈に渡すことができます。
- 注釈は強く型付けされているため、コンパイラは間違いをすぐに報告します。
- テストクラスは何も拡張する必要がなくなりました(JUnit 3のTestCaseなど)。
TestNG-実行手順
この章では、TestNGのメソッドの実行手順について説明します。 呼び出されるメソッドの順序を説明します。 次に、TestNGテストAPIメソッドの実行手順と例を示します。
*C:\> TestNG_WORKSPACE* にJavaクラスファイル名 *TestngAnnotation.java* を作成して、注釈をテストします。
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;
public class TestngAnnotation {
//test case 1
@Test
public void testCase1() {
System.out.println("in test case 1");
}
//test case 2
@Test
public void testCase2() {
System.out.println("in test case 2");
}
@BeforeMethod
public void beforeMethod() {
System.out.println("in beforeMethod");
}
@AfterMethod
public void afterMethod() {
System.out.println("in afterMethod");
}
@BeforeClass
public void beforeClass() {
System.out.println("in beforeClass");
}
@AfterClass
public void afterClass() {
System.out.println("in afterClass");
}
@BeforeTest
public void beforeTest() {
System.out.println("in beforeTest");
}
@AfterTest
public void afterTest() {
System.out.println("in afterTest");
}
@BeforeSuite
public void beforeSuite() {
System.out.println("in beforeSuite");
}
@AfterSuite
public void afterSuite() {
System.out.println("in afterSuite");
}
}
次に、 C:\> TestNG_WORKSPACE に testng.xml ファイルを作成して、注釈を実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestngAnnotation"/>
</classes>
</test>
</suite>
javacを使用してテストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac TestngAnnotation.java
ここで、指定されたテストケースクラスで定義されたテストケースを実行するtestng.xmlを実行します。
C:\TestNG_WORKSPACE>java org.testng.TestNG testng.xml
出力を確認します。
in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite
===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
上記の出力に基づいて、実行手順は次のとおりです-
- まず、beforeSuite()メソッドは1回だけ実行されます。
- 最後に、afterSuite()メソッドは1回だけ実行されます。
- メソッドbeforeTest()、beforeClass()、afterClass()、およびafterTest()のメソッドも一度だけ実行されます。
- beforeMethod()メソッドは、各テストケースに対して実行されますが、テストケースを実行する前に実行されます。
- afterMethod()メソッドは、各テストケースに対して実行されますが、テストケースの実行後に実行されます。
- beforeMethod()とafterMethod()の間で、各テストケースが実行されます。
TestNG-テストの実行
テストケースは TestNG クラスを使用して実行されます。 このクラスは、TestNGフレームワークでテストを実行するための主要なエントリポイントです。 ユーザーは、独自のTestNGオブジェクトを作成し、次のようなさまざまな方法で呼び出すことができます-
- 既存のtestng.xmlで。
- 完全にJavaから作成された合成testng.xml上。
- テストクラスを直接設定する。
また、どのグループを含めるか除外するか、パラメータを割り当てるなどを定義できます。 コマンドラインパラメータは-
- -d outputdir:出力ディレクトリを指定します。
- -testclass class_name:1つまたは複数のクラス名を指定します。
- -testjar jar_name:テストを含むjarを指定します。
- -sourcedir src1; src2:;ソースディレクトリの分離されたリスト(javadoc注釈が使用される場合にのみ使用)。
- -ターゲット
- -グループ
- -testrunfactory
- -リスナー
以下の例では、TestNGオブジェクトと既存のtestng.xmlを作成します。
クラスを作成する
*C:\> TestNG_WORKSPACE* に *MessageUtil.java* などのテスト対象のJavaクラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public String printMessage() {
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
SampleTest.java などのJavaテストクラスを作成します。
テストメソッドtestPrintMessage()をテストクラスに追加します。
注釈@TestをメソッドtestPrintMessage()に追加します。
テスト条件を実装し、TestNGのassertEquals APIを使用して条件を確認します。
*C:\> TestNG_WORKSPACE* にSampleTest.javaというJavaクラスファイルを作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class SampleTest {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message, messageUtil.printMessage());
}
}
testng.xmlを作成する
次に、 C:\> TestNG_WORKSPACE にtestng.xmlファイルを作成して、テストケースを実行します。 このファイルは、テスト全体をXMLでキャプチャします。 このファイルを使用すると、すべてのテストスイートとそのパラメーターを1つのファイルに簡単に記述でき、コードリポジトリで確認したり、同僚に電子メールで送信したりできます。 また、テストのサブセットを簡単に抽出したり、複数のランタイム構成を分割したりできます(たとえば、testngdatabase.xmlはデータベースを実行するテストのみを実行します)。
<?xml version = "1.0" encoding = "UTF-8"?>
<suite name = "Sample test Suite">
<test name = "Sample test">
<classes>
<class name = "SampleTest"/>
</classes>
</test>
</suite>
javacを使用してテストケースをコンパイルします。
C:\TestNG_WORKSPACE>javac MessageUtil.java SampleTest.java
次に、testng.xmlを実行します。これにより、<test>タグで定義されたテストケースが実行されます。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
Hello World
===============================================
Sample test Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG-スイートテスト
- テストスイート*は、ソフトウェアプログラムの動作または一連の動作をテストすることを目的としたテストケースのコレクションです。 TestNGでは、テストソースコードでスイートを定義できませんが、スイートは実行の機能であるため、1つのXMLファイルで表されます。 また、_tests_の柔軟な構成を実行できます。 スイートには1つ以上のテストを含めることができ、<suite>タグによって定義されます。
<suite>は、testng.xmlのルートタグです。 テストスイートについて説明します。テストスイートは、いくつかの<test>セクションで構成されています。
次の表に、<suite>が受け入れるすべての有効な属性を示します。
Sr.No. | Attribute & Description |
---|---|
1 |
name このスイートの名前。 これは*必須*属性です。 |
2 |
verbose この実行のレベルまたは詳細度。 |
3 |
parallel このスイートを実行するためにTestNGが異なるスレッドを実行する必要があるかどうか。 |
4 |
thread-count 並列モードが有効な場合に使用するスレッドの数(それ以外の場合は無視されます)。 |
5 |
annotations テストで使用している注釈のタイプ。 |
6 |
time-out このテストで見つかったすべてのテストメソッドで使用されるデフォルトのタイムアウト。 |
この章では、Test Suiteを使用して一緒に実行するTest1とTest2の2つのテストクラスを持つ例を示します。
クラスを作成する
*C:\> JUNIT_WORKSPACE* に *MessageUtil.java* などのテスト対象のJavaクラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public String printMessage() {
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
*C:\> TestNG_WORKSPACE* に *Test1.java* という名前のJavaクラスファイルを作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test1 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message, messageUtil.printMessage());
}
}
*C:\> TestNG_WORKSPACE* に *Test2.java* という名前のJavaクラスファイルを作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test2 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
さて、testng.xmlを C:\> TestNG_WORKSPACE に書きましょう。これには、次のように<suite>タグが含まれます-
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "exampletest1">
<classes>
<class name = "Test1"/>
</classes>
</test>
<test name = "exampletest2">
<classes>
<class name = "Test2"/>
</classes>
</test>
</suite>
Suite1には exampletest1 および exampletest2 が含まれます。
javacを使用してすべてのJavaクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java
ここで、指定されたテストケースクラスで定義されたテストケースを実行するtestng.xmlを実行します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
_test-output_フォルダーも確認できます。 _Suite1_フォルダの下に、作成された2つのhtmlファイル、exampletest1lとexampletest2lが表示されます。これは次のようになります-
TestNG-テストを無視する
時々、コードの準備ができておらず、そのメソッド/コードをテストするために書かれたテストケースが失敗することがあります。 このような場合、注釈* @ Test(enabled = false)*は、このテストケースを無効にするのに役立ちます。
テストメソッドに_ @ Test(enabled = false)_の注釈が付けられている場合、テストの準備ができていないテストケースはバイパスされます。
それでは、@ Test(enabled = false)の動作を見てみましょう。
クラスを作成する
*C:\> TestNG_WORKSPACE* に *MessageUtil.java* などのテスト対象のJavaクラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public String printMessage() {
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
IgnoreTest.java などのJavaテストクラスを作成します。
テストメソッドtestPrintMessage()およびtestSalutationMessage()をテストクラスに追加します。
注釈@Test(enabled = false)をメソッドtestPrintMessage()に追加します。
*C:\> TestNG_WORKSPACE* に *IgnoreTest.java* という名前のJavaクラスファイルを作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class IgnoreTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(enabled = false)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
}
testng.xmlを作成する
*C:\> TestNG_WORKSPACE* にtestng.xmlを作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "IgnoreTest"/>
</classes>
</test>
</suite>
javacを使用してMessageUtilクラスとテストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac MessageUtil.java IgnoreTest.java
ここで、testng.xmlを実行します。これは、指定されたテストケースクラスで定義されたテストケースtestPrintMessage()を実行しません。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。 testPrintMessage()テストケースはテストされていません。
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
次の章で説明するテストのグループを無視することもできます。
TestNG-グループテスト
グループテストはTestNGの新しい革新的な機能であり、JUnitフレームワークには存在しません。 メソッドを適切な部分にディスパッチし、テストメソッドの高度なグループ化を実行できます。
グループに属するメソッドを宣言できるだけでなく、他のグループを含むグループを指定することもできます。 次に、TestNGを呼び出して、特定のグループセット(または正規表現)を含めるように要求し、別のセットを除外することができます。
グループテストは、テストの分割方法に最大限の柔軟性を提供します。2つの異なるテストセットを連続して実行する場合、何も再コンパイルする必要はありません。
グループは、<groups>タグを使用してtestng.xmlファイルで指定されます。 <test>または<suite>タグの下にあります。 <suite>タグで指定されたグループは、その下のすべての<test>タグに適用されます。
次に、グループテストの動作を確認する例を見てみましょう。
クラスを作成する
- C:\> TestNG_WORKSPACE に MessageUtil.java などのテスト対象のJavaクラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public String printMessage() {
System.out.println(message);
return message;
}
//add "finddevguides" to the message
public String salutationMessage() {
message = "finddevguides" + message;
System.out.println(message);
return message;
}
//add "www." to the message
public String exitMessage() {
message = "www." + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
GroupTestExample.javaなどのJavaテストクラスを作成します。
テストメソッドtestPrintMessage()およびtestSalutationMessage()をテストクラスに追加します。
2つのカテゴリにテスト方法をグループ化します-
チェックインテスト(checkintest)-新しいコードを送信する前に、これらのテストを実行する必要があります。 通常は高速で、基本的な機能が壊れていないことを確認してください。
機能テスト(functest)-これらのテストは、ソフトウェアのすべての機能をカバーし、少なくとも1日に1回実行する必要がありますが、理想的には継続的に実行することをお勧めします。
*GroupTestExample.java* という名前のJavaクラスファイルを *C:\> TestNG_WORKSPACE* に作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class GroupTestExample {
String message = ".com";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "functest", "checkintest" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = ".com";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(groups = { "checkintest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "finddevguides" + ".com";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "functest" })
public void testingExitMessage() {
System.out.println("Inside testExitMessage()");
message = "www." + "finddevguides"+".com";
Assert.assertEquals(message, messageUtil.exitMessage());
}
}
testng.xmlを作成する
テストケースを実行するには、 C:\> TestNG_WORKSPACE にtestng.xmlを作成します。 ここでは、グループ_functest_に属するテストのみを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<run>
<include name = "functest"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample"/>
</classes>
</test>
</suite>
javacを使用して、MessageUtil、テストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac MessageUtil.java GroupTestExample.java
次に、testng.xmlを実行します。これは、グループ_functest_に属しているため、メソッドtestPrintMessage()のみを実行します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。 メソッドtestPrintMessage()のみが実行されます。
Inside testPrintMessage()
.com
Inside testExitMessage()
www..com
===============================================
Suite1
Total tests run: 2, Failures: 1, Skips: 0
===============================================
グループのグループ
グループには他のグループを含めることもできます。 これらのグループは MetaGroups と呼ばれます。 たとえば、_checkintest_および_functest_を含むグループ_all_を定義できます。 次のようにtestng.xmlファイルを変更しましょう-
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<include name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample"/>
</classes>
</test>
</suite>
上記のtestng.xmlを実行すると、3つのテストすべてが実行され、次の結果が得られます-
Inside testPrintMessage()
.com
Inside testSalutationMessage()
finddevguides.com
Inside testExitMessage()
www.finddevguides.com
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
除外グループ
以下に示すように、<exclude>タグを使用してグループを無視できます-
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<exclude name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample"/>
</classes>
</test>
</suite>
TestNG-例外テスト
TestNGは、コードの例外処理をトレースするオプションを提供します。 コードが目的の例外をスローするかどうかをテストできます。 ここで、 expectedExceptions パラメーターは@Testアノテーションとともに使用されます。 それでは、動作中の* @ Test(expectedExceptions)*を見てみましょう。
クラスを作成する
*C:\> TestNG_WORKSPACE* に *MessageUtil.java* などのテスト対象のJavaクラスを作成します。 printMessage()メソッド内にエラー条件を追加します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public void printMessage() {
System.out.println(message);
int a =0;
int b = 1/a;
}
//add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
ExpectedExceptionTest.java などのJavaテストクラスを作成します。
予期される例外ArithmeticExceptionをtestPrintMessage()テストケースに追加します。
*ExpectedExceptionTest.java* という名前のJavaクラスファイルを *C:\> TestNG_WORKSPACE* に作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class ExpectedExceptionTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(expectedExceptions = ArithmeticException.class)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
テストランナーを作成する
*C:\> TestNG_WORKSPACE* にtestng.xmlを作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ExpectedExceptionTest"/>
</classes>
</test>
</suite>
javacを使用して、MessageUtil、テストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac MessageUtil.java TestJunit.java
次に、提供されたテストケースクラスで定義されたテストケースを実行するテストランナーを実行します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。 testPrintMessage()テストケースが渡されます。
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
TestNG-依存関係テスト
テストケース内のメソッドを特定の順序で呼び出す必要がある場合や、メソッド間でデータと状態を共有したい場合があります。 この種の依存関係は、テストメソッド間の明示的な依存関係の宣言をサポートするため、TestNGでサポートされています。
TestNGでは、次のいずれかの方法で依存関係を指定できます-
- @Testアノテーションで属性_dependsOnMethods_を使用、または。
- @Testアノテーションで_dependsOnGroups_属性を使用します。
_dependsOnMethods_を使用した例
クラスを作成する
*C:\> TestNG_WORKSPACE* に *MessageUtil.java* などのテスト対象のJavaクラスを作成します。
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public String printMessage() {
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
DependencyTestUsingAnnotation.javaなどのJavaテストクラスを作成します。
テストクラスにテストメソッドtestPrintMessage()とtestSalutationMessage()、およびinitEnvironmentTest()を追加します。
属性 dependsOnMethods = \ {"initEnvironmentTest"} を* testSalutationMessage()*メソッドの@Testアノテーションに追加します。
*C:\> TestNG_WORKSPACE* にJavaクラスファイル名 *DependencyTestUsingAnnotation.java* を作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnMethods = { "initEnvironmentTest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
testng.xmlを作成する
*C:\> TestNG_WORKSPACE* にtestng.xmlを作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation"/>
</classes>
</test>
</suite>
javacを使用して、MessageUtil、テストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
次に、testng.xmlを実行します。これは、initEnvironmentTest()メソッドの実行後にのみtestSalutationMessage()メソッドを実行します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
_dependsOnGroups_を使用した例
グループ全体に依存するメソッドを持つこともできます。 これを実証する例があります。
クラスを作成する
*C:\> TestNG_WORKSPACE* に *MessageUtil.java* などのテスト対象のJavaクラスを作成します。
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public String printMessage() {
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
テストケースクラスを作成する
DependencyTestUsingAnnotation.javaなどのJavaテストクラスを作成します。
テストメソッド、testPrintMessage()、testSalutationMessage()、およびinitEnvironmentTest()をテストクラスに追加し、それらをグループ「init」に追加します。
属性* dependsOnMethods = \ {"init。"} *を testSalutationMessage()*メソッドの@Testアノテーションに追加します。
*DependencyTestUsingAnnotation.java* という名前のJavaクラスファイルを *C:\> TestNG_WORKSPACE* に作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "init" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnGroups = { "init.*" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "init" })
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
この例では、testSalutationMessage()はグループに依存するものとして宣言され、「init。*」という正規表現と一致します。これにより、testSalutationMessage()の前にtestPrintMessage()およびinitEnvironmentTest()メソッドが常に呼び出されます。
依存するメソッドが失敗し、それに強い依存関係がある場合(alwaysRun = false、デフォルト)、それに依存するメソッドはFAILではなくSKIPとしてマークされます。 スキップされたメソッドは最終レポートでそのように報告されます(HTMLで赤でも緑でもない色で)。これは、スキップされたメソッドが必ずしも失敗ではないため重要です。
testng.xmlを作成する
*C:\> TestNG_WORKSPACE* にtestng.xmlを作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation"/>
</classes>
</test>
</suite>
javacを使用して、MessageUtil、テストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
次に、testinit.xmlを実行します。これは、_initEnvironmentTest()_メソッドの実行後にのみ_testSalutationMessage()_メソッドを実行します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
dependsOnGroups_対_dependsOnMethods
- グループを使用すると、リファクタリングの問題にさらされなくなります。 dependOnGroupsまたはgroups属性を変更しない限り、適切な依存関係を設定してテストを実行し続けます。
- 依存関係グラフに新しいメソッドを追加する必要があるときはいつでも、適切なグループにそれを配置し、正しいグループに依存することを確認するだけです。 他の方法を変更する必要はありません。
TestNG-パラメーター化されたテスト
TestNGで利用できるもう1つの興味深い機能は、*パラメトリックテスト*です。 ほとんどの場合、ビジネスロジックが非常に多様な数のテストを必要とするシナリオに遭遇します。 *パラメータ化されたテスト*により、開発者は異なる値を使用して同じテストを繰り返し実行できます。
TestNGでは、2つの異なる方法でテストメソッドにパラメーターを直接渡すことができます-
- testng.xmlを使用
- データプロバイダーを使用
_testng.xml_でパラメーターを渡す
この手法では、_testng.xml_ファイルで単純なパラメーターを定義し、ソースファイルでそれらのパラメーターを参照します。 この手法を使用してパラメーターを渡す方法を示す例を示します。
テストケースクラスを作成する
ParameterizedTest1.javaなどのJavaテストクラスを作成します。
テストクラスにテストメソッドparameterTest()を追加します。 このメソッドは、入力パラメーターとして文字列を取ります。
このメソッドに注釈_ @ Parameters( "myName")_を追加します。 このパラメーターにはtestng.xmlから値が渡されます。これについては次のステップで説明します。
*Parameter:Test1.java* という名前のJavaクラスファイルを *C:\> TestNG_WORKSPACE* に作成します。
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParameterizedTest1 {
@Test
@Parameters("myName")
public void parameterTest(String myName) {
System.out.println("Parameterized value is : " + myName);
}
}
testng.xmlを作成する
*C:\> TestNG_WORKSPACE* にtestng.xmlを作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<parameter name = "myName" value="manisha"/>
<classes>
<class name = "ParameterizedTest1"/>
</classes>
</test>
</suite>
<suite>レベルでパラメーターを定義することもできます。 <suite>レベルと<test>レベルの両方で_myName_を定義したとします。 そのような場合、通常のスコープ規則が適用されます。 つまり、<test>タグ内のクラスは<test>で定義されたパラメーターの値を参照し、testng.xmlファイルの残りのクラスは<suite>で定義された値を参照します。
javacを使用してテストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac ParameterizedTest1.java
ここで、_parameterTest_メソッドを実行するtestng.xmlを実行します。 TestNGは、最初に<test>タグで_myName_という名前のパラメーターを見つけようとし、それが見つからない場合は、それを囲む<suit>タグで検索します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
Parameterized value is : manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNGは、testng.xmlで指定された値をパラメーターの型に自動的に変換しようとします。 サポートされているタイプは次のとおりです-
- ひも
- int/整数
- ブール/ブール
- バイト/バイト
- 文字/文字
- ダブル/ダブル
- フロート/フロート
- ロング/ロング
- ショート/ショート
_Dataproviders_を使用してパラメーターを渡す
複雑なパラメーターまたはJavaから作成する必要があるパラメーター(複雑なオブジェクト、プロパティファイルまたはデータベースから読み取ったオブジェクトなど)を渡す必要がある場合、Dataprovidersを使用してパラメーターを渡すことができます。
データプロバイダーは、 @ DataProvider アノテーションが付けられたメソッドです。 この注釈には、名前というストリング属性が1つだけあります。 名前が指定されていない場合、データプロバイダーの名前は自動的にメソッドの名前にデフォルト設定されます。 データプロバイダーは、オブジェクトの配列を返します。
次の例は、データプロバイダーの使用方法を示しています。 最初の例は、Vector、String、またはIntegerをパラメーターとして使用する@DataProviderについてであり、2番目の例は、オブジェクトをパラメーターとして使用する@DataProviderについてです。
例1
ここで、@ DataProviderは整数とブール値をパラメーターとして渡します。
- Javaクラスを作成 *
PrimeNumberChecker.javaというJavaクラスを作成します。 このクラスは、数値が素数かどうかを確認します。* C:\> TestNG_WORKSPACE *にこのクラスを作成します。
public class PrimeNumberChecker {
public Boolean validate(final Integer primeNumber) {
for (int i = 2; i < (primeNumber/2); i++) {
if (primeNumber % i == 0) {
return false;
}
}
return true;
}
}
テストケースクラスの作成
ParamTestWithDataProvider1.javaなどのJavaテストクラスを作成します。
メソッドprimeNumbers()を定義します。これは、アノテーションを使用してデータプロバイダーとして定義されます。 このメソッドは、オブジェクトの配列を返します。
テストメソッドtestPrimeNumberChecker()をテストクラスに追加します。 このメソッドは、入力パラメーターとして整数とブール値を取ります。 このメソッドは、渡されたパラメーターが素数かどうかを検証します。
このメソッドに注釈_ @ Test(dataProvider = "test1")_を追加します。 属性dataProviderは「test1」にマップされます。
*ParamTestWithDataProvider1.java* という名前のJavaクラスファイルを *C:\> TestNG_WORKSPACE* に作成します。
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider1 {
private PrimeNumberChecker primeNumberChecker;
@BeforeMethod
public void initialize() {
primeNumberChecker = new PrimeNumberChecker();
}
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
}
//This test will run 4 times since we have 5 parameters defined
@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
System.out.println(inputNumber + " " + expectedResult);
Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
}
}
- testng.xmlを作成 *
testng.xml* C:\> TestNG_WORKSPACE *を作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider1"/>
</classes>
</test>
</suite>
javacを使用してテストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
次に、testng.xmlを実行します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
2 true
6 false
19 true
22 false
23 true
===============================================
Suite1
Total tests run: 5, Failures: 0, Skips: 0
===============================================
例2
ここでは、@ DataProviderはObjectをパラメーターとして渡します。
Javaクラスを作成*
*C:\> TestNG_WORKSPACE* に、get/setメソッドを持つ単純なオブジェクトであるJavaクラスBean.javaを作成します。
public class Bean {
private String val;
private int i;
public Bean(String val, int i) {
this.val = val;
this.i = i;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
テストケースクラスの作成
ParamTestWithDataProvider2.javaなどのJavaテストクラスを作成します。
注釈を使用してデータプロバイダーとして定義されているメソッドprimeNumbers()を定義します。 このメソッドは、オブジェクトの配列を返します。
テストメソッドtestMethod()をテストクラスに追加します。 このメソッドは、オブジェクトBeanをパラメーターとして受け取ります。
このメソッドに注釈_ @ Test(dataProvider = "test1")_を追加します。 属性dataProviderは「test1」にマップされます。
*C:\> TestNG_WORKSPACE* にParamTestWithDataProvider2.javaという名前のJavaクラスファイルを作成します。
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider2 {
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] { { new Bean("hi I am the bean", 111) } };
}
@Test(dataProvider = "test1")
public void testMethod(Bean myBean) {
System.out.println(myBean.getVal() + " " + myBean.getI());
}
}
testng.xmlを作成*
*C:\> TestNG_WORKSPACE* にtestng.xmlを作成して、テストケースを実行します。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider2"/>
</classes>
</test>
</suite>
javacを使用してテストケースクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java
次に、testng.xmlを実行します。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
出力を確認します。
hi I am the bean 111
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG-JUnitテストの実行
TestNGとそのさまざまなテストを理解したので、既存のJUnitコードをリファクタリングする方法について心配する必要があります。 TestNGはJUnitからTestNGに自分のペースで移行する方法を提供するため、心配する必要はありません。 TestNGを使用して、既存のJUnitテストケースを実行できます。
TestNGはJUnitテストを自動的に認識して実行できるため、TestNGを既存のすべてのテストのランナーとして使用し、TestNGを使用して新しいテストを作成できます。 必要なことは、JUnitライブラリをTestNGクラスパスに配置することです。そうすると、JUnitクラスを見つけて使用し、テストランナーをAntでJUnitからTestNGに変更し、Testmixを「混合」モードで実行できます。 これにより、同じパッケージ内であっても、すべてのテストを同じプロジェクトに入れて、TestNGの使用を開始できます。 このアプローチにより、既存のJUnitテストを段階的にTestNGに変換することもできます。
TestNGのこの驚くべき能力を実証する例を挙げましょう。
JUnitテストケースクラスの作成
*C:\> TestNG_WORKSPACE* にJUnitテストクラスTestJunit.javaであるJavaクラスを作成します。
import org.junit.Test;
import static org.testng.AssertJUnit.assertEquals;
public class TestJunit {
@Test
public void testAdd() {
String str = "Junit testing using TestNG";
AssertEquals("Junit testing using TestNG",str);
}
}
さて、testng.xmlを C:\> TestNG_WORKSPACE に書きましょう。これには、次のように<suite>タグが含まれます-
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name = "Converted JUnit suite" >
<test name = "JUnitTests" junit="true">
<classes>
<class name = "TestJunit"/>
</classes>
</test>
</suite>
JUnitテストケースを実行するには、上記のxmlのようにプロパティ_junit = "true" _を定義します。 JUnitテストケースクラスTestJunitは、クラス名で定義されます。
JUnit 4の場合、TestNGは_org.junit.runner.JUnitCore_ランナーを使用してテストを実行します。
javacを使用してすべてのJavaクラスをコンパイルします。
C:\TestNG_WORKSPACE>javac TestJunit.java
次に、testng.xmlを実行します。これにより、JUnitテストケースがTestNGとして実行されます。
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE:C:\TestNG_WORKSPACE\lib\junit-4.11.jar" org.testng.TestNG testng.xml
ここでは、junit-4.11.jarをC:\ TestNG_WORKSPACE \ lib \ junit-4.11.jarの下に配置しました。
出力を確認します。
===============================================
Converted JUnit suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG-テスト結果
レポートは、テスト実行の結果、障害点、および障害の理由をユーザーが理解するのに役立つため、テスト実行の最も重要な部分です。 一方、ロギングは、実行フローを監視したり、障害が発生した場合のデバッグを行うために重要です。
TestNGは、デフォルトで、テスト実行用に異なるタイプのレポートを生成します。 これには、HTMLおよびXMLレポート出力が含まれます。 TestNGでは、ユーザーが独自のレポーターを作成してTestNGで使用することもできます。 実行時にTestNGによって通知される独自のロガーを作成するオプションもあります。
TestNGでレポートを生成する方法は2つあります-
- リスナー-リスナークラスを実装するために、クラスは_org.testng.ITestListener_インターフェースを実装する必要があります。 これらのクラスは、テストの開始、終了、失敗、スキップ、または合格時に、TestNGによって実行時に通知されます。
- Reporters -レポートクラスを実装するために、クラスは_org.testng.IReporter_インターフェイスを実装する必要があります。 これらのクラスは、スイート全体の実行が終了すると呼び出されます。 テスト実行全体の情報を含むオブジェクトは、呼び出されるとこのクラスに渡されます。
この章では、レポートとロギングの4つの異なるケースを示す4つの異なる例を示します-
Sr.No. | Case & Example |
---|---|
1 |
この例は、独自のロガーを作成する方法を示しています。 |
2 |
この例は、独自のレポーターを作成する方法を示しています。 |
3 |
この例は、TestNGによって生成されたデフォルトのHTMLおよびXMLレポートを示しています。 |
4 |
この例は、TestNGレポートからJUnitレポートを生成する方法を示しています。 |
TestNG-ANT付きプラグ
この章では、ANTを使用してTestNGを実行する方法を示します。 以下に示す手順に従ってみましょう-
ステップ1:Apache Antをダウンロードする
[Ant]
OS | Archive Name |
---|---|
Windows | apache-ant-1.8.4-bin.zip |
Linux | apache-ant-1.8.4-bin.tar.gz |
Mac | apache-ant-1.8.4-bin.tar.gz |
ステップ2:Ant環境を設定する
*ANT_HOME* 環境変数を設定して、マシン上のANTライブラリが格納されているベースディレクトリの場所を指定します。 Antライブラリをapache-ant-1.8.4フォルダーに保存したと仮定します。
OS | Output |
---|---|
Windows | Set the environment variable ANT_HOME to C:\Program Files\Apache Software Foundation\apache-ant-1.8.4 |
Linux | Export ANT_HOME=/usr/local/apache-ant-1.8.4 |
Mac | Export ANT_HOME=/Library/apache-ant-1.8.4 |
Antコンパイラの場所を次のようにシステムパスに追加します-
OS | Description |
---|---|
Windows | Append the string %ANT_HOME\bin at the end of the system variable, Path. |
Linux | Export PATH=$PATH:$ANT_HOME/bin/ |
Mac | Not required. |
ステップ3:TestNGアーカイブをダウンロードする
必要なjarファイルをダウンロードしますhttp://www.testng.org [[[1]]]
OS | Archive name |
---|---|
Windows | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
ステップ4:プロジェクト構造を作成する
- C:\> TestNG_WORKSPACE に TestNGWithAnt フォルダーを作成します。
- C:\> TestNG_WORKSPACE> TestNGWithAnt に src フォルダーを作成します。
- C \> TestNG_WORKSPACE> TestNGWithAnt に *test フォルダーを作成します。
- C:\> TestNG_WORKSPACE> TestNGWithAnt に lib フォルダーを作成します。
- C:\> TestNG_WORKSPACE> TestNGWithAnt> src フォルダーに MessageUtil クラスを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public void printMessage() {
System.out.println(message);
return message;
}
//add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
- C:\> TestNG_WORKSPACE> TestNGWithAnt> src フォルダーにTestMessageUtilクラスを作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestMessageUtil {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
- testng-6.8.jarを C:\> TestNG_WORKSPACE> TestNGWithAnt> lib フォルダーにコピーします。
ANT build.xmlを作成します
まず、次のようにTestNG Antタスクを定義する必要があります-
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
次に、Antで <testng> タスクを使用してTestNGテストケースを実行します。
*build.xml* ファイルは次のとおりです-
<project name = "TestNGTest" default = "test" basedir = ".">
<!-- Define <testng> task -->
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
<property name = "testdir" location = "test"/>
<property name = "srcdir" location = "src"/>
<property name = "libdir" location = "lib"/>
<property name = "full-compile" value="true"/>
<path id = "classpath.base"/>
<path id = "classpath.test">
<fileset dir = "${libdir}">
<include name = "**/*.jar"/>
</fileset>
<pathelement location = "${testdir}"/>
<pathelement location = "${srcdir}"/>
<path refid = "classpath.base"/>
</path>
<target name = "clean" >
<delete verbose="${full-compile}">
<fileset dir = "${testdir}" includes="**/*.class"/>
</delete>
</target>
<target name = "compile" depends="clean">
<javac srcdir = "${srcdir}" destdir = "${testdir}" verbose="${full-compile}">
<classpath refid = "classpath.test"/>
</javac>
</target>
<target name = "test" depends="compile">
<testng outputdir = "${testdir}" classpathref="classpath.test">
<xmlfileset dir = "${srcdir}" includes="testng.xml"/>
</testng>
</target>
</project>
次のAntコマンドを実行します。
C:\TestNG_WORKSPACE\TestNGWithAnt>ant
出力を確認します。
test:
[testng] [TestNG] Running:
[testng] C:\TestNG_WORKSPACE\TestNGWithAnt\src\testng.xml
[testng]
[testng] Inside testPrintMessage()
[testng] Manisha
[testng] Inside testSalutationMessage()
[testng] Hi!Manisha
[testng]
[testng] ===============================================
[testng] Plug ANT test Suite
[testng] Total tests run: 2, Failures: 0, Skips: 0
[testng] ===============================================
[testng]
BUILD SUCCESSFUL
Total time: 1 second
TestNG-Eclipseでプラグイン
EclipseでTestNGをセットアップするには、以下の手順に従います-
ステップ1:TestNGアーカイブをダウンロードする
TestNG jarファイルの最新バージョンをhttp://www.testng.orgからダウンロードします
OS | Archive name |
---|---|
Windows | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
上記のJARファイルをC:\> TestNGフォルダーにコピーしたと仮定します。
ステップ2:Eclipse環境を設定する
- Eclipseを開き、プロジェクトを右クリックして、プロパティ→ビルドパス→ビルドパスを構成し、_Add External Jar_ボタンを使用してライブラリにtestng-6.8.jarを追加します。
- EclipseにはTestNGプラグインが組み込まれていると想定しています。利用できない場合は、更新サイトを使用して最新バージョンを入手してください。
- Eclipse IDEで、_Help/Software updates/Find and Install_を選択します。
- インストールする新しい機能を検索します。
- 新しいリモートサイト。
- Eclipse 3.4以降の場合、http://beust.com/eclipseと入力します。
- Eclipse 3.3以前の場合、http://beust.com/eclipse1と入力します。
- URLの横にあるチェックボックスがオンになっていることを確認して、[次へ]をクリックします。
- その後、Eclipseがプロセスをガイドします。
これで、EclipseでTestNGテストケースを開発する準備が整いました。
ステップ3:EclipseでのTestNGインストールの検証
- Eclipseで任意の場所にTestNGProjectプロジェクトを作成します。
- プロジェクトでテストするクラスMessageUtilを作成します。
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message) {
this.message = message;
}
//prints the message
public String printMessage() {
System.out.println(message);
return message;
}
}
- プロジェクトにテストクラスTestNGExampleを作成します。
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestNGExample {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message,messageUtil.printMessage());
}
}
プロジェクトの構造は次のようにする必要があります-
最後に、プログラムを右クリックしてTestNGとして実行し、プログラムの出力を確認します。
結果を確認します。