AssertJ断言系列-----------<数据库断言三>
其实,是有很多种数据断言的使用。那么,我们在接口的测试中,到底应不应该加上数据库断言呢?我的观点是,视情况而定;某一些特殊的场景或者特殊的业务,那么我们就一定要加上数据库断言。
不是我们测试人员,不相信开发或者接口返回成功那么就一定会进入库。
比如:支付类、流水类、账户余额等相关和金额相关,最好是前期就加入这些断言进入。
那么我在实际工作中,也有遇到redis里面的数据也会进行断言。
下面也是我之前的疑问?
接口我们一般做断言,基本情况之下,我们只要判断关键字的接口响应即可,这样也没问题的,不需要再去对数据库层面再去判断了吧。可是在实际之中,也发现了一些开发的接口响应字段的结果和实际数据库存取的结果不同,原因是因为,
我的入参是弱密码,系统会强制修改为安全密码存入数据库,可实际接口确返回入参的弱密码,和实际库不同,这种应该如何处理,就是要断言也要查询数据库层面了,这样的话,工作量很大,接口断言,正确的断言方式,应该怎么具体做,有没有通用的方式呢?
还是看我们的测试目的。接口测试的对象是接口本身,所以主要是对接口响应进行断言。如果不判断响应直接去校验数据库,测试的其实是入库逻辑而不是接口,两者测试对象不一样。每个接口都去db再做一层校验一般不必要。单独有入库逻辑校验的case覆盖。
当然两层的校验都可以在同一套框架内处理。你这里强弱密码转换的问题其实还是暴露db层的问题。
那么,最后其实还是我们db层有问题,所以前期最好还是入库检查比较好。
另外一个就是用例的驱动实现方式问题;
Excel其实是实际中用得比较多的,正常设计用例case应该足够用了。当然如果是想用接口来灌数据,最好还是借助数据库。
package data;
import org.assertj.db.type.Request;
import org.assertj.db.type.Source;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//静态引入
import static org.assertj.db.api.Assertions.assertThat;
/**
* @ClassName DataDemo02
* @Description 数据库断言系列三
* @Author 12457
* @Date 2019/2/2 13:58
* @Version 1.0
**/
public class DataDemo02 {
/*
* 数据库配置基本信息
**/
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/course";
private static String username = "root";
private static String password = "abc-123";
private static Connection conn = null;
@BeforeClass
public static void beforeClass(){
//数据库连接
try {
Class.forName(driver);
conn = (Connection) DriverManager.getConnection(url,username,password);
}catch (ClassNotFoundException ex){
ex.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
}
/*
* 还是按照系列一里面插入的3条数据为例,我们对age列中的数据进行断言查看
* 在实际应用中,此断言能起到什么作用,比如;我们去构造测试用例的时候,可以对用例入参的value值进行断言,
* 然后和实际的入库值进行比对
**/
@Test(description = "获取数据库当前列所有的value值")
public void get_cloumn_request_assertion_examples(){
Source source = new Source(url,username,password);
Request request = new Request(source,"SELECT * FROM students");
String name = request.getColumn(3).getName();
System.out.println("学生表第三列的value值是:" + name);
//对学生表的年龄列判断
assertThat(request).column("age")
.hasValues("11","22","33");
}
}
实际运行结果如下:
[TestNG] Running:
C:\Users\Administrator\.IntelliJIdea2017.3\system\temp-testng-customsuite.xml
学生表第三列的value值是:AGE
@Test(description = "对表中的某一个具体的数据断言")
public void get_text_assertion_examples(){
Source source = new Source(url,username,password);
Request request = new Request(source,"SELECT * FROM students");
//断言数据库学生表中第一行的数据age字段的年龄判断
assertThat(request).row(0)
.value("age")
.isEqualTo("11")
.isNotEqualTo("12");
}
@Test(description = "数值断言")
public void get_num_assertion_examples(){
Source source = new Source(url,username,password);
Request request = new Request(source,"SELECT * FROM students");
//对具体的数据数值类型进行判断,比如说年龄大小11
assertThat(request).row(1)
.value("age").isNotZero()
.isGreaterThan(1).isGreaterThanOrEqualTo(11)
.isLessThan(22).isLessThanOrEqualTo(11);
}
//列类型判断
@Test
public void type_request_assertion_examples() {
Source source = new Source(url,username,password);
Request request = new Request(source,"SELECT * FROM students");
assertThat(request)
.column().isNumber(false)
.column().isDate(false).isOfAnyTypeIn(ValueType.DATE, ValueType.NUMBER)
.column().isText(false)
.column().isNumber(false).isOfType(ValueType.NUMBER, false)
.column().isTime(false)
.column().isBoolean(true);
}