zoukankan      html  css  js  c++  java
  • 基于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的值。  

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

     

  • 相关阅读:
    JavaScript模态对话框类
    事件模块的演变(1)
    html5中可通过document.head获取head元素
    How to search for just a specific file type in Visual Studio code?
    What do 'lazy' and 'greedy' mean in the context of regular expressions?
    正则非获取匹配 Lookahead and Lookbehind ZeroLength Assertions
    regex length 正则长度问题
    Inversion of Control vs Dependency Injection
    How to return View with QueryString in ASP.NET MVC 2?
    今天才发现Google Reader
  • 原文地址:https://www.cnblogs.com/generalli2019/p/12202513.html
Copyright © 2011-2022 走看看