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());
}
}