使用Parameters+DataProvider完成数据驱动接口测试

通过xml里存储的sql语句,去遍历mysql获得相应的测试数据,然后完成测试。
优点:完全是靠数据驱动测试,在有新增接口时,无须改动代码,只需要在mysql内添加测试数据,然后新的测试场景只需要修改xml就可以了。

1.配置DataProvider_ForMysql类
用于链接数据库获取测试数据

import java.sql.*;
import java.util.*;

/**
 *数据库链接配置
 */
public class DataProvider_ForMysql implements Iterator<Object[]> {

    ResultSet result;  //结果集
    List<Map<String, String>> dataList = new ArrayList<Map<String, String>>();  //生成存放结果集的list
    int rowNum=0;     //总行数
    int curRowNo=0;   //当前行数

    public DataProvider_ForMysql(String ip, String port, String baseName,
                                 String userName, String password, String sql) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = String.format("jdbc:mysql://%s:%s/%s?serverTimezone=UTC", ip, port, baseName);
        //获取连接
        Connection conn = DriverManager.getConnection(url, userName, password);
        //获取创建语句对象
        Statement stmt = conn.createStatement();
        //执行sql语句,获取查询结果集
        result = stmt.executeQuery(sql);
        //获取当前行数据
        ResultSetMetaData rd = result.getMetaData();

        //循环每行
        while (result.next()) {
            Map<String, String> map = new HashMap<String, String>();
            //循环每列,如果不要id,则将i设为2
            for (int i = 1; i <= rd.getColumnCount(); i++) {
                String key = result.getMetaData().getColumnName(i);
                String value = result.getString(i);
                map.put(key,value);
            }
            dataList.add(map);
        }
        this.rowNum = dataList.size();
        conn.close();
        stmt.close();
    }

    @Override
    public boolean hasNext() {
        if(rowNum==0||curRowNo>=rowNum){
            return false;
        }else{
            return true;
        }
    }

    @Override
    public Object[] next() {
        Map<String,String> s=dataList.get(curRowNo);
        Object[] d=new Object[1];
        d[0]=s;
        this.curRowNo++;
        return d;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("remove unsupported");
    }
}

2.配置xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<suite name="suite">
    <test name="test">
        <parameter  name="valueName" value="select * from new_model"/>
        <classes>
            <class name="com.course.TestCase"/>
        </classes>
    </test>
    <listeners>
        <listener class-name="com.course.config.ExtentTestNGIReporterListener"></listener>
    </listeners>
</suite>

3.测试执行

public class TestCase {
    String sql;   //xml中读出的sql语句
	/**
	* 通过name来取xml文件中对应的sql语句
	*/
    @Parameters({"valueName"})
    @BeforeClass()
    public void beforeClass(String sql) {
        this.sql = sql;
    }
       
    /**
     * XML中的SQL决定了执行什么用例, 执行多少条用例, SQL的搜索结果为需要测试的测试用例
     */
    @DataProvider(name = "testData")
    private Iterator<Object[]> getData(){
        try {
            return new DataProvider_ForMysql(TestConfig.DB_IP, TestConfig.DB_PORT,
                TestConfig.DB_BASE_NAME,TestConfig.DB_USERNAME, TestConfig.DB_PASSWORD, sql);
        } catch (ClassNotFoundException e || SQLException e) {
            e.printStackTrace();
        } 
        return null;
    }

	/**
	*完整的测试数据,会以map的形式传递到测试方法里
	*/
    @Test(dataProvider = "testData")
    public void test(Map<String, String> dataMap) {
        System.out.println(dataMap.toString());
    }
}

无论mysql中读出多少数据,都会一条条的去执行,所以在测试场景中,需要考虑的是如何通过sql语句筛选测试数据,以及用例与用例间的数据依赖。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你的问题。 首先, @Parameters 和 @DataProvider 都是 TestNG 中用于参数化测试的注解。它们的作用是为测试方法提供不同的输入参数,以便测试多组数据使用 @Parameters 注解的方式需要在测试类中定义一个方法来提供参数,该方法需要返回一个二维数组,其中每个一维数组代表一组参数。例如,对于网站登录功能的测试,可以这样定义参数提供方法: ``` @Parameters({"username", "password"}) public Object[][] loginDataProvider() { return new Object[][]{ {"user1", "pass1"}, {"user2", "pass2"}, {"user3", "pass3"} }; } ``` 然后在测试方法上使用 @Test 注解并指定参数名称即可: ``` @Test public void testLogin(@Optional("defaultUser") String username, @Optional("defaultPass") String password) { // 使用提供的参数进行登录测试 } ``` 使用 @DataProvider 注解的方式需要在测试类中定义一个方法来提供参数,该方法需要返回一个二维数组,其中每个一维数组代表一组参数。例如,对于网站登录功能的测试,可以这样定义参数提供方法: ``` @DataProvider(name = "loginDataProvider") public Object[][] loginDataProvider() { return new Object[][]{ {"user1", "pass1"}, {"user2", "pass2"}, {"user3", "pass3"} }; } ``` 然后在测试方法上使用 @Test 注解并指定数据提供器名称即可: ``` @Test(dataProvider = "loginDataProvider") public void testLogin(String username, String password) { // 使用提供的参数进行登录测试 } ``` 以上是两种常用的参数化测试方式,使用时需要根据具体情况选择合适的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值