• 12
  • 13
分享

软件测试有多种多样的方法和技术,可以从不同角度对它们进行分类。其中,根据软件生命周期,针对不同的测试对象与目标,可将测试过程分为4个阶段:单元测试、集成测试、系统测试和验收测试。本文着重介绍了如何借用pytest与httprunner进行接口自动化测试。

一、 什么是接口测试

根据wiki中的定义,接口是一个共享的边界,计算机系统的多个独立组件通过它交换信息。这些信息的交换可以基于软件、硬件、外部设备、人和它们之间的组合。根据上述定义,可以面向软件、硬件、交互设备等展开接口测试。软件的接口测试是面向独立组件之间接口的一种测试,主要用于检测内外部系统及内部各子系统之间的交互点。测试的重点在于检查逻辑正确性、交互依赖性、数据正确性.

二、 引入自动化背景

基于以下几个情况,数栈引入自动化测试,以期提高测试效率,保障交付产品质量。

1、产品迭代迅速

目前数栈产品已经迭代至Release4.3版本。每过几个月进行一次产品release更新让回归测试的工作量持续上升。接口自动化测试可以很好的减少回归工作量。

2、应用系统日趋复杂

数栈目前自研8款产品和多个插件,产品之间的交互与产品-插件之间的交互日趋复杂。客观现实带来了更大的测试风险,测试消耗成本越来越高,花费的时间也越来越长。接口自动化测试可以提高测试效率。

3、部署环境多样

作为一款面向大数据的产品,除了开源的Hadoop,还需要适配TDH、CDH、HDP等其他引擎。同时,各种客户的POC环境也需要大量人力支持。

三、 自动化技术选型

接口测试可以使用的工具有很多,Postman、Jmeter、REST-Assured、SoapUI、httpclient等等。数栈产品使用的是HttpRunner这个框架。相比较于前几类工具,它具有以下特点:

1、简单易用。

虽然前几款工具中有图形化界面可以让人直观的进行操作,但HttpRunner以“关键字”的优势可以让QA快速的上手框架,对代码能力要求低。根据对应的关键字填入相应的值,即可生成一条测试用例。

2、可扩展性强

HttpRunner的V3版本支持了pytest,可以方便的借助pytest插件解决接口测试中遇到的问题,如数据驱动、参数化等。jUnit虽然也具有扩展性强的特点,但是Java语言对于QA来说太重,且学习成本比HttpRunner更高。

1、易于集成CI

HttpRunner支持CLI命令,可以方便的接入Jenkins、Gitlab CI等工具。

2、录制回放

通过Charles、Fiddler等工具将请求到处为.har文件,然后通过HttpRunner提供的命令,就可以将.har文件转换成json/yaml文件。

数栈产品曾使用过Jmeter作为接口自动化工具。Jmeter拥有可视化图形界面,通过拖动组件信息就可完成用例编排,方便QA使用。但是Jmeter的内置函数不能满足于复杂的数栈产品,虽然可以选择beanshell来写工具脚本,但其难以调试,第三方包管理困难等问题使编写效率低下。同时Jmeter容易出现编码混乱、日志不易于查看等问题。

HttpRunner作为一款优秀的开源框架,在GitHub上拥有2.6k star,集简单易用、扩展性强、易于集成、录制回放等特性于一体,相比较于Jmeter更适用于数栈自动化实践。

四、 自动化测试用例

数栈整体自动化测试架构如下图所示。从上到下可分为用户层、配置层、用例层、数据源。用户可以通过Docker镜像、Pipeline、定时任务来触发自动化任务。运行的结果记录到禅道,然后通过接入自研的EasyV进行展示。配置文件分为两类:一类是应用系统信息,如业务数据库信息、域名、账号密码等;另一类是数据源信息,用于用例的执行,现在支持的数据源有MySQL、Oracle、Kafka、HBase等等。从业务层面分,可以分为8个产品,每个产品编写各自的用例;从执行层面分,可分为接口测试和场景测试。若选择接口测试,则会运行所有产品的接口测试用例。下面拿接口测试用例进行举例说明。

11.png

一条接口测试用例可分为两部分:配置和测试步骤。先来看配置:

config = (
        Config("测试创建项目接口")
            .variables(
            **{
                "cookie": Cookie().get_cookie(),
                "url": api.aiworks.aiworks_api.AiworksApi.create_project.value,
                "tenant_name": ENV_CONF.uic.tenant_name,
                "project_name": project_name
            }
        )
            .base_url(ENV_CONF.base_url.rdos)
    )

首先第一个遇到的问题就是获取cookie。基本上接口都需要cookie或者token校验才能调用,因此将获取cookie的方法抽象提取成一个get_cookie(),避免了每个用例写一遍登陆。这个方法就属于架构图中预置函数的模块。url、tenant_name、project_name三个变量是后续测试步骤中所需要用到的变量值,这些都预先在variables中定义好。其中还可以看到有AiworksApi、ENV_CONF这几个文件。AiworksApi是所有Aiwork产品的接口枚举类,对接口内容进行管理;ENV_CONF包含了整个自动化项目的配置信息,是一个配置文件,属于配置层。

teststeps = [
        Step(
          RunRequest("开始请求创建项目接口")
            .post("$url")
            .with_headers(**{"cookie": "$cookie"})
        .with_json(
            {
                    "enableCycleSchedule": "$enableCycleSchedule",
                     "isSwitchJupyter": "$isSwitchJupyter",
                     "projectAlias": "$projectAlias",
                     "projectDesc": "$projectDesc",
                     "projectEngineList": "$projectEngineList",
                     "projectName": "$projectName",
                     "switchGpu": "$switchGpu"
                }
        )
            .validate()
            .assert_equal("status_code", 200)
            .assert_equal("body.code", "$code")
            .assert_contains("body.message", "$message")
            .teardown_hook("${delete_project()}")
        )
    ]

然后在测试步骤部分,整个teststeps由Step数组构成。可以看到创建项目这个接口只有一个Step,整个Step分为post、with_headers、with_json、validate、teardown_hooke5个部分组成。其中,with_json中key-value键值对的值全都是引用的方式来取得,而不是写死的固定值。这样就可以将用例与数据区分开来。而具体的值则通过@pytest.mark.parameterize这个装饰器传入,params里定义了这个用例所需的所有字段值。整体用例编写思路为“用例与数据分离”,避免修改测试用例需要改动大量的代码。

@pytest.mark.parametrize("params", params)
    def test_start(self, params):
        super().test_start(params)

所以整体来看,HttpRunner框架提供了一个用例模版--由多个关键字组成,使用者只需要将模版中的内容填充完整,就可以完成一条用例的编写。

五、自动化成果

自2021年4月自动化立项以来,已编写超过900条用例,8个子产品接口覆盖率平均达到60%以上。每日通过Jenkins构建定时任务,在持续集成环境对最新的代码进行自动化测试。同时,自动化测试接入了测试环境、客户环境中使用。在提供环境信息完备的情况下,可以随时接入自动化,并运行得出报告给到QA,大大减少了回归工作量,从原先3-4周的时间缩短到1-2周完成。


作者:袋鼠云数栈DTinsight

原文链接:https://my.oschina.net/u/3869098/blog/5286875

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 前言小程序直播功能,分为使用官方自带的直播组件( live-player-plugin ,无需二次开发,开箱即用),另一种就是使用自己服务器的流,自定义直播组件(live-player、live-pusher),这里主要讲述,第一种的使用一、准备第一要了解是否满足 直播开通条件基本满足开头直播条件的功能里会有直播,然后去申请开通一下就行了创建直播间这个直播码就是主播开启直播的入口,主播扫码就可以进入基本信息点击后选择手机直播推流直播创建时需要核实身份 同时开播时间必须在12小时内 第一次开通需要人脸识别验证样式配置二、开发使用引入插件原生引入在app.jison1. 主包引入 &nb...
            13 14 2440
            分享
          •   之前我们讲过,测试工程师的4层技术发展路线都需要掌握哪些技能。学而优则仕,今天我们来说说如果想做某个行业的专家应该掌握哪些技能。  如果你对测试技术不感兴趣,但对某领域的业务兴趣浓厚,可以考虑行业专家路线。  由于测试工程师对产品和业务很熟悉,成为专业的产品经理和业务专家,而且目前很多公司在Beta测试时需要专门的业务工程师或业务专家参与测试。  且配置管理和质量管理也是软件测试工程师职业的一个发展方向:测试工程师——业务测试专家/测试咨询专家/用户体验专家/产品设计专家/软件质量管理专家/项目经理。  晋升方法  大厂  如果你是在大厂,了解公司相关晋升制度,寻求晋升机会,与领导或人力资...
            0 0 684
            分享
          • 最近这周比较忙,项目上线,没有来得及更文。昨天项目终于结束了,今天可以回归更文了。简单讲讲上个项目过程中遇到的一些我觉得可以避免的问题。对于测试新人来说可能经常会犯,但是稍微有点经验的同学都能避免的事情。昨天版本预定的是晚上6点上线,昨天上午刚过来就给实习生说,今天应该没有什么大问题了,对照着原型把版本再过一遍,以防有东西遗漏,交代完之后就全身心投入和开发扯皮昨天未完成的功能了。等到了下午的时候,见实习生那边没什么动静,我这边自己也加入查漏补缺的行列中,一页一页的功能过下去,扫到一个详情页,突然觉得有点不对劲,怎么这个标题下面这么多空白的地方呢,看着间距也太大了吧,对照着原型一看,不得了,这块...
            1 1 13064
            分享
          • 1、引言小屌丝:鱼哥,我看了你这篇《Windows系统性能监控(一) 性能监视器介绍及使用》,让我学到了好多知识。小鱼:嗯,我自己在写这篇文章的时候,也学到了好多。小屌丝:是吗,你不都是知道了,咋还又学到了好多;小鱼:这个很正常啊,你把你会的知识,重新以文字的形式输出出啦, 你就会发现, 你又有了更深的一层理解,甚至,你会发现,你以前理解的是不是不全呢?小屌丝:额… 还有这层功效??小鱼:不仅是功效,还是疗效…小屌丝:好吧,我只能说,知识的匮乏,加大了我与大佬之间的距离…小鱼:大佬,那都是被摧残了无数次以后,依然"站立着",依然坚持着自己最初的梦想,依然持续的奋斗着。小屌丝...
            1 0 3280
            分享
          •   说到Jmeter,大家都知道是做接口测试和性能测试的一个工具。很多人脑中会浮现参数化、集合点、检查点等名词,前两篇已经介绍了Jmeter的入门操作,那今天我们就来看如何修改我们的脚本来实现参数化。  举例是我一贯的风格,之前举例截图中,Jmeter都是中文版的操作界面,但是小白根据我的文章进行搭建环境后,发现是英文版的。其实Jmeter自带语言转换功能。操作如下:  点击”Options”->”Choose Language”->”Chinese(Simplified)”  还有一种方法,在Jmeter的bin目录下,找到jmeter.properties文件,右键编辑如下图:...
            4 3 2727
            分享
      • 51testing软件测试圈微信