TestNG - パラメータテスト(XMLと@DataProvider)

TestNG –パラメーターテスト(XMLおよび@DataProvider)

このチュートリアルでは、XML@Parametersまたは@DataProviderを介してパラメーターを@Testメソッドに渡す方法を示します。

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

この例では、プロパティfilenameはtestng.xmlから渡され、@Parametersを介してメソッドに挿入されます。

TestParameterXML.java

package com.example.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/exampleserver
jdbc.username=example
jdbc.password=password

testng.xml




    

    
    

    
      
    

    

出力

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

2. @DataProviderを使用してパラメーターを渡す

2.1intパラメータを渡して、簡単な@DataProviderの例を確認します。

TestParameterDataProvider.java

package com.example.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.example.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 map) {

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

    }

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

    public Map readDbConfig() {

        Properties prop = new Properties();
        InputStream input = null;
        Map map = new HashMap();

        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/exampleserver
[Key] : jdbc.username [Value] : example
[Key] : jdbc.driver [Value] : com.mysql.jdbc.Driver
[Key] : jdbc.password [Value] : password
PASSED: testConnection({jdbc.url=jdbc:mysql://localhost:3306/exampleserver,
jdbc.username=example, jdbc.driver=com.mysql.jdbc.Driver, jdbc.password=password})

3. @DataProvider +メソッド

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

TestParameterDataProvider.java

package com.example.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.example.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




  

    
        
            
        
    

    
       
    

  

出力

group : groupA

完了しました。