TestNG-クイックガイド

テストは、アプリケーションの機能をチェックして、要件に従って機能することを確認するプロセスです。単体テストは、開発者レベルで明らかになり、最終製品が要件を満たしていることを確認するために、すべてのエンティティ(クラスまたはメソッド)をテストするための適切な手段が講じられます。

JUnitは、他のテストフレームワークと比較した場合に、テスト、特に単体テストの有用性を理解するように開発者を駆り立てました。JUnitは、かなり単純で実用的で厳密なアーキテクチャを活用して、多数の開発者に「感染」することができました。JUnitの機能をよく理解するには、JUnitのチュートリアルをご覧ください。同時に、JUnitにはいくつかの欠点もあります。以下にリストします。

  • 当初は単体テストのみを有効にするように設計されていましたが、現在はあらゆる種類のテストに使用されています。

  • 依存関係のテストはできません。

  • 不十分な構成制御(setUp / tearDown)。

  • 煩わしい(クラスを拡張し、メソッドに特定の方法で名前を付けることを強制します)。

  • 静的プログラミングモデル(不必要に再コンパイルする必要があります)。

  • 複雑なプロジェクトでのさまざまなテストスイートの管理は、非常に難しい場合があります。

TestNGとは何ですか?

ドキュメントによるTestNGの定義は次のとおりです-

TestNGは、JUnitとNUnitから着想を得たテストフレームワークですが、より強力で使いやすくするためのいくつかの新しい機能が導入されています。

TestNGは、オープンソースの自動テストフレームワークです。どこNG 手段 N内線Gエネレーション。TestNGはJUnit(特にJUnit 4)に似ていますが、JUnit拡張機能ではありません。これはJUnitに触発されています。特に統合クラスをテストする場合は、JUnitよりも優れているように設計されています。TestNGのの作成者があるセドリック・ベウスト

TestNGは、古いフレームワークの制限のほとんどを排除し、開発者がより柔軟で強力なテストを作成できるようにします。テストを定義するためにJavaAnnotations(JDK 5.0で導入)を多用しているため、実際の実稼働環境でJava言語のこの新機能を使用する方法を示すこともできます。

TestNGの機能

  • 注釈をサポートします。

  • TestNGは、より多くのJavaおよびOO機能を使用します。

  • 統合クラスのテストをサポートします(たとえば、デフォルトでは、テストメソッドごとに新しいテストクラスインスタンスを作成する必要はありません)。

  • コンパイル時のテストコードを実行時の構成/データ情報から分離します。

  • 柔軟なランタイム構成。

  • 「テストグループ」を紹介します。テストをコンパイルしたら、TestNGにすべての「フロントエンド」テスト、または「高速」、「低速」、「データベース」テストなどを実行するように依頼できます。

  • 依存テスト方法、並列テスト、負荷テスト、および部分的な障害をサポートします。

  • 柔軟なプラグインAPI。

  • マルチスレッドテストのサポート。

TestNGはJavaのフレームワークであるため、最初の要件はJDKをマシンにインストールすることです。

システム要件

JDK 1.5以上。
記憶 最小要件はありません。
ディスクスペース 最小要件はありません。
オペレーティング・システム 最小要件はありません。

ステップ1-マシンへのJavaのインストールを確認する

コンソールを開き、システムにインストールしたオペレーティングシステムに基づいてJavaコマンドを実行します。

OS 仕事 コマンド
ウィンドウズ コマンドコンソールを開く c:\> java -version
Linux コマンドターミナルを開く $ java -version
マック オープンターミナル マシン:〜joseph $ java -version

すべてのオペレーティングシステムの出力を確認しましょう-

OS 出力
ウィンドウズ

Javaバージョン「1.7.0_25」

Java(TM)SEランタイム環境(ビルド1.7.0_25-b15)

Java HotSpot(TM)64ビットサーバーVM(ビルド23.25-b01、混合モード)

Linux

Javaバージョン「1.7.0_25」

Java(TM)SEランタイム環境(ビルド1.7.0_25-b15)

Java HotSpot(TM)64ビットサーバーVM(ビルド23.25-b01、混合モード)

マック

Javaバージョン「1.7.0_25」

Java(TM)SEランタイム環境(ビルド1.7.0_25-b15)

Java HotSpot(TM)64ビットサーバーVM(ビルド23.25-b01、混合モード)

Javaをお持ちでない場合は、からJavaソフトウェア開発キット(SDK)をインストールしてください。 https://www.oracle.com/technetwork/java/javase/downloads/index.html。このチュートリアルのインストールバージョンとして、Java1.7.0_25を想定しています。

ステップ2:JAVA環境を設定する

をセットする JAVA_HOMEJavaがマシンにインストールされているベースディレクトリの場所を指す環境変数。例えば、

OS 出力
ウィンドウズ 環境変数JAVA_HOMEをC:\ Program Files \ Java \ jdk1.7.0_25に設定します。
Linux JAVA_HOME = / usr / local / java-currentをエクスポートします。
マック JAVA_HOME = / Library / Java / Homeをエクスポートします。

Javaコンパイラの場所をシステムパスに追加します。

OS 出力
ウィンドウズ システム変数Pathの最後に文字列C:\ Program Files \ Java \ jdk1.7.0_25 \ binを追加します。
Linux PATH =をエクスポートします$PATH:$JAVA_HOME / bin /
マック 不要

コマンドを使用してJavaのインストールを確認する java -version 上で説明したように。

ステップ3:TestNGアーカイブをダウンロードする

TestNGjarファイルの最新バージョンをからダウンロードします。 http://www.testng.org。このチュートリアルの執筆時点で、testng-6.8.jarをダウンロードし、C:\> TestNGフォルダーにコピーしました。

OS アーカイブ名
ウィンドウズ testng-6.8.jar
Linux testng-6.8.jar
マック testng-6.8.jar

ステップ4:TestNG環境を設定する

をセットする TESTNG_HOMETestNGjarがマシンに保存されているベースディレクトリの場所を指す環境変数。次の表は、testng-6.8.jarをC:\> TestNGの場所に保存したと仮定して、Windows、Linux、およびMacで環境変数を設定する方法を示しています。

OS 説明
ウィンドウズ 環境変数TESTNG_HOMEをC:\ TESTNGに設定します。
Linux TESTNG_HOME = / usr / local / TESTNGをエクスポートします
マック TESTNG_HOME = / Library / TESTNGをエクスポートします

ステップ5:CLASSPATH変数を設定する

をセットする CLASSPATH TestNGjarの場所を指す環境変数。

OS 説明
ウィンドウズ 環境変数CLASSPATHを%CLASSPATH%;%TESTNG_HOME%\ testng-6.8.jarに設定します。
Linux CLASSPATH =をエクスポートします$CLASSPATH:$TESTNG_HOME /testng-6.8.jar。
マック CLASSPATH =をエクスポートします$CLASSPATH:$TESTNG_HOME /testng-6.8.jar。

ステップ6:TestNGセットアップをテストする

TestNGSimpleTestという名前のJavaクラスファイルをで作成します。 C:\>TestNG_WORKSPACE.

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ファイルを使用して呼び出しましょう。でtestng.xmlという名前の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 = "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.xmlファイルまたはbuild.xmlに追加します。

  • TestNGを実行します。

ここでは、POJOクラス、ビジネスロジッククラス、およびTestNGによって実行されるテストxmlを使用したTestNGテストの1つの完全な例を示します。

作成する EmployeeDetails.javaC:\>TestNG_WORKSPACE、これは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 クラスはに使用されます-

  • 従業員の名前の値を取得/設定します。
  • 従業員の月給の値を取得/設定します。
  • 従業員の年齢の値を取得/設定します。

作成する EmpBusinessLogic.javaC:\>TestNG_WORKSPACE、ビジネスロジックが含まれています。

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 クラスは計算に使用されます-

  • 従業員の年俸。
  • 従業員の評価額。

それでは、というTestNGクラスを作成しましょう。 TestEmployeeDetails.javaC:\> TestNG_WORKSPACEで。TestNGクラスは、少なくとも1つのTestNGアノテーションを含むJavaクラスです。このクラスには、テストするテストケースが含まれています。TestNGテストは、@ BeforeXXXおよび@AfterXXXアノテーション(これについては、TestNG-実行手順の章で説明します)で構成できます。これにより、特定のポイントの前後で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クラス。それは以下を行います-

  • 従業員の年俸をテストします。

  • 従業員の評価額をテストします。

テストを実行する前に、通常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は、というフォルダーに非常に優れたHTMLレポートを作成します。test-outputこれは、現在のディレクトリに自動的に作成されます。それを開いてindex.htmlをロードすると、下の画像のようなページが表示されます-

JUnit 3でテストメソッドを示す従来の方法は、名前の前にtestを付けることです。これは、クラス内の特定のメソッドに特別な意味を持つものとしてタグを付けるための非常に効果的なメソッドですが、名前付けはあまり適切にスケーリングされず(異なるフレームワークにタグを追加したい場合はどうなりますか?)、かなり柔軟性がありません(追加のパラメーターをテストフレームワークに渡したいですか?)

JDK 5ではJava言語に注釈が正式に追加され、TestNGは注釈を使用してテストクラスに注釈を付けることを選択しました。

TestNGがサポートするアノテーションのリストは次のとおりです-

シニア番号 注釈と説明
1

@BeforeSuite

注釈付きメソッドは、このスイートのすべてのテストが実行される前に1回だけ実行されます。

2

@AfterSuite

注釈付きメソッドは、このスイートのすべてのテストが実行された後に1回だけ実行されます。

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によってテストクラスとして使用されるオブジェクトを返すファクトリとしてメソッドをマークします。メソッドはObject []を返す必要があります。

13

@Listeners

テストクラスのリスナーを定義します。

14

@Parameters

@Testメソッドにパラメーターを渡す方法について説明します。

15

@Test

クラスまたはメソッドをテストの一部としてマークします。

アノテーションを使用する利点

以下は、注釈を使用する利点の一部です-

  • TestNGは、アノテーションを検索することにより、関心のあるメソッドを識別します。したがって、メソッド名はパターンや形式に制限されません。

  • 追加のパラメーターを注釈に渡すことができます。

  • 注釈は強く型付けされているため、コンパイラーは間違いがあればすぐにフラグを立てます。

  • テストクラスは何も拡張する必要がなくなりました(JUnit 3のTestCaseなど)。

この章では、TestNGのメソッドの実行手順について説明します。呼び出されるメソッドの順序について説明します。TestNGテストAPIメソッドの実行手順と例を示します。

Javaクラスファイル名を作成します TestngAnnotation.javaC:\>TestNG_WORKSPACE 注釈をテストします。

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");
   }

}

次に、ファイルを作成しましょう testng.xmlC:\>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 = "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()メソッドでさえ1回だけ実行されます。

  • beforeMethod()メソッドは、テストケースごとに実行されますが、テストケースを実行する前に実行されます。

  • afterMethod()メソッドは、テストケースごとに実行されますが、テストケースの実行後に実行されます。

  • beforeMethod()とafterMethod()の間で、各テストケースが実行されます。

テストケースは、 TestNGクラス。このクラスは、TestNGフレームワークでテストを実行するための主要なエントリポイントです。ユーザーは独自のTestNGオブジェクトを作成し、次のようなさまざまな方法で呼び出すことができます。

  • 既存のtestng.xml。

  • 完全にJavaから作成された合成testng.xml。

  • テストクラスを直接設定する。

含めるまたは除外するグループを定義したり、パラメーターを割り当てたりすることもできます。コマンドラインパラメーターは次のとおりです。

  • -d outputdir:出力ディレクトリを指定します。

  • -testclass class_name:1つまたは複数のクラス名を指定します。

  • -testjar jar_name:テストを含むjarを指定します。

  • -sourcedir src1; src2 :; ソースディレクトリの個別のリスト(javadocアノテーションが使用されている場合にのみ使用されます)。

  • -target

  • -groups

  • -testrunfactory

  • -listener

以下の例では、既存のtestng.xmlでTestNGオブジェクトを作成します。

クラスを作成する

テストするJavaクラスを作成します。たとえば、 MessageUtil.javaC:\>TestNG_WORKSPACE

/*
* 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;
   }   
}

テストケースクラスを作成する

  • たとえば、Javaテストクラスを作成します。 SampleTest.java

  • テストメソッドtestPrintMessage()をテストクラスに追加します。

  • メソッドtestPrintMessage()にアノテーション@Testを追加します。

  • テスト条件を実装し、TestNGのassertEqualsAPIを使用して条件を確認します。

と呼ばれるJavaクラスファイルを作成します SampleTest.javaC:\>TestNG_WORKSPACE

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を作成します

次に、でtestng.xmlファイルを作成しましょう C:\>TestNG_WORKSPACE、テストケースを実行します。このファイルは、テスト全体を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
===============================================

A test suiteソフトウェアプログラムの動作または動作のセットをテストすることを目的としたテストケースのコレクションです。TestNGでは、テストソースコードでスイートを定義することはできませんが、スイートは実行の機能であるため、1つのXMLファイルで表されます。また、テストの柔軟な構成を実行することもできます。スイートには1つ以上のテストを含めることができ、<suite>タグで定義されます。

<suite>は、testng.xmlのルートタグです。テストスイートについて説明します。テストスイートは、いくつかの<test>セクションで構成されています。

次の表に、<suite>が受け入れるすべての有効な属性を示します。

シニア番号 属性と説明
1

name

このスイートの名前。それはmandatory 属性。

2

verbose

この実行のレベルまたは冗長性。

3

parallel

TestNGがこのスイートを実行するために異なるスレッドを実行する必要があるかどうか。

4

thread-count

並列モードが有効になっている場合に使用するスレッドの数(それ以外の場合は無視されます)。

5

annotations

テストで使用しているアノテーションのタイプ。

6

time-out

このテストで見つかったすべてのテストメソッドで使用されるデフォルトのタイムアウト。

この章では、TestSuiteを使用して一緒に実行する2つのテストクラスTest1とTest2の例を示します。

クラスを作成する

テストするJavaクラスを作成します。たとえば、 MessageUtil.javaC:\>JUNIT_WORKSPACE

/*
* 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;
   }
}

テストケースクラスを作成する

名前の付いたJavaクラスファイルを作成します Test1.javaC:\>TestNG_WORKSPACE

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());
   }
}

名前の付いたJavaクラスファイルを作成します Test2.javaC:\>TestNG_WORKSPACE

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フォルダーの下に、exampletest1.htmlとexampletest2.htmlの2つのhtmlファイルが作成されています。これらは次のようになります。

コードの準備ができておらず、そのメソッド/コードをテストするために記述されたテストケースが失敗する場合があります。そのような場合、注釈@Test(enabled = false) このテストケースを無効にするのに役立ちます。

テストメソッドに@Test(enabled = false)アノテーションが付けられている場合、テストの準備ができていないテストケースはバイパスされます。

それでは、@ Test(enabled = false)の動作を見てみましょう。

クラスを作成する

テストするJavaクラスを作成します。たとえば、 MessageUtil.javaC:\>TestNG_WORKSPACE

/*
* 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;
   }   
}

テストケースクラスを作成する

  • たとえば、Javaテストクラスを作成します。 IgnoreTest.java

  • テストメソッドtestPrintMessage()、およびtestSalutationMessage()をテストクラスに追加します。

  • アノテーション@Test(enabled = false)をメソッドtestPrintMessage()に追加します。

名前の付いたJavaクラスファイルを作成します IgnoreTest.javaC:\>TestNG_WORKSPACE

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を作成します

で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 = "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
===============================================

次の章で説明するテストのグループを無視することもできます。

グループテストは、JUnitフレームワークには存在しないTestNGの新しい革新的な機能です。これにより、メソッドを適切な部分にディスパッチし、テストメソッドの高度なグループ化を実行できます。

グループに属するメソッドを宣言できるだけでなく、他のグループを含むグループを指定することもできます。次に、TestNGを呼び出して、特定のグループのセット(または正規表現)を含め、別のセットを除外するように要求できます。

グループテストは、テストのパーティション分割方法に最大限の柔軟性を提供し、2つの異なるテストセットを連続して実行する場合は、何も再コンパイルする必要はありません。

グループは、<groups>タグを使用してtestng.xmlファイルで指定されます。<test>または<suite>タグの下にあります。<suite>タグで指定されたグループは、その下にあるすべての<test>タグに適用されます。

それでは、例を見て、グループテストがどのように機能するかを見てみましょう。

クラスを作成する

テストするJavaクラスを作成します。たとえば、 MessageUtil.javaC:\> TestNG_WORKSPACE

/*
* 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 "tutorialspoint" to the message
   public String salutationMessage() {
      message = "tutorialspoint" + 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つのカテゴリにグループ化します-

    • Check-in tests (checkintest)−これらのテストは、新しいコードを送信する前に実行する必要があります。通常は高速で、基本的な機能が壊れていないことを確認する必要があります。

    • Functional tests (functest) −これらのテストは、ソフトウェアのすべての機能をカバーし、少なくとも1日に1回実行する必要がありますが、理想的には継続的に実行する必要があります。

名前の付いたJavaクラスファイルを作成します GroupTestExample.javaC:\>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 = "tutorialspoint" + ".com";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }

   @Test(groups = { "functest" })
   
   public void testingExitMessage() {
      System.out.println("Inside testExitMessage()");
      message = "www." + "tutorialspoint"+".com";
      Assert.assertEquals(message, messageUtil.exitMessage());
   }  
}

testng.xmlを作成します

でtestng.xmlを作成します C:\> TestNG_WORKSPACE、テストケースを実行します。ここでは、グループ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。たとえば、checkintestfunctestを含むすべてのグループを定義したい場合があります。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()
tutorialspoint.com
Inside testExitMessage()
www.tutorialspoint.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は、コードの例外処理をトレースするオプションを提供します。コードが目的の例外をスローするかどうかをテストできます。ここにexpectedExceptionsパラメータは@Testアノテーションとともに使用されます。さあ、見てみましょう@Test(expectedExceptions) 動作中。

クラスを作成する

テストするJavaクラスを作成します。たとえば、 MessageUtil.javaC:\> TestNG_WORKSPACE。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;
   }   
}

テストケースクラスを作成する

  • たとえば、Javaテストクラスを作成します。 ExpectedExceptionTest.java

  • 予期される例外ArithmeticExceptionをtestPrintMessage()テストケースに追加します。

名前の付いたJavaクラスファイルを作成します ExpectedExceptionTest.javaC:\> 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());
   }
}

テストランナーを作成する

で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 = "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を使用すると、依存関係を-で指定できます。

  • @Testアノテーションで属性dependsOnMethodsを使用する、または。

  • @Testアノテーションで属性dependsOnGroupsを使用します。

dependsOnMethodsの使用例

クラスを作成する

テストするJavaクラスを作成します。たとえば、 MessageUtil.javaC:\>TestNG_WORKSPACE

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"} の@Testアノテーションに testSalutationMessage() 方法。

Javaクラスファイル名を作成します DependencyTestUsingAnnotation.javaC:\>TestNG_WORKSPACE

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を作成します

で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 = "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の使用例

グループ全体に依存するメソッドを持つこともできます。これを示す例を見てみましょう。

クラスを作成する

テストするJavaクラスを作成します。たとえば、 MessageUtil.javaC:\>TestNG_WORKSPACE

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.*"} の@Testアノテーションに testSalutationMessage() 方法。

名前の付いたJavaクラスファイルを作成します DependencyTestUsingAnnotation.javaC:\>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。*」に一致します。これにより、testPrintMessage()メソッドとinitEnvironmentTest()メソッドが常にtestSalutationMessage()の前に呼び出されることが保証されます。

メソッドが失敗に依存していて、それに強い依存関係がある場合(alwaysRun = false、これはデフォルトです)、それに依存するメソッドはFAILとしてマークされず、SKIPとしてマークされます。スキップされたメソッドは、最終レポートでそのように報告されます(HTMLでは赤でも緑でもない色で)。スキップされたメソッドは必ずしも失敗ではないため、これは重要です。

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 = "DependencyTestUsingAnnotation" />
      </classes>
   </test>
</suite>

javacを使用してMessageUtil、テストケースクラスをコンパイルします。

C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java

さて、実行されますtestng.xml、実行testSalutationMessage()のみを実行した後、方法をinitEnvironmentTest()メソッドを。

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
===============================================

dependsOnGroupsdependsOnMethods

  • グループを使用することで、リファクタリングの問題にさらされることはなくなりました。dependsOnGroupsまたはgroups属性を変更しない限り、適切な依存関係を設定してテストを実行し続けます。

  • 依存関係グラフに新しいメソッドを追加する必要がある場合は常に、それを適切なグループに配置し、適切なグループに依存していることを確認するだけです。他の方法を変更する必要はありません。

TestNGで利用できるもう1つの興味深い機能は parametric testing。ほとんどの場合、ビジネスロジックが非常に多様な数のテストを必要とするシナリオに遭遇します。Parameterized tests 開発者が異なる値を使用して同じテストを何度も実行できるようにします。

TestNGを使用すると、2つの異なる方法でパラメーターをテストメソッドに直接渡すことができます。

  • testng.xmlを使用
  • データプロバイダーと

testng.xmlでパラメーターを渡す

この手法では、testng.xmlファイルで単純なパラメーターを定義してから、ソースファイルでそれらのパラメーターを参照します。この手法を使用してパラメーターを渡す方法を示す例を示します。

テストケースクラスを作成する

  • たとえば、ParameterizedTest1.javaなどのJavaテストクラスを作成します。

  • テストメソッドparameterTest()をテストクラスに追加します。このメソッドは、入力パラメーターとして文字列を取ります。

  • このメソッドにアノテーション@Parameters( "myName")を追加します。パラメータにはtestng.xmlから値が渡されます。これは、次のステップで確認します。

名前の付いたJavaクラスファイルを作成します ParameterizedTest1.javaC:\>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を作成します

で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">
   
      <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

次に、testng.xmlを実行します。これにより、parameterTestメソッドが実行されます。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で指定された値をパラメーターのタイプに自動的に変換しようとします。サポートされているタイプは次のとおりです-

  • String
  • int/Integer
  • boolean/Boolean
  • byte/Byte
  • char/Character
  • double/Double
  • float/Float
  • long/Long
  • short/Short

データプロバイダーでパラメーターを渡す

複雑なパラメーターまたはJavaから作成する必要のあるパラメーター(複雑なオブジェクト、プロパティファイルまたはデータベースから読み取られたオブジェクトなど)を渡す必要がある場合は、Dataprovidersを使用してパラメーターを渡すことができます。

データプロバイダーは、注釈が付けられたメソッドです @DataProvider。この注釈には、名前という1つの文字列属性しかありません。名前が指定されていない場合、データプロバイダーの名前は自動的にデフォルトでメソッドの名前になります。データプロバイダーは、オブジェクトの配列を返します。

次の例は、データプロバイダーの使用方法を示しています。最初の例は、Vector、String、またはIntegerをパラメーターとして使用する@DataProviderに関するものであり、2番目の例は、オブジェクトをパラメーターとして使用する@DataProviderに関するものです。

例1

ここで、@ DataProviderは整数とブール値をパラメーターとして渡します。

Create Java class

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;
   }
}

Create Test Case Class

  • たとえば、ParamTestWithDataProvider1.javaなどのJavaテストクラスを作成します。

  • アノテーションを使用してデータプロバイダーとして定義されているメソッドprimeNumbers()を定義します。このメソッドは、オブジェクトの配列を返します。

  • テストメソッドtestPrimeNumberChecker()をテストクラスに追加します。このメソッドは、入力パラメーターとして整数とブール値を取ります。このメソッドは、渡されたパラメーターが素数であるかどうかを検証します。

  • このメソッドにアノテーション@Test(dataProvider = "test1")を追加します。属性dataProviderは「test1」にマップされます。

名前の付いたJavaクラスファイルを作成します ParamTestWithDataProvider1.javaC:\>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));
   }
}

Create 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はオブジェクトをパラメーターとして渡します。

Create Java class

get / setメソッドを持つ単純なオブジェクトであるJavaクラスBean.javaを作成します。 C:\>TestNG_WORKSPACE

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;
   }
}

Create Test Case Class

  • たとえば、ParamTestWithDataProvider2.javaなどのJavaテストクラスを作成します。

  • アノテーションを使用してデータプロバイダーとして定義されているメソッドprimeNumbers()を定義します。このメソッドは、オブジェクトの配列を返します。

  • テストメソッドtestMethod()をテストクラスに追加します。このメソッドは、オブジェクトBeanをパラメーターとして受け取ります。

  • このメソッドにアノテーション@Test(dataProvider = "test1")を追加します。属性dataProviderは「test1」にマップされます。

ParamTestWithDataProvider2.javaという名前のJavaクラスファイルを作成します。 C:\>TestNG_WORKSPACE

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());
   }
}

Create 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 = "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に移行する方法を提供するため、心配する必要はありません。TestNGを使用して、既存のJUnitテストケースを実行できます。

TestNGはJUnitテストを自動的に認識して実行できるため、TestNGを既存のすべてのテストのランナーとして使用し、TestNGを使用して新しいテストを作成できます。JUnitライブラリをTestNGクラスパスに配置するだけで、JUnitクラスを見つけて使用し、AntでテストランナーをJUnitからTestNGに変更してから、「混合」モードでTestNGを実行できます。このようにして、同じパッケージ内であっても、すべてのテストを同じプロジェクトに入れて、TestNGの使用を開始できます。このアプローチでは、既存のJUnitテストを段階的にTestNGに変換することもできます。

TestNGのこの驚くべき能力を実証する例を挙げましょう。

JUnitテストケースクラスを作成する

JUnitテストクラスであるJavaクラスTestJunit.javaを作成します。 C:\>TestNG_WORKSPACE

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は、デフォルトで、テスト実行用に異なるタイプのレポートを生成します。これには、HTMLおよびXMLレポートの出力が含まれます。TestNGを使用すると、ユーザーは独自のレポーターを作成してTestNGで使用することもできます。TestNGによって実行時に通知される独自のロガーを作成するオプションもあります。

TestNGでレポートを生成する方法は2つあります-

  • Listeners−リスナークラスを実装するには、クラスはorg.testng.ITestListenerインターフェースを実装する必要があります。これらのクラスは、テストの開始、終了、失敗、スキップ、または合格時にTestNGによって実行時に通知されます。

  • Reporters−レポートクラスを実装するには、クラスはorg.testng.IReporterインターフェイスを実装する必要があります。これらのクラスは、スイート全体の実行が終了したときに呼び出されます。テスト実行全体の情報を含むオブジェクトは、呼び出されたときにこのクラスに渡されます。

この章では、レポートとロギングの4つの異なるケースを示す4つの異なる例を示します。

シニア番号 事例と例
1 カスタムロギング

この例は、独自のロガーを作成する方法を示しています。

2 カスタムレポーター

この例は、独自のレポーターを作成する方法を示しています。

3 HTMLおよびXMLレポート

この例は、TestNGによって生成されたデフォルトのHTMLおよびXMLレポートを示しています。

4 JUnitレポート

この例は、TestNGレポートからJUnitレポートを生成する方法を示しています。

この章では、ANTを使用してTestNGを実行する方法を示します。以下の手順に従ってみましょう-

ステップ1:ApacheAntをダウンロードする

最新版のダウンロードは、Apache Antを

OS アーカイブ名
ウィンドウズ apache-ant-1.8.4-bin.zip
Linux apache-ant-1.8.4-bin.tar.gz
マック apache-ant-1.8.4-bin.tar.gz

ステップ2:Ant環境を設定する

をセットする ANT_HOMEANTライブラリがマシンに保存されているベースディレクトリの場所を指す環境変数。Antライブラリをapache-ant-1.8.4フォルダーに保存したとしましょう。

OS 出力
ウィンドウズ 環境変数ANT_HOMEをC:\ Program Files \ Apache Software Foundation \ apache-ant-1.8.4に設定します
Linux ANT_HOME = / usr / local /apache-ant-1.8.4をエクスポートします
マック ANT_HOME = / Library /apache-ant-1.8.4をエクスポートします

次のように、Antコンパイラの場所をシステムパスに追加します-

OS 説明
ウィンドウズ システム変数Pathの最後に文字列%ANT_HOME \ binを追加します。
Linux PATH =をエクスポートします$PATH:$ANT_HOME / bin /
マック 必要ありません。

ステップ3:TestNGアーカイブをダウンロードする

必要なjarファイルをダウンロードします http://www.testng.org.

OS アーカイブ名
ウィンドウズ testng-6.8.jar
Linux testng-6.8.jar
マック testng-6.8.jar

ステップ4:プロジェクト構造を作成する

  • フォルダを作成する TestNGWithAntC:\>TestNG_WORKSPACE

  • フォルダを作成する srcC:\>TestNG_WORKSPACE>TestNGWithAnt

  • フォルダを作成する testC:\>TestNG_WORKSPACE>TestNGWithAnt

  • フォルダを作成する libC:\>TestNG_WORKSPACE>TestNGWithAnt

  • 作成する MessageUtil のクラス C:\>TestNG_WORKSPACE>TestNGWithAnt>src フォルダ。

/*
* 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;
   }   
}
  • でTestMessageUtilクラスを作成します C:\>TestNG_WORKSPACE>TestNGWithAnt>src フォルダ。

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 フォルダ。

ANTbuild.xmlを作成します

まず、TestNGAntタスクを次のように定義する必要があります-

<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
   <classpath>
      <pathelement location = "lib/testng-6.8.jar"/>
   </classpath>
</taskdef>

次に、を使用します <testng> TestNGテストケースを実行するためのAntのタスク。

ザ・ 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

EclipseでTestNGをセットアップするには、以下の手順に従います。

ステップ1:TestNGアーカイブをダウンロードする

TestNGjarファイルの最新バージョンをからダウンロードします。 http://www.testng.org

OS アーカイブ名
ウィンドウズ testng-6.8.jar
Linux testng-6.8.jar
マック testng-6.8.jar

上記のJARファイルをC:\> TestNGフォルダーにコピーしたことを前提としています。

ステップ2:Eclipse環境を設定する

  • Eclipseを開き、プロジェクトを右クリックして、プロパティ→ビルドパス→ビルドパスの構成に移動し、[外部Jarの追加]ボタンを使用してライブラリにtestng-6.8.jarを追加します。

  • EclipseにはTestNGプラグインが組み込まれていることを前提としています。入手できない場合は、アップデートサイトから最新版を入手してください。

    • Eclipse IDEで、「ヘルプ」/「ソフトウェアの更新」/「検索とインストール」を選択します

    • インストールする新機能を検索します。

    • 新しいリモートサイト。

    • 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として実行し、プログラムの出力を確認します。

結果を確認します。