TestNG-パラメータ化されたテスト

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