mybatis+testng完成数据驱动测试

数据驱动解决了大量脚本重复的问题,实现了脚本与数据的解耦。比如一个功能,要验证在不同的输入值下产品的运行情况,就可以很好的利用数据驱动测试。把数据存在csv、xls、yaml、数据库中,需要的时候去相应文件中获取。每次执行用例之前,把上次生成的业务数据删掉,可以保证测试数据的重用。数据驱动测试的思想可以运行在ui自动化测试,api测试,单元测试中。

testng的Data Provider很好的实现数据驱动,现在用mybatis+testng进行数据驱动测试讲解。

用到的jar包

        <dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.13</version>
		</dependency>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 填写自己的mysql用户名和密码, 还有连接的url要加上"?serverTimezone=GMT%2B8"不然会报错 -->
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mock?serverTimezone=GMT%2B8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>    
    <mappers>        
        <mapper resource="mapper/TestDataMapper.xml"/>
    </mappers>    
</configuration>

TestDataMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="mapper.TestDataMapper">
  <select id="getdataByCaseName" resultType="com.yck.demo.entity.TestDataVo" parameterType="String">
  		select * from dataprovider where case_name=#{caseName}
  		
  </select>
</mapper>

TestDataVo

package com.yck.demo.entity;

public class TestDataVo {
	
	private Integer id;
	private String caseName;
	private String caseDescription;
	private Integer type;
	private String url;
	private String expert;
	private String actual;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getCaseName() {
		return caseName;
	}
	public void setCaseName(String caseName) {
		this.caseName = caseName;
	}
	public String getCaseDescription() {
		return caseDescription;
	}
	public void setCaseDescription(String caseDescription) {
		this.caseDescription = caseDescription;
	}
	public Integer getType() {
		return type;
	}
	public void setType(Integer type) {
		this.type = type;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getExpert() {
		return expert;
	}
	public void setExpert(String expert) {
		this.expert = expert;
	}
	public String getActual() {
		return actual;
	}
	public void setActual(String actual) {
		this.actual = actual;
	}
	

}

MybatisUtil

package com.yck.demo.utils;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.yck.demo.entity.TestDataVo;

public class MybatisUtil {

	private static final String resource = "mybatis/mybatis-config.xml";

	public static TestDataVo excuteSelect(String statement, String parameter) {
		InputStream inputStream;
		TestDataVo dataProviderVo = null;
		try {
			inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			SqlSession sqlSession = sqlSessionFactory.openSession();
			dataProviderVo = sqlSession.selectOne(statement, parameter);
			sqlSession.close();
		} catch (IOException e) {

			e.printStackTrace();
		}

		return dataProviderVo;

	}

}

testng数据驱动

package com.yck.demo.data;

import org.testng.annotations.DataProvider;

import com.yck.demo.entity.TestDataVo;
import com.yck.demo.utils.MybatisUtil;

public class DataProviderDemo {

	@DataProvider(name = "providerName")
	public TestDataVo[][] demo() {
		String statement = "mapper.TestDataMapper.getdataByCaseName";
		TestDataVo vo1 = MybatisUtil.excuteSelect(statement, "1");
		TestDataVo vo2 = MybatisUtil.excuteSelect(statement, "2");
		TestDataVo vo3 = MybatisUtil.excuteSelect(statement, "3");
		TestDataVo[][] dataVo = {{vo1},{vo2},{vo3}};
		return dataVo;
		
	}

}

测试用例

package com.yck.demo.testcase;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.yck.demo.entity.TestDataVo;

public class DemoTestCase {

	
	
	@Test(dataProvider= "providerName",dataProviderClass= com.yck.demo.data.DataProviderDemo.class)
	public void test(TestDataVo vo) {
		System.out.println(vo.getActual());
	}
}