在前一篇中,我们着重阐述了参数的处理方法。
但是,这些参数基本都是直接赋值的。而实际的接口测试中,我们会根据需要做成很多的测试数据,这些测试数据会根据不同的情况来使用。例如,我可能需要一个能够随机生成一个中文的字符串,或者需要一个能够迅速求出一个文件或者字符串的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的值。
根据上面的思路,我们还可以做一些最大最小值,求和求积等等常用的工具函数,方便在接口测试的时候进行调用。这里就不展开了,请感兴趣的小伙伴自行拓展。
原文地址:https://www.cnblogs.com/generalli2019/p/12202513.html