通用性接口健壮性扫描方案(一)

发表于:2021-9-03 09:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:有赞团队    来源:有赞技术

  一、背景
  1.1 业务背景
  随着公司业务的快速发展,需求越来越多、迭代越来越快,在有限的测试人员和时间投入的前提下,如何做好质量防控,如何提高测试效率,是大家持续思考的问题。
  公司业务越来越复杂,应用越来越多,接口越来越多,接口的参数也越来越多,如何做好接口测试?如何做全接口的每一个参数的测试?
  在测试过程中,测试人员主要面临以下问题:
  测试人员都把精力放在核心的业务测试上。很少腾出时间来关注接口的各种参数类型的测试。
  接口越来越多、接口参数也越来越多,很难做到每个接口、每个参数的穷尽测试。
  针对接口参数设计的测试用例,用例数量通常都很多,如果只靠人工投入,会大大增加测试人员的时间成本,降低测试效率。
  测试人员核心关注点在正常的业务数据上,非正常业务数据相关的逻辑很少考虑周全,比如最大值、最长字符、特殊值等。
  面对以上的问题,如果所有的测试都靠人工来完成,那将是很大的一笔人工和时间开销。是否可以自动化构造测试数据来自动化部分测试类型,将是本文解决的问题。

  1.2 本文解决的问题
  为了解决上述问题,本文介绍了通用性接口健壮性扫描方案。本方案也为质量保证、高效测试奠定了基础。
  该方案重在忽略业务之间的差异,主要解决了以下问题:
  建立通用的规则来生成测试用例
  解决通用性接口测试问题,比如边界值、最大值等
  全自动化生成、执行测试用例,整个过程无需人工参与,节约成本
  根据特定的产品规则,解决产品上的共性问题

  二、系统设计
  测试的执行过程一般分为三步:生成测试用例、测试用例执行、测试结果分析。通用性接口健壮性扫描主要围绕这三个过程展开。主要分为以下几个核心流程:
  数据源数据拉取及处理:该步骤基于各种平台,比如网关、流量回放等,主要为了获取基线测试用例。
  用例规则模型建立与用例生成算法制定:制定通用性用例规则模型,同时也扩展了自定义用户规则模型,根据对应的算法,比如字段的Empty与非Empty,字段的NULL与非NULL,特殊值制定等比如字符型参数最长字符,数值型参数最大值、最小值以及通用性的特殊值等,生成用例数据。
  用例执行:根据基线测试用例,会获取到对应的服务、方法、测试环境。根据2的模型与算法,生成所有的用例数据,然后进行接口的调用及记录执行结果。
  结果分析:通用性接口健壮性扫描方案,对结果也是进行无业务逻辑的通用性的结果分析。这里包括结果规则模型的确定与结果分析,剥离出有问题的测试用例结果并自动反馈。
  整体流程图如下:

  2.1 数据源解析
  整个设计的基础是基于基线测试用例。为了获取基线测试用例数据,需要建立数据源拉取策略。数据源来源于以下平台:网关平台、流量回放平台等。
  网关层数据的数量巨大,如果拉取数据量过多,会导致拉取时间过长,很容易失败。同时如果多个应用或者多个线程同时拉取,很容易出现并发问题导致数据源拉取失败。
  为了避免大量的无效数据源数据拉取,首先建立数据源数据拉取策略,争对性的拉取数据。同时为了避免数据量过多而导致拉取数据失败,设置了每30min拉取一次数据,如果本次拉取失败,则任务重试N次,成功则停止拉取,N次失败后在不在拉取。
  获取数据源后,即可对数据源进行解析。通过数据源数据,解析出对应的应用、服务、参数类型、接口参数等,通过接口参数来获取基线用例数据。因为整个公司的应用很多,所以,根据配置策略,只解析在系统里配置过的应用数据,过滤掉没有配置过的应用的数据。下面是整个数据源的拉取与解析流程图。

  网关平台的数据源只包含网关层的信息,并不能获取到后端的服务信息。我们的调用是基于dubbo服务的调用,所以还需要通过有赞网关平台,查询并获取到对应的dubbo服务的名称、方法、参数类型、返回值类型等信息。然后根据网关的参数,组装成dubbo服务的接口参数,最后把这些数据进行持久化存储。
  为了丰富基础用例数据,后续会接入多种平台,获取更多的数据源数据。

  2.2 用例数据生成算法模型
  本篇文章的核心在于建立通用性用例数据生成的算法模型。核心流程如下:

  首先建立基本的算法模型,主要包括基本的规则以及按照规则生成用例数据的算法。同时还扩展了用户自定义规则,根据用户自定义规则来生成对应的用例数据。
  下面简单举例NULL规则生成的数据用例过程:
比如

class ParentObject{

        Integer paattr1;

        String paattr2;

        SubObject paattr3;         

}

class SubObject{

        Integer sbattr1;

        String sbattr2;

}

public RetType testMethod(ParentObject  parentObject){}

上述方法的基线用例为:

{
    "paattr1":3,
    "paattr2":"parentobjectnullcases",
    "paattr3":{
        "sbattr1":100,
        "sbattr2":"subobjectnullcases"
    }
}

根据NULL规则,会生成如下的测试用例:

用例1:
{
    "paattr2":"parentobjectnullcases",
    "paattr3":{
        "sbattr1":100,
        "sbattr2":"subobjectnullcases"
    }
}

用例2:
{
    "paattr1":3,
    "paattr3":{
        "sbattr1":100,
        "sbattr2":"subobjectnullcases"
    }
}

用例3:
{
    "paattr1":3,
    "paattr2":"parentobjectnullcases",
    "paattr3":{
        "sbattr2":"subobjectnullcases"
    }
}

用例4:
{
    "paattr1":3,
    "paattr2":"parentobjectnullcases",
    "paattr3":{
        "sbattr1":100
    }
}

  上述的NULL规则用例生成具有很好的通用性。EMPTY规则生成和NULL类似。特殊值类型的规则制定,尤其是特殊值的制定,除了使用通用性的数据规则之外,如Double.MAXVALUE,Integer.MAXVALUE等,还可以使用业务上的通用性特殊数据。具体如何制定特殊值,需要根据业务来分析。
  特殊值规则制定好之后,则根据参数类型,用指定的特殊值去替换,生成对应的测试用例。假设这里指定如下特殊值:Integer.MAX_VALUE与String.maxLength("AAA.........")。最后生成的用例如下:
用例1:
{

    "paattr1":Integer.MAX_VALUE,
    "paattr2":"parentobjectnullcases",
    "paattr3":{
        "sbattr1":100,
        "sbattr2":"subobjectnullcases"
    }
}

用例2:
{
    "paattr1":3,
    "paattr2":"parentobjectnullcases",
    "paattr3":{
        "sbattr1":Integer.MAX_VALUE,
        "sbattr2":"subobjectnullcases"
    }
}

用例3:
{
    "paattr1":3,
    "paattr2":"String.maxLength("AAA.........")",
    "paattr3":{
        "sbattr1":100,
        "sbattr2":"subobjectnullcases"
    }
}

用例4:
{
    "paattr1":3,
    "paattr2":"parentobjectnullcases",
    "paattr3":{
        "sbattr1":100,
        "sbattr2":"String.maxLength("AAA.........")"
    }
}

  上述两种都是通用的规则算法,实际应用中远不止这些,有很多需要根据业务规则来确定规则模型。自定义算法模型就是根据用户自定义规则来生成对应的数据用例,增加了模型建立的灵活性。每个模型都有各自对应的生成算法,每个模型需要实现generateCases方法即可。总的获取所有模型用例算法流程如下:
public List<Cases> caseGenerate(){

        for(AlgorithmModel  algorithmModel: algorithmModels){

                baseCase = getBaseCase();

                caseTmpList = algorithmModel.generateCases();

                cases.addALl(caseTmpList);

        }

      return cases;

}

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号