このチュートリアルでは、XMLの

@ Parameters`または

@DataProvider`を使ってパラメータを `@ Test`メソッドに渡す方法を説明します。

1. XMLでパラメータを渡す

この例では、ファイルfilenameは

testng.xml`から渡され、

@ Parameters`を介してメソッドに注入されます。

TestParameterXML.java

package com.mkyong.testng.examples.parameter;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParameterXML {

    Connection con;

    @Test
    @Parameters({ "dbconfig", "poolsize" })
    public void createConnection(String dbconfig, int poolsize) {

        System.out.println("dbconfig : " + dbconfig);
        System.out.println("poolsize : " + poolsize);

        Properties prop = new Properties();
        InputStream input = null;

        try {
         //get properties file from project classpath
          input = getClass().getClassLoader().getResourceAsStream(dbconfig);

          prop.load(input);

          String drivers = prop.getProperty("jdbc.driver");
          String connectionURL = prop.getProperty("jdbc.url");
          String username = prop.getProperty("jdbc.username");
          String password = prop.getProperty("jdbc.password");

          System.out.println("drivers : " + drivers);
          System.out.println("connectionURL : " + connectionURL);
          System.out.println("username : " + username);
          System.out.println("password : " + password);

          Class.forName(drivers);
          con = DriverManager.getConnection(connectionURL, username, password);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mkyongserver
jdbc.username=mkyong
jdbc.password=password

testng.xml

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="test-parameter">

    <test name="example1">

    <parameter name="dbconfig" value="db.properties"/>
    <parameter name="poolsize" value="10"/>

    <classes>
      <class name="com.mkyong.testng.examples.parameter.TestParameterXML"/>
    </classes>

    </test>

</suite>

出力

dbconfig : db.properties
poolsize : 10
drivers : com.mysql.jdbc.Driver
connectionURL : jdbc:mysql://localhost:3306/mkyongserver
username : mkyong
password : password

2. @DataProviderでパラメータを渡す

TestParameterDataProvider.java

package com.mkyong.testng.examples.parameter;

import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestParameterDataProvider {

    @Test(dataProvider = "provideNumbers")
    public void test(int number, int expected) {
        Assert.assertEquals(number + 10, expected);
    }

    @DataProvider(name = "provideNumbers")
    public Object[][]provideData() {

        return new Object[][]{
            { 10, 20 },
            { 100, 110 },
            { 200, 210 }
        };
    }

}

出力

PASSED: test(10, 20)
PASSED: test(100, 110)
PASSED: test(200, 210)

  • 2.2 **

    @ DataProvider`は、

    object`パラメータを渡すサポートです。

以下の例は `Map`オブジェクトをパラメータとして渡す方法を示しています。

TestParameterDataProvider.java

package com.mkyong.testng.examples.parameter;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestParameterDataProvider {

    @Test(dataProvider = "dbconfig")
    public void testConnection(Map<String, String> map) {

        for (Map.Entry<String, String> entry : map.entrySet()) {
          System.out.println("[Key]: " + entry.getKey()
                              + "[Value]: " + entry.getValue());
        }

    }

    @DataProvider(name = "dbconfig")
    public Object[][]provideDbConfig() {
        Map<String, String> map = readDbConfig();
        return new Object[][]{ { map } };
    }

    public Map<String, String> readDbConfig() {

        Properties prop = new Properties();
        InputStream input = null;
        Map<String, String> map = new HashMap<String, String>();

        try {
          input = getClass().getClassLoader().getResourceAsStream("db.properties");

          prop.load(input);

          map.put("jdbc.driver", prop.getProperty("jdbc.driver"));
          map.put("jdbc.url", prop.getProperty("jdbc.url"));
          map.put("jdbc.username", prop.getProperty("jdbc.username"));
          map.put("jdbc.password", prop.getProperty("jdbc.password"));

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return map;

    }

}

出力

…​.[Key]: jdbc.url[Value]: jdbc:mysql://localhost:3306/mkyongserver[Key]: jdbc.username[Value]: mkyong[Key]: jdbc.driver[Value]: com.mysql.jdbc.Driver[Key]: jdbc.password[Value]: password
PASSED: testConnection({jdbc.url=jdbc:mysql://localhost:3306/mkyongserver,
jdbc.username=mkyong, jdbc.driver=com.mysql.jdbc.Driver, jdbc.password=password})

===  3. @DataProviderメソッド

この例では、テストメソッド名に応じて異なるパラメータを渡す方法を示します。

TestParameterDataProvider.java

package com.mkyong.testng.examples.parameter;

import java.lang.reflect.Method;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestParameterDataProvider {

@Test(dataProvider = "dataProvider")
public void test1(int number, int expected) {
    Assert.assertEquals(number, expected);
}

@Test(dataProvider = "dataProvider")
public void test2(String email, String expected) {
    Assert.assertEquals(email, expected);
}

@DataProvider(name = "dataProvider")
public Object[][]provideData(Method method) {

Object[][]result = null;

if (method.getName().equals("test1")) {
    result = new Object[][]{
        { 1, 1 }, { 200, 200 }
    };
} else if (method.getName().equals("test2")) {
    result = new Object[][]{
        { "[email protected]", "[email protected]" },
        { "[email protected]", "[email protected]" }
    };
}

return result;

}

}

出力

PASSED: test1(1, 1)
PASSED: test1(200, 200)
PASSED: test2(”

[email protected]

“, ”

[email protected]

“)
PASSED: test2(”

[email protected]

“, ”

[email protected]

“)

===  4. @DataProvider + ITestContext

TestNGでは、 `org.testng.ITestContext`を使用して、現在のテストメソッドがどのランタイムパラメータで呼び出されたかを調べることができます。この最後の例では、含まれるグループ名に応じてパラメータを渡す方法を示します。

TestParameterDataProvider.java

package com.mkyong.testng.examples.parameter;

import org.testng.Assert;
import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestParameterDataProvider {

@Test(dataProvider = "dataProvider", groups = {"groupA"})
public void test1(int number) {
    Assert.assertEquals(number, 1);
}

@Test(dataProvider = "dataProvider", groups = "groupB")
public void test2(int number) {
    Assert.assertEquals(number, 2);
}

@DataProvider(name = "dataProvider")
public Object[][]provideData(ITestContext context) {

Object[][]result = null;

//get test name
//System.out.println(context.getName());

for (String group : context.getIncludedGroups()) {

System.out.println("group : " + group);

if ("groupA".equals(group)) {
    result = new Object[][]{ { 1 } };
    break;
}

}

if (result == null) {
    result = new Object[][]{ { 2 } };
}
return result;

}

}

testng.xml

<!DOCTYPE suite SYSTEM “http://beust.com/testng/testng-1.0.dtd” >
<suite name=”test-parameter”>

<test name="example1">

<groups>
    <run>
        <include name="groupA"/>
    </run>
</groups>

<classes>
   <class
    name="com.mkyong.testng.examples.parameter.TestParameterDataProvider"/>
</classes>

</test>

</suite>

出力

group : groupA

完了しました。

=== 参考文献

.  http://testng.org/doc/documentation-main.html#parameters-dataproviders[TestNG

@DataProvider]。 http://testng.org/javadocs/org/testng/ITestContext.html[TestNG

ITestContext JavaDoc]。 link://jdbc/how-to-connect-to-mysql-jdbc-driver-java/[接続先

MySQLとJDBCドライバ]

link://tag/parameter-test/[パラメータテスト]link://tag/testng/[testng]