Testng-parameterized-test

提供:Dev Guides
移動先:案内検索

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