如何统一接口测试的功能自动化和性能测试用例(代码片段)

funtester funtester     2023-04-30     249

关键词:

服务端的测试,大多数内容都围绕着接口展开。对于接口测试,无非也是功能、自动化、性能测试为主,偶然想到一个问题,如果能写一个用例,在功能、自动化、性能三者的测试场景中重复使用,肯定能省去非常多的时间。

总体思路跟之前的接口和性能框架一样,通过总的测试项目中把接口功能封装好,留出来测试参数。功能测试就写方法调用然后人肉检查,自动化的话把接口响应拿出来,然后验证各种数据,性能直接使用性能框架直接调用该方法即可。

花了点时间,做了一个Demo,分享给大家。

这是一个简易的接口请求方法,其中main方法里面是功能测试执行代码,用例是文档形式,这里就不写了:


public class Headgear extends NajmBase 


    public Headgear(NajmBase najmBase) 
        this.loginKey = najmBase.loginKey;
        this.args = najmBase.args;
        this.user_id = najmBase.user_id;
    

    private static NajmBase base = NajmBase.getBase(0);

    public static Headgear drive = new Headgear(base);


    /**
     * 当前正在使用的头套
     */

    public int usingHeadgearId;

    //  public JSONObject headgearInfo = new JSONObject();
    public Map<Integer, Long> headgearInfo = new HashMap<>();

    public static void main(String[] args) 
//      NajmBase.getUserBalance(base.user_id);
//      int type = 1, id = 36, packageId = 60, num = 1, price = 1;
//      NajmBase base1 = new NajmBase(V580User.getUserName(0));
//      Headgear headgear = new Headgear();
//      headgear.switchHeadgear(34);
//      output(headgear.getHeadgearInfo());
//      output(headgear.getUsingHeadgearId());
//      output(base1.loginResponse);
//      drive.getAllHeadgear();
//      new MallBase(base).buy(type, id, packageId, num, price);
//      drive.getUserHeadgearInfo();
//      NajmBase.getUserBalance(base.user_id);
//      drive.getUserHeadgearInfo();
//      drive.getOnsaleHeadgear();
        int times = 0;
        while (true) 
            times++;
            int type = 1, id = getRandomInt(2) == 1 ? 34 : 36, packageId = id == 34 ? 56 : 60, num = 1, price = 1;
            long deadtime1 = drive.getHeadgearInfo().get(id);
            Verify verify = new Verify(new MallBase(base).buy(type, id, packageId, num, price));
            drive.getUserHeadgearInfo();
            long deadtime2 = drive.getHeadgearInfo().get(id);
            if (deadtime2 - deadtime1 != DAY) break;
        
        output("一共进行了:" + times);
//      output(drive.getHeadgearInfo());
//      output(drive.usingHeadgear);
//      output(drive.loginKey);
//      output(drive.args);
//      output(base.loginResponse.getJSONObject(DATAINFO).getJSONObject("headGear").getInt("id"));
        testOver();
    

    /**
     * 获取所有头套信息,包括下架的
     *
     * @return
     */
    public JSONObject getAllHeadgear() 
        String url = HOST + HeadgearApiPath.GET_ALL_HEADGEAR;
        HttpGet httpGet = getHttpGet(url);
        JSONObject response = getHttpResponseEntityByJson(httpGet);
        output(response);
        return response;
    

    /**
     * 用户切换头套接口
     *
     * @param hid
     * @return
     */
    public JSONObject switchHeadgear(int hid) 
        String url = HOST + HeadgearApiPath.SWITCH_HEADGEAR + hid + changeJsonToArguments(args);
        HttpPost httpPost = getHttpPost(url);
        JSONObject response = getHttpResponseEntityByJson(httpPost);
//      output(response);
        return response;
    

    /**
     * 获取用户头套信息
     *
     * @return
     */
    public JSONObject getUserHeadgearInfo() 
        sleep(1);
        String url = HOST + HeadgearApiPath.GET_USER_HEADGEAR;
        JSONObject response = getHttpResponseEntityByJson(getHttpGet(url, args));
        output(response);
        if (isRightResponse(response)) 
            headgearInfo.clear();
            JSONArray jsonArray = response.getJSONArray(DATAINFO);
            jsonArray.forEach(json -> 
                    JSONObject jsonObject = JSONObject.fromObject(json.toString()) ;
                    String name = jsonObject.getString("name") ;
                    long deadTime = jsonObject.getLong("deadlineTime") ;
                    int headgearId = jsonObject.getInt("goodId") ;
                    int use = jsonObject.getInt("isUse") ;
            if (use == 1) usingHeadgearId = headgearId;
            headgearInfo.put(headgearId, deadTime);
            output(name, headgearId, getTimeByTimestamp(deadTime));
         );
        
        return response;
    

    /**
     * 获取在售的头套的列表
     *
     * @return
     */
    public JSONObject getOnsaleHeadgear() 
        String url = HOST + HeadgearApiPath.GET_ONSALE_HEADGEAR;
        JSONObject response = getHttpResponseEntityByJson(getHttpGet(url, args));
        output(response);
        return response;
    

    public int getUsingHeadgearId() 
        getUserHeadgearInfo();
        return usingHeadgearId;
    

    public Map<Integer, Long> getHeadgearInfo() 
        getUserHeadgearInfo();
        return headgearInfo;
    

下面是基于该功能的自动化测试用例,main方法里面是调试用例的过程,执行用例的方法在之前的文章写过,利用反射去记录用例信息和执行测试用例,并保存测试结果,输出测试报告,异常预警等等:

/**
 * 用户0-10
 */
public class HeadgearCase extends SourceCode 
    static HeadgearCase headgearCase = new HeadgearCase();
    static NajmBase base = new NajmBase(V580User.getUserName(0));
    static Headgear drive = new Headgear(base);

    public static void main(String[] args) 
//      headgearCase.testDemo001();
//      headgearCase.testDemo002();
//      headgearCase.testDemo003();
//      headgearCase.testDemo004();
        headgearCase.testDemo005();
//      headgearCase.testDemo006();
        ApiLibrary.testOver();
    

    /**
     * 获取所有头套信息用例
     */
    public void testDemo001() 
        String label = "获取所有头套信息用例" + TAB + Thread.currentThread().getStackTrace()[1];
        Verify verify = new Verify(drive.getAllHeadgear());
        JSONObject result = new JSONObject();
        result.put("状态码为0", verify.isRight());
        result.put("包含数组", verify.isArray("heads"));
        result.put("包含已下架的头套", verify.isContains("自动化专用3"));
        result.put("包含正在出售的头套", verify.isContains("自动化专用1"));
        MySqlTest.saveTestResult(label, result);
    

    /**
     * 获取在售的头套用例
     */
    public void testDemo002() 
        String label = "获取在售的头套用例" + TAB + Thread.currentThread().getStackTrace()[1];
        Verify verify = new Verify(drive.getOnsaleHeadgear());
        JSONObject result = new JSONObject();
        result.put("状态码为0", verify.isRight());
        result.put("包含数组", verify.isArray("dataInfo"));
        result.put("不包含已下架的头套", !verify.isContains("自动化专用3"));
        result.put("包含正在出售的头套", verify.isContains("自动化专用1"));
        result.put("包含描述信息", verify.isContains("测试10天"));
        MySqlTest.saveTestResult(label, result);
    

    /**
     * 获取用户头套信息用例
     */
    public void testDemo003() 
        String label = "获取用户头套信息用例" + TAB + Thread.currentThread().getStackTrace()[1];
        Verify verify = new Verify(drive.getUserHeadgearInfo());
        JSONObject result = new JSONObject();
        result.put("状态码为0", verify.isRight());
        result.put("用户头套正常", verify.isContains("自动化专用1"));
        result.put("用户佩戴正常", verify.isContains(""isUse":1"));
        result.put("头套套餐正常", verify.isContains("测试1天"));
        MySqlTest.saveTestResult(label, result);
    

    /**
     * 余额不足购买用例
     */
    public void testDemo004() 
        String label = "余额不足购买用例" + TAB + Thread.currentThread().getStackTrace()[1];
        NajmBase base = new NajmBase(V580User.getUserName(1));
        int type = 1, id = 36, packageId = 60, num = 1, price = 1;
        Verify verify = new Verify(new MallBase(base).buy(type, id, packageId, num, price));
        JSONObject result = new JSONObject();
        result.put("状态码为35", 35 == verify.getCode());
        MySqlTest.saveTestResult(label, result);
    

    /**
     * 正常购买用例
     */
    public void testDemo005() 
        String label = "正常购买用例" + TAB + Thread.currentThread().getStackTrace()[1];
        int type = 1, id = getRandomInt(2) == 1 ? 34 : 36, packageId = id == 34 ? 56 : 60, num = 1, price = 1;
        int balance = NajmBase.getUserBalance(drive.user_id);
        long deadtime1 = drive.getHeadgearInfo().get(id);
        Verify verify = new Verify(new MallBase(base).buy(type, id, packageId, num, price));
        drive.getUserHeadgearInfo();
        long deadtime2 = drive.getHeadgearInfo().get(id);
        int balance1 = NajmBase.getUserBalance(drive.user_id);
        JSONObject result = new JSONObject();
        result.put("状态码为0", verify.isRight());
        result.put("截止日期正确", (deadtime2 + EMPTY).equals(verify.getValue("deadlineTime")));
        result.put("头套日期增加正常", deadtime2 - deadtime1 == DAY);
        result.put("用户余额减少正常", balance - balance1 == 1);
        MySqlTest.saveTestResult(label, result);
    

    /**
     * 用户切换头套用例
     */
    public void testDemo006() 
        String label = "用户切换头套用例" + TAB + Thread.currentThread().getStackTrace()[1];
        drive.getAllHeadgear();
        int id1 = drive.getUsingHeadgearId() == 34 ? 36 : 34;
        Verify verify = new Verify(drive.switchHeadgear(id1));
        int id2 = drive.getUsingHeadgearId();
        JSONObject result = new JSONObject();
        result.put("状态码为0", verify.isRight());
        result.put("头套切换成功", id1 == id2);
        MySqlTest.saveTestResult(label, result);
    

下面是一个针对其中某个功能的性能测试用例(测试用例分两种,一类是HTTP单次请求的,我才用了获取请求的HttpRequestBase对象然后去重新发送并发请求,一类是多接口或者非HTTP请求,如dubbo,mysql,redis,消息队列等等,直接调用的方法进行压测):

简单HTTP请求:

class CancelReason extends OkayBase

    public static void main(String[] args) 
        def argsUtil = new ArgsUtil(args)
        def thread = argsUtil.getIntOrdefault(0, 2)
        def times = argsUtil.getIntOrdefault(1, 5)

        def base = getBase()
        
        Headgear drive = new Headgear(base);
        drive.getAllHeadgear()
        def request = FanLibrary.getLastRequest()

        def timesthread = new RequestThreadTimes(request, times)
        new Concurrent(timesthread, thread,"获取所有头套,内容流转二期压测接口").start()

        allOver()
    

非简单HTTP请求的请参考之前写过的性能测试框架Demo:性能测试框架第二版。这类方法写起来比较简单,使用范围很高,但是需要根据不同的业务需求解决多线程数据和对象的安全问题。

整个项目放在git上,功能测试在本地,自动化项目和性能项目在服务器,采用Groovy脚本运行,也可以在本地调试。自动化项目采取定时或者间隔固定时间自动运行,性能项目收到输入命令groovy filename.groovy来运行。


  • 郑重声明:文章首发于公众号“FunTester”,禁止第三方(腾讯云除外)转载、发表。

技术类文章精选

非技术文章精选

jmeter基础016----jmeter接口功能性能自动化测试

一、JMeter接口功能测试1、概述   接口功能测试主要是测试系统中各个接口基本功能是否能够正常运行提交的数据(正向数据+逆向数据),模拟用户的多样性操作,检测程序的响应是否合情合理(符合预期)。2、功能测... 查看详情

接口测试的步骤特点关注点get和post区别

...如何设计测试用例?功能  逻辑  异常  安全  自动化测试规范:代码可读性  同事都可以看得懂    可维护性  隔了几个月或同事,能够看懂    可拓展性  换了一个项目也可以使用这个框架    ... 查看详情

事半功倍:学会web性能测试用例设计模型

性能测试用例设计通常不会一次设计到位,是一个不断迭代完善的过程,即使在使用过程中,也不是完全按照设计好的测试用例来执行,需要根据需求的变化进行调整和修改。WEB性能测试用例设计模型是一个内容... 查看详情

接口测试方案怎么写

参考技术A问题一:如何做接口测试对于接口测试,首先测试人员要懂代码,你只需要知道接口的作用是什么就可以了(有文档更好,但大部分都没有);其次,自己去读开发的代码;然后,根据该接口功能及代码写测试用例;... 查看详情

jmeter-接口测试项目(代码片段)

...############################测试学生管理系统1,功能测试,2,自动化测试让程序代替人工做测试,提交的数据是程序生成的,还有断言是程序自动判断的,3,性能,压力测试,响应时间,高并发,高负载,4,生成html格式的测试报告... 查看详情

测试,我误解了你

...要命的,我们谈到软件测试人员未来的发展方向大致有:自动化测试,性能测试,测试管理,项目经理。这其中自动化测试和性能测试包括项目管理,都会要求对软件开发有深入的理解,如何能设计一个好的自动化框架,好的性... 查看详情

测试用例基本概念

测试用例基本概念   测试用例是为特定的目的而设计的一组测试输入、操作步骤和预期结果。每个测试用例都是用户实际可操作的步骤,通过测试用例的执行去验证交付给客户的软件的功能是满足的用户的要求。测试... 查看详情

接口自动化测试框架(java实现)(代码片段)

需求分析需求点需求分析通过yaml配置接口操作和用例后续新增接口和测试用例只需要编写yaml文件即可实现。可以支持接口间的参数传递具有参数依赖的接口可以进行变量的抽取和参数赋值。支持全局、用例维度的变量存储比如... 查看详情

mxsuite—iso26262认证的嵌入式软件一体化测试平台

...以图形化交互式地设计测试用例,灵活组成测试场景进行自动化测试?MxSuite具备70+汽车业内主流的软件接口,可支持符合Autosar协议开发软件单元测试?测试平台通过功能安全等级认证,对安全等级较高的控制器过产品认证有很大... 查看详情

如何设计测试用例

测试用例设计方法一、Android系统功能测试设计的测试用例:a.对所测APP划分模块b.详细列出每个模块的功能点(使用Xmind绘制功能图)c.使用等价类划分、边界值、场景法等对各功能点编写测试用例(考虑中断功能测试用例)d.执... 查看详情

软件测试

...值分析、错误推测、因果图和综合策略。性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通 查看详情

接口自动化测试实践指导(中):接口测试场景有哪些

在第一篇文章接口自动化测试实践指导(上):接口自动化需要做哪些准备工作中详细给小伙伴们讲解了一下接口自动化需要做哪些准备工作,准备工作中最后一步接口测试用例设计是非常重要的一个环节,... 查看详情

接口自动化测试选型-httprunner

...通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。1.3  httprunner设计理念充分复用优秀的开源项目,不追求重复造轮子,而是将强大的轮子组装成战车... 查看详情

支持案例自动生成功能的接口自动化测试平台

...此,随行付IRONTEST研发团队负责人为我们讲述了随行付的自动化测试探索之路,从中可以一窥中国自动化测试研发道路的艰辛历程。案例自动生成功能基于全对偶理论现在测试人员应用IRONTEST零代码接口测试平台的主要时间花费... 查看详情

接口自动化

一、概念1.什么时接口自动化?接口自动化就是传入输入,检查输出的一个过程,优点:相比UI测试,有效且稳定,比单元测试更容易上手。 2.如何做好接口自动化? 梳理测试用例,将测试点罗列出来,设计好测试用例。... 查看详情

性能测试用例设计

                查看详情

自动化测试用例设计

一、了解自动化测试的目的和作用  自动化测试是为了让测试人员从繁琐重复的机械式测试过程中解脱出来,把时间和精力投入到更有价值的地方,从而挖掘更多的产品缺陷。目前自动化测试更多的是定位在冒烟测试和回归测... 查看详情

自动化测试用例设计

一、了解自动化测试的目的和作用  自动化测试是为了让测试人员从繁琐重复的机械式测试过程中解脱出来,把时间和精力投入到更有价值的地方,从而挖掘更多的产品缺陷。目前自动化测试更多的是定位在冒烟测试和回归测... 查看详情