在前一篇中,我們着重闡述了參數的處理方法。
但是,這些參數基本都是直接賦值的。而實際的接口測試中,我們會根據需要做成很多的測試數據,這些測試數據會根據不同的情況來使用。例如,我可能需要一個能夠隨機生成一個中文的字符串,或者需要一個能夠迅速求出一個文件或者字符串的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的值。
根據上面的思路,我們還可以做一些最大最小值,求和求積等等常用的工具函數,方便在接口測試的時候進行調用。這里就不展開了,請感興趣的小伙伴自行拓展。