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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM