基於Java+HttpClient+TestNG的接口自動化測試框架(五)------ 測試用函數接口類及實現類


  在前一篇中,我們着重闡述了參數的處理方法。

  但是,這些參數基本都是直接賦值的。而實際的接口測試中,我們會根據需要做成很多的測試數據,這些測試數據會根據不同的情況來使用。例如,我可能需要一個能夠隨機生成一個中文的字符串,或者需要一個能夠迅速求出一個文件或者字符串的MD5的值。在這種情況下,就需要我們動手去寫一些函數來進行調用。

  不過,如果是在Excel(或者其他文本編輯器)中寫測試用例,如何才能讓程序能夠知道我是在調用一個函數,並且能夠把這個函數的返回值賦給變量,正確的傳入我想要的地方呢?下面,我們就來看看具體的實現方法。

       首先,我們需要確定一下,如何才能讓程序能夠識別這是一個函數,而不是字符串。這里,有個難點。

  既然是函數,就會出現參數的問題,參數有可能是1個,也有可能是多個,也有可能是沒有。因此,我們這里就是要處理這個不定的參數。(當然,具體函數的參數個數,我們是可以定義的)

  類似於之前使用${param_name}的形式,我們在使用函數的地方用類似於__funcName(args)的形式來讓程序判定這是一個函數。

  我們先設計出一個函數的雛形,可以用接口類,用來指代我們想在發送接口時使用的函數。對於一個函數,我們這里需要的是兩個部分,一個是函數的名字,一個是函數的具體執行。

      請看下一面一段代碼:

public interface functionInterface {
    String execute(String[] args);

    String getReferenceKey();
}

  這里個接口類有2個方法,執行返回一個字符串,一個獲取該函數的名字。這里,可以理解為,String[] args來定義我們執行方法的參數,是個不定參數。

下面,我們根據這個接口類,來實現我們的第一個函數類(獲取日期的date函數)

import java.text.SimpleDateFormat;
import java.util.Date;
import utils.stringUtil;

public class dateFunctions  implements functionInterface{
    //重寫執行方法
    @Override
    public String execute(String[] args) {
        //如果不加參數,返回Unix時間戳(毫秒級時間),否則返回當前系統時間。
        if (args.length == 0 ||stringUtil.isEmpty(args[0])) {
            return String.format("%s", new Date().getTime());
        } else {
            //返回的當前時間。可以自定義格式,這里先寫成"yyyy-MM-dd",也可以根據需要進行修改
            return getCurrentDate("yyyy-MM-dd");
        }
    }

    private String getCurrentDate(String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        String str = format.format(new Date());
        return str;
    }
    
    //定義該函數的名字為“date”
    @Override
    public String getReferenceKey() {
        // TODO Auto-generated method stub
        return "date";
    }
}

在這里,我們自定義了一個執行方法,一個名字。執行方法里面的內容也可以根據自己需要自行改動。在使用形式上如下:

  • __date(param1): 生成執行該函數時的格式化字符串。param1為轉換的格式,默認為“yyyy-MM-dd”。當然,我們也可以指定其他的格式,比如“yyyy-MM-dd-HH-mm-ss”等等。總之,可以通過該函數的參數來獲取的到想要的數據。

根據這樣的思路,我們可以再寫一些經常使用到的函數。

第二個函數(求文件的MD5的值)

 備注:需要在項目中導入apache-commons-codec這個jar包

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;

import org.apache.commons.codec.digest.DigestUtils;

public class md5Functions implements functionInterface{
    //重寫執行方法
    @Override
    public String execute(String[] args) {
        try {
            String filePath = args[0];
       //如果filepath的開頭是http,那么就以鏈接方式來處理。
if (filePath.startsWith("http")) { return DigestUtils.md5Hex(new URL(filePath).openStream()); } else { return DigestUtils.md5Hex(new FileInputStream(new File( filePath))); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public String getReferenceKey() { // TODO Auto-generated method stub return "MD5"; } }

這里我們就完成了一個叫做md5的函數,這個函數的執行中需要輸入一個參數,就是文件的路徑。當然,我們也可以稍微改變一下,把它寫成是取字符串的md5值的函數,也非常簡單。

String md5_value = DigestUtils.md5Hex(target_str);

核心就是這一句即可。

  使用形式還是和之前一樣:

  • __MD5(param1): 這里的param1是路徑的字符串,可以是http路徑,也可以是文件的路徑。

  這里,留一個小問題:修改代碼,讓這個函數既可以求文件及路徑的md5值,也可以求字符串的md5的值。  

  根據上面的思路,我們還可以做一些最大最小值,求和求積等等常用的工具函數,方便在接口測試的時候進行調用。這里就不展開了,請感興趣的小伙伴自行拓展。

 


免責聲明!

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



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