Java+TestNG+Excel 接口自動化測試框架


思路:Excel管理測試用例,JSONPath做預期結果數據處理,測試結果回寫Excel

import com.alibaba.fastjson.JSONObject;
 
import com.qa.utils.*;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
 
public class AutoTest {
 
    @DataProvider(name="testData")
    public static Object[][] data() throws Exception{
        return ExcelUtils.getTestData(Constant.FilePath,Constant.FileSheet);
    }
 
 
    @Test(dataProvider="testData",description="測試接口")
    public void testApi(
            String rowNumber,
            String caseRowNumber,
            String testCaseName,
            String priority,
            String apiName,
            String url,
            String type,
            String parmsType,
            String parms,
            String assertKeyWord
    ) throws Exception{
        Log.startTestCase(testCaseName);
        JSONObject responseObject = null;
        if ("post".equalsIgnoreCase(type)||"json".equalsIgnoreCase(parmsType)){
            responseObject= RestClient.post(url,parms);
            Log.info("Responce: "+responseObject.toString());
            //WriteResponce.write(Constant.ResponseSheet,responseObject.toString(),Integer.parseInt(rowNumber.split("[.]")[0]),0);
            System.out.println("response: "+responseObject);
        }else {
            //TODO
        }
 
        Log.info("斷言Response是否與預期結果一致: "+assertKeyWord);
        try {
            //Assert.assertTrue(responseObject.toString().contains(assertKeyWord));
            Assert.assertTrue(JSONPathUtil.checkPoint(responseObject.toString(),assertKeyWord));
        } catch (AssertionError  error){
            Log.info("斷言Response是否與預期結果一致: "+assertKeyWord +" ---> 斷言失敗");
            ExcelUtils.setCellData(Integer.parseInt(rowNumber.split("[.]")[0]), ExcelUtils.getLastColumnNum(), "Fail");
            Log.info("測試結果成功寫入excel數據文件中的測試執行結果列");
            Assert.fail("斷言Response是否與預期結果一致: "+assertKeyWord +" 失敗");
        }
 
        //System.out.println("**** "+Integer.parseInt(rowNumber.split("[.]")[0]));
        //ExcelUtils.setCellData(Integer.parseInt(rowNumber.split("[.]")[0]),10,"測試執行成功");
        Log.info("斷言Response是否與預期結果一致: "+assertKeyWord +" ---> 斷言成功");
        ExcelUtils.setCellData(Integer.parseInt(rowNumber.split("[.]")[0]),ExcelUtils.getLastColumnNum(),"Pass");
        Log.info("測試結果成功寫入excel數據文件中的測試執行結果列");
        Log.endTestCase(testCaseName);
    }
 
 
    @BeforeClass
    public void beforeClass() throws Exception{
        ExcelUtils.setExcelFile(Constant.FilePath,Constant.FileSheet);
    }
}
import com.alibaba.fastjson.JSONPath;
import com.qa.utils.Log;
 
import java.util.HashMap;
import java.util.Map;
 
public class JSONPathUtil {
 
    public static void main(String[] args) {
 
        String json = "{\"store\":{\"book\":[{\"title\":\"高效Java\",\"price\":10.2},{\"title\":\"設計模式a\",\"price\":12.21},{\"title\":\"重構\",\"isbn\":\"553\",\"price\":8},{\"title\":\"虛擬機\",\"isbn\":\"395\",\"price\":22}],\"bicycle\":{\"color\":\"red\",\"price\":19}}}";
        //String expression1  = (String) JSONPath.read(json,"$.store.book[0].title");
        //int expression2 = (int) JSONPath.read(json,"$.store.book[0].price");
 
        // 設置的檢查點,多個檢查點用;分隔
        String params = "$.store.book[0].price=10.2;$.store.book[1].title=設計模式";
        String[] data = params.split(";");
        // 定義測試結果的標記
        Boolean flag = false;
 
        //遍歷數組,獲取每一個檢查點在json中對應的數據,存在map中
        Map<String, Object> map = new HashMap<>();
        for (int i = 0; i < data.length; i++) {
            map.put(data[i].split("=")[0], data[i].split("=")[1]);
            System.out.println("檢查點"+ (i+1) +"返回的數據:" + JSONPath.read(json, data[i].split("=")[0]));
            System.out.println("檢查點"+ (i+1) +"斷言的數據:" + map.get(data[i].split("=")[0]));
 
            //判斷檢查點數據與返回的json數據是否一致
            if (JSONPath.read(json, data[i].split("=")[0]) instanceof String) {
                if (JSONPath.read(json, data[i].split("=")[0]).equals(map.get(data[i].split("=")[0]))) {
                    //System.out.println("Pass A");
                    flag = true;
                } else {
                    //System.out.println("Fail A");
                    flag = false;
                    break;
                }
            } else { // Object轉String
                if ((JSONPath.read(json, data[i].split("=")[0]).toString()).equals((map.get(data[i].split("=")[0])))) {
                    //System.out.println("Pass B");
                    flag = true;
                } else {
                    //System.out.println("Fail B");
                    flag = false;
                    break;
                }
            }
        }
        if (flag) {
            System.out.println("【測試執行結果:通過】");
        } else {
            System.out.println("【測試執行結果:失敗】");
        }
    }
 
    /**
     * 預期結果校驗
     * @param response
     * @param assertKeyWord
     * @return
     */
    public static Boolean checkPoint(String response,String assertKeyWord){
        //分隔檢查點
        String[] data = assertKeyWord.split(";");
        // 定義測試結果的標記
        Boolean flag = false;
 
        //遍歷數組,獲取每一個檢查點在json中對應的數據,存在map中
        Map<String, Object> map = new HashMap<>();
        for (int i = 0; i < data.length; i++) {
            map.put(data[i].split("=")[0], data[i].split("=")[1]);
            System.out.println("檢查點"+ (i+1) +"返回的數據:" + JSONPath.read(response, data[i].split("=")[0]));
            System.out.println("檢查點"+ (i+1) +"斷言的數據:" + map.get(data[i].split("=")[0]));
 
            Log.info("檢查點"+ (i+1) +"返回的數據:" + JSONPath.read(response, data[i].split("=")[0]));
            Log.info("檢查點"+ (i+1) +"斷言的數據:" + map.get(data[i].split("=")[0]));
 
            //判斷檢查點數據與返回的json數據是否一致
            if (JSONPath.read(response, data[i].split("=")[0]) instanceof String) {
                if (JSONPath.read(response, data[i].split("=")[0]).equals(map.get(data[i].split("=")[0]))) {
                    //System.out.println("Pass A");
                    flag = true;
                } else {
                    //System.out.println("Fail A");
                    flag = false;
                    break;
                }
            } else { // Object轉String
                if ((JSONPath.read(response, data[i].split("=")[0]).toString()).equals((map.get(data[i].split("=")[0])))) {
                    flag = true;
                } else {
                    flag = false;
                    break;
                }
            }
        }
        if (flag) {
            return true;
        } else {
            return false;
        }
    }
}
public class Constant {
 
 
//public static final String URL = "http://mail.qq.com";
 
//測試數據EXCEL路徑
public static final String FilePath = "D:\\接口自動化測試.xlsx";
 
// EXCEL測試數據sheet名稱
public static final String FileSheet = "測試用例";
 
public static final String ResponseSheet = "response";
 
}
import org.apache.log4j.Logger;
 
public class Log {
 
    // 初始化Log4j日志
    private static Logger Log = Logger.getLogger(com.qa.utils.Log.class.getName());
 
    // 打印測試用例開頭的日志
    public static void startTestCase(String sTestCaseName) {
        Log.info("------------------ 測試用例【"+ sTestCaseName + "】" + "開始執行 ------------------");
    }
 
    //打印測試用例結束的日志
    public static void endTestCase(String sTestCaseName) {
        Log.info("------------------ 測試用例【"+ sTestCaseName + "】" + "測試執行結束 ------------------");
 
    }
 
    public static void info(String message) {
        Log.info(message);
    }
 
    public static void warn(String message) {
        Log.warn(message);
    }
 
    public static void error(String message) {
        Log.error(message);
    }
 
    public static void fatal(String message) {
        Log.fatal(message);
    }
 
    public static void debug(String message) {
        Log.debug(message);
    }
 
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
 
public class RestClient {
 
    /**
     * 帶json參數的post請求
     * @param url
     * @param parms
     * @return
     */
    public static JSONObject post(String url, String parms) {
 
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost post = new HttpPost(url);
 
        post.addHeader("content-type", "application/json;charset=utf-8");
        post.setEntity(new StringEntity(parms, Charset.forName("utf-8")));
        HttpResponse response = null;
        String result = null;
        try {
            Log.info("開始發送post請求,請求的URL: " + url);
            Log.info("開始發送post請求,請求的參數: " + parms);
            response = httpClient.execute(post);
            result = EntityUtils.toString(response.getEntity());
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (HttpStatus.SC_OK != response.getStatusLine().getStatusCode()) {
            System.out.println("請求不正確");
        }
 
        JSONObject responseObject = JSON.parseObject(result);
        //System.out.println("response: "+responseObject);
        return responseObject;
    }
}
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
public class ExcelUtils {
 
    private static XSSFSheet sheet;
    private static XSSFWorkbook workbook;
    private static XSSFCell cell;
    private static XSSFRow row;
 
    //指定要操作的excel文件的路徑及sheet名稱
    public static void setExcelFile(String path,String sheetName) throws Exception{
        try {
            FileInputStream  file = new FileInputStream(path);
            workbook = new XSSFWorkbook(file);
            sheet = workbook.getSheet(sheetName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    //讀取excel文件指定單元格數據(此方法只針對.xlsx后輟的Excel文件)
    public static String getCellData(int rowNum,int colNum) throws Exception{
        try {
            //獲取指定單元格對象
            cell = sheet.getRow(rowNum).getCell(colNum);
            //獲取單元格的內容
            //如果為字符串類型,使用getStringCellValue()方法獲取單元格內容,如果為數字類型,則用getNumericCellValue()獲取單元格內容
            String cellData = cell.getStringCellValue();
            return cellData;
        } catch (Exception e) {
            return "";
        }
    }
 
    //在EXCEL的執行單元格中寫入數據(此方法只針對.xlsx后輟的Excel文件) rowNum 行號,colNum 列號
    public static void setCellData(int rowNum,int colNum,String Result) throws Exception{
        try {
            //獲取行對象
            row = sheet.getRow(rowNum);
            //如果單元格為空,則返回null
            cell = row.getCell(colNum);
            if(cell == null){
                cell=row.createCell(colNum);
                cell.setCellValue(Result);
            }else{
                cell.setCellValue(Result);
            }
            FileOutputStream out = new FileOutputStream(Constant.FilePath);
            //將內容寫入excel中
            workbook.write(out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    //從EXCEL文件中獲取測試數據
    public static Object[][] getTestData(String excelFilePath,String sheetName) throws IOException {
        //聲明一個file文件對象
        File file = new File(excelFilePath);
        //創建一個輸入流
        FileInputStream in = new FileInputStream(file);
        //聲明workbook對象
        Workbook workbook = null;
        //判斷文件擴展名
        String fileExtensionName = excelFilePath.substring(excelFilePath.indexOf("."));
        if(fileExtensionName.equals(".xlsx")){
            workbook = new XSSFWorkbook(in);
        }else {
            workbook = new HSSFWorkbook(in);
        }
 
        //獲取sheet對象
        Sheet sheet = workbook.getSheet(sheetName);
        //獲取sheet中數據的行數,行號從0始
        int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();
 
        List<Object[]> records = new ArrayList<Object[]>();
        //讀取數據(省略第一行表頭)
        for(int i=1; i<rowCount+1; i++){
            //獲取行對象
            Row row = sheet.getRow(i);
            System.out.println(">>>>>>>>>>> "+ row.getLastCellNum());
            //聲明一個數組存每行的測試數據,excel最后兩列不需傳值
            String[] fields = new String[row.getLastCellNum()-2];
            //excel倒數第二列為Y,表示數據行要被測試腳本執行,否則不執行
            if(row.getCell(row.getLastCellNum()-2).getStringCellValue().equals("Y")){
            //if(row.getCell(10).getStringCellValue().equals("Y")){
                for(int j=0; j<row.getLastCellNum()-2; j++){
                    //System.out.println("cell:"+row.getCell(j));
                    //判斷單元格數據是數字還是字符
                    switch (row.getCell(j).getCellType()){
                        case XSSFCell.CELL_TYPE_NUMERIC:
                            fields[j] = String.valueOf(row.getCell(j).getNumericCellValue());
                            //System.out.println(fields[j]+":"+String.valueOf(row.getCell(j).getNumericCellValue()));
                            break;
                        case XSSFCell.CELL_TYPE_STRING:
                            fields[j] = row.getCell(j).getStringCellValue();
                            //System.out.println(fields[j]+":"+row.getCell(j).getStringCellValue());
                            break;
                        default:
                            fields[j] = row.getCell(j).getStringCellValue();
                            break;
                    }
                }
 
                /*for (int k=0;k<fields.length;k++){
                    System.out.println("*****:"+fields>>>>>>>>>>>[k]);
                }*/
                //System.out.println("********:"+sheet.getRow(0).getLastCellNum());
                records.add(fields);
            }
        }
        //將list轉為Object二維數據
        Object[][] results = new Object[records.size()][];
        //設置二維數據每行的值,每行是一個object對象
        for(int i=0; i<records.size(); i++){
            results[i]=records.get(i);
        }
        return results;
    }
 
    public static int getLastColumnNum(){
        //返回數據文件最后一列的列號,如果有12列則返回11
        return sheet.getRow(0).getLastCellNum()-1;
    }
}

Excel管理測試用例

 


免責聲明!

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



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