基于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的值。  

  根据上面的思路,我们还可以做一些最大最小值,求和求积等等常用的工具函数,方便在接口测试的时候进行调用。这里就不展开了,请感兴趣的小伙伴自行拓展。

 

猜你喜欢

转载自www.cnblogs.com/generalli2019/p/12202513.html