接口測試中測試用例數據管理的設計:
這里用到的是DataProvider+txt的方式進行管理,個人認為這種方式管理還是比較便捷的。
1.txt文件設計:
外部有一些 使用excel管理的方式,考慮到一些表格格式化、操作便捷性還是更換了txt的方式管理。
(1)txt參數設計模板:
將參數分類為三種 BVT、NORMAL、ABNORMAL,分別代表冒煙用例、正常邏輯用例、非正常邏輯用例(具體用法看這人習慣吧)
(2)文件結構設計:
我們假設一個 數據推送接口:datapush,新建一個 dataPushTest_BVT.txt的文件:
文件新建.png
(3)設計txt文件的參數格式:
no+annotation+params的三個字段的方式,即序號、注釋、參數:
參數設計.png
2.開始編寫處理txt文件的方式:
(1)在公共方法中新建一個工具類:
ReadTxtData.java,就是讀取出txt數據的意思。
(2)在公共文件中新建一個文件路徑拼接的工具類:
LocalSolution.java 用于拼接文件路徑。
(3)在 LocalSolution 拼接工具類中新增用例路徑獲取拼接方法:
public class LocalSolution {
//獲取用例數據文件路徑并拼接資源目錄src/main/resources
public String getCaseDataPath(String filenames) {
// 獲取項目路徑
String localPath = new File("").getAbsolutePath();
//拼接資源路徑,這里固定的框設計文件路徑為/src/main/resources/caseData/,所以就寫死這個相對路徑。
String localPathfile = localPath+"/src/main/resources/caseData/"+filenames;
return localPathfile;
}
(4)在ReadTxtData中新增txt讀取方法
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.io.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
public class ReadTxtData {
// 引用路徑拼接方法拼接路徑
LocalSolution localSolution = new LocalSolution();
// 接收逐行查詢的數據
public String UseCaseParameter = null;
public List readFileContext(String paths) throws IOException {
// 儲存讀取的txt數據
List caseDataParameter = new ArrayList<>();
// 拼接出測試用例數據的地址
String fname = localSolution.getCaseDataPath(paths);
// 取出測試數據
try {
String encoding = "UTF-8"; // 字符編碼(可解決中文亂碼問題 )
// 新建一個測試數據的文件對象
File file = new File(fname);
// 判斷文件是否存在且是否為文件
if (file.isFile() && file.exists()) {
// 配置讀取txt文件信息
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(read);
// 循環(huán)取出對應的文件
while ((UseCaseParameter = bufferedReader.readLine()) != null) {
caseDataParameter.add(UseCaseParameter);
}
read.close();
} else {
System.out.println("沒有找到對應的測試用例數據文件!");
}
} catch (Exception e) {
System.out.println("讀取用例數據文件錯誤!");
e.printStackTrace();
}
return caseDataParameter;
}
(5)新建一個 dataprivoder方法:
@DataProvider(name = "testcase")
public Object[][] dataProviders(Method method ) throws IOException {
// 獲取執(zhí)行用例方法名稱
String fileName = method.getName().split("_")[0];
// 方法名稱拼接為文件名
String paths = fileName+"/"+method.getName()+".txt";
// 獲取txt讀取出的文件數據
List caseValue = readFileContext(paths);
// 循環(huán)寫入dataprovider參數接收變量中
Object[][] caseData =new Object[caseValue.toArray().length][1];
for(int i =0 ;i<caseValue.toArray().length;i++){
caseData[i][0] = caseValue.get(i).toString();
}
return caseData;
}
(6)新建測試用例獲取對應的參數值:
這里要注意方法名要與用例數據文件名完全一致,數據文件夾名要與接口名完全一致。對應關系如圖所示:
文件名稱關系.png
(7)測試用例接受及請求代碼:
// dataProvider設置的為name的值即testcase,其他的文件引用需要把類文件指定所以需要用dataProviderClass = ReadTxtData.class
@Test(dataProvider = "testcase",dataProviderClass = ReadTxtData.class)
public void dataPushTest_BVT(String params) throws IOException {
// 接口數據為JSON參數
JSONObject params_results = JSONObject.parseObject(params);
// 取出接口參數
JSONObject body_bvt =params_results.getJSONObject("params");
// 參數構造
System.out.println("本次請求的接口:"+requestUrl);
System.out.println("本次請求的參數:"+body_bvt);
// 請求接口,這里可以參照接口請求篇的文章看到詳細的接口請求封裝
JSONObject interfaceResults = requestHttp.postClientJson(requestUrl,body_bvt.toString());
System.out.println("接口返回值:"+interfaceResults.toString());
// 獲取返回值
String results = interfaceResults.getString("total");
// 用例斷言
Assert.assertEquals("0",results,"判斷接口返回數據總數");
}
3.實際運行結果:
運行結果.png

運行結果.png