前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一套测试用例如何实现支持多个环境运行

一套测试用例如何实现支持多个环境运行

原创
作者头像
测试开发技术
修改于 2020-05-13 09:08:23
修改于 2020-05-13 09:08:23
2.1K00
代码可运行
举报
文章被收录于专栏:测试开发技术测试开发技术
运行总次数:0
代码可运行

点击右侧「测试开发技术」,选择“关注”,优质文章,第一时间送达!

公众号:测试开发技术(mikezhou_talk)

一款需要正式对外发布的产品,通常都需要经历一个较完整的测试验证过程,在整个产品质量验证阶段,一般会经历几类测试环境的验证:从产品集成阶段的测试环境->验收阶段的预发布环境->正式发布回归的生产环境

由于不同环境之间或多或少存在一些差异性,为了能将这些环境差异性导致的问题充分暴露出来,测试人员需要在这些不同的环境中都要进行必要的测试验证。

接口自动化测试作为质量保障的一种手段,除了用在测试阶段,也需要用在预发布环境和生产环境。

很多时候,为了能让测试用例运行在多套环境中,不得不维护多套测试脚本、测试用例。这种方式虽然可行,但会造成大量的测试用例、测试脚本冗余,以及巨大的后期维护工作量。

那么有没有一种方式或者说实现策略,可以实现一套接口测试用例可按照特定测试需求运行在多套环境中呢?答案是肯定的

接下来,就带着大家,分别从测试框架语言实现两个层面介绍如何实现一套测试自动化用例脚本运行在多个环境下(属于自动化测试实施高阶技巧)。

相信很多读者能感受到一个明显现象,公司规模越大,对各类环境的定义也会更加清晰、明确,环境种类也会进一步的细分。这么多环境的加持下,对自动化测试实施过程提出了一个挑战或者说是需求:自动化用例应当支持在不同环境里执行,并且对用例逻辑层透明无感。

为了实现诸如此,有些人,采取了较为”傻瓜式“的方式,拿下面这段代码为例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def test_login(self):
    if env = "dev":
        requests.post("https://dev.xxx.com/login", data={"username":"dev", "password":"123456"})
        do_something()
    elif env = "test":
         requests.post("https://test.xxx.com/login", data={"username":"test", "password":"123456"})
         do_something()
    elif env = "pre":
        requests.post("https://pre.xxx.com/login", data={"username":"pre", "password":"123456"})
        do_something()
    else:
        requests.post("https://www.xxx.com/login", data={"username":"superadmin", "password":"123456"})
        do_something()

看完上述代码写法,有没有似曾相识的同学,如果有的话,很不幸地告诉你,你采取了最不为推荐的方法。上述示例还仅仅只是一条用例,如果自动化测试用例体量大(实际都不会小),自动化测试用例脚本维护代码重复量带来的灾难性可想而知。

仔细分析一下,要实现一套测试用例在多环境下执行,要解决哪些问题:

  • 不同环境的服务入口地址不同,一般还会有http/https的差别
  • 不同环境需要使用不同的测试数据
  • 一些中间件,比如数据库消息队列、缓存服务的访问地址、账号、配置有差别
  • 不同环境的第三方回调地址有差别
  • 不同环境的配置需要整体切换,不能出现在测试环境里用了生产环境的数据的问题

以上都是些常见的问题,实际不同公司下,有些业务功能在实现上都还存在差异,不过这种就不在我们讨论的范围内了。

针对上述的这些主要问题,归纳总结一下,不难发现,在不同的环境中,对于同一个接口测试来说,测试过程的逻辑基本都是一样的,而造成不同环境用例无法复用的因素最主要有两个:

所调用到的服务域名地址不同,不同环境对应的域名是不同的。比如测试环境的域名为test.xxx.com,而正式环境的域名对应为www.xxx.com。

测试数据、配置数据不同,不同环境对应的测试数据和用到的配置数据存在不同。比如测试环境对应的用户ID为123456,但在正式环境对应的用户ID可能就变成了654321。

而针对不同环境,调用的服务域名地址不同,解决该问题的基本思路用两个关键词概括:抽象、枚举。

如何抽象,如何枚举,下面分别从测试框架(以Robot Frameowork框架为例)和语言实现层面(以Python语言)为大家逐一介绍。

1. 测试框架支持多环境运行思路

下述以Robot Framework框架为例,介绍如何实现一套测试用例支持多个不同运行环境,不同框架实现思路皆相通,其它框架可供参考借鉴。

在RF框架下,实现此类需求,总的原则是利用:外部变量文件+全局动态变量,将接口测试脚本中涉及传入域名的值统一封装抽离为一个统一的公共环境变量,并且将各个不同环境域名统一存放到一个公共环境配置变量文件中。

先来看一则脚本片段截图:

可以看到,在调用request_post关键字发起POST请求时,需要传入域名地址${URL}、接口路径${path}、接口参数${datas}等。而对于同一个接口,不管是在哪个环境下,接口路径${path}和接口参数${datas}都应该是一样的。而对于接口地址${URL},在不同环境中对应的值会有所不同。但从图中我们并没有发现${URL}变量定义的位置,它的值是从哪里传进来的呢?

关于接口地址${URL}变量值动态引入,通常有两种方式。

  • 通过外部变量文件引入。
  • 通过全局动态参数引入。

1.1 通过外部变量文件引入

(1)定义好接口测试实战项目的目录结构,在Resource | Lib 目录下,创建环境配置变量文件,文件名称定义为config.py,文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding=utf-8
# 环境配置文件

# 测试环境
# URL = 'https://test.xxx.com'

# 预发布环境
# URL = 'https://pre.xxx.com'

# 生产环境
URL = 'https://www.xxx.com'

在config.py环境配置文件中,定义各个不同环境(测试环境、预发布环境、生产环境)的服务域名地址,且变量名统一为URL。在运行接口测试时,保留当前需要运行测试用例的环境地址,其他环境变量注释掉即可。

在实际项目当中,config.py配置文件中的地址替换成真实的接口服务地址即可,例如,上述配置文件中保留了生产环境的地址,此时运行接口测试用例,则调用的为生产环境的接口测试。需要注意的是,在同一个项目下,不同环境下的接口服务地址需要采用相同的变量名称,定义好后,在Robot Framework测试脚本中直接通过${URL}变量形式来引用环境变量值。

(2)环境配置变量文件创建好后,选择Resource | Business| 业务资源文件,在资源文件Settings配置选项中选择Add Variables添加变量文件,依次选择config.py配置文件存储路径,如图所示。

(3)config.py变量文件导入成功后,当需要在不同环境下运行接口测试用例时,可在用例脚本不做任何变更的情况下,只需要更改config.py配置文件中的地址即可实现一键切换接口测试运行环境。

1.2 全局动态参数引入

通过外部变量文件的形式引入,虽然可以实现在测试脚本不做任何变更的前提下完成一套用例多套环境运行的目的,但每次在不同环境运行时,需要去环境变量文件中进行调整,虽然调整幅度较小(只需要进行注释),但仍然不是那么便捷。

在Robot Framework中还在一种更便捷灵活的方式来实现此目的,即通过全局参数变量引用形式来实现对应变量值的全局动态修改。而采用参数变量引用的形式来实现变量值的动态修改,也分为两种方式。

1) 第一种方式:Arguments参数栏

在RIDE编辑器Run运行标签下的Arguments参数栏中增加参数变量--variable key:value。如下图所示,增加了一个变量名为URL,变量值为https://test.xxx.com。

参数栏中增加变量的书写格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-v变量名:变量值或者--variable变量名:变量值。

上图中,参数栏填入-v URL:https://test.xxx.com,对URL变量赋值为https://test.xxx.com。这样在运行接口测试用例时,会将URL对应的变量值动态修改赋值为https://test.xxx.com。此时即使环境变量文件中的URL变量为https://www.xxx.com。通过这种命令行参数变量的引入形式仍然可以实现动态修改URL值。

通过参数变量--variable key:value形式引入的变量值,为全局变量优先级最高。

2) 第二种方式:命令行参数

采用Pybot或Robot命令行的形式来运行Robot Framework接口测试用例时,引入参数变量替换,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Robot --variable URL:"https://test.xxx.com" /usr/local/rf_api || exit 0

此种方式也是最为常用的调用形式,适合与CI持续集成系统对接。

2. 语言层面支持多环境运行思路

以Python语言为例,从语言层面解决如何一套用例支持多环境运行,本质还是要在用例层对测试环境无感,需要把环境所用的数据抽象出来。

随便画了一张草图,大家凑合着看,图中所示,是一个典型的桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立地变化。

拿上述最开始的代码示例来讲:需要抽象出服务地址账号两个对象,用例逻辑层只允许使用这些抽象的对象,而不能直接访问具体的数据,例如改成如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def test_login(self):
    requests.post(entrypoint.URL+"/login", data={"username":data.account.username, "password":data.account.password})

而在Python中,可以利用property装饰器来实现简易的桥接模式(其它语言也有类似的设计模式或实现),代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from enum import Enum

class Environment(Enum):
    DEV = 0
    TEST = 1
    PRE = 2
    PROD= 3

class EntryPoint:
    _ENV_URL = {
        Environment.DEV: "https://dev.xxx.com",
        Environment.TEST: "https://test.xxx.com",
        Environment.PRE: "https://pre.xxx.com",
        Environment.PROD: "https://www.xxx.com"
    }

    @property
    def URL(self):
        return self._ENV_URL[env]

env = Environment.DEV   # 作为全局的环境变量

样例代码中,先通过继承Enum类实现了一个枚举类Environment,在枚举类中定义了各环境的常量,可以理解是为后续定义各环境具体的Key值。

接着定义了一个EntryPoint类,并且在该类中,定义了一个存储各环境的字典,KEY名为枚举类中定义的常量。通过在URL方法 ,增加@property装饰器,可以让URL方法变成只读属性,并且通过obj.URL即可调用。

如果需要切换环境去执行,只要更新全局变量env就可以实现。

如果你对Python中的,Enum枚举用法和@property装饰器,还不了解或者想更深入了解这些用法,具体可参考官方文档介绍。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# @property用法官方文档
https://docs.python.org/3/library/functions.html#property
# Enum用法官方文档
https://docs.python.org/zh-cn/3/library/enum.html

受篇幅限制,一套自动化测试用例,不同环境对应的测试数据不同,解决思路下回再介绍,完整的自动化测试设计规范及各类实战技巧,建议可以系统性地学习:《自动化测试实战宝典:Robot Framework + Python 从小工到专家》一书中的内容。

新书京东订购传送门:https://item.jd.com/12629017.html#

如果觉得文章对你有所帮助,动动手点赞一下以表支持,你的肯定是我创作最大的鼓励和支持。

热文推荐 

更多原创干货除了发表于腾讯云+社区,第一时间也会发布至公众号「测试开发技术」(mikezhou_talk),欢迎关注!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
技术分享 | 接口自动化测试,如何实现多套环境的自动化测试?
在敏捷迭代的项目中,通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时,则需要将服务器的域名进行配置。使用一套接口测试脚本,通过切换域名地址配置,实现多套环境的自动化测试。
Hogwarts_测试
2022/09/01
4890
详解接口测试(2)- HTTP接口用例设计与测试方法(拿B站练手)
在之前的文章《详解接口测试(1)-常见的网络通信协议》当中,我们介绍了接口的概念以及各种类型的接口用到的网络通信协议。鉴于HTTP网络协议使用最为广泛,本文将会基于HTTP协议的接口对其讲解如何进行接口测试,内容包含以下部分:
Bug挖掘机
2022/09/28
1.6K0
详解接口测试(2)- HTTP接口用例设计与测试方法(拿B站练手)
快速掌握接口测试利器Postman
Postman是谷歌开发的一款网页调试和接口测试工具,能够发送任何类型的http请求,支持GET/PUT/POST/DELETE等方法。Postman非常简单易用,可以直接填写URL,header,body等就可以发送一个请求,用来测试api接口非常方便。
吾非同
2020/10/23
9110
接口自动化测试用例如何设计
说到自动化测试,或者说接口自动化测试,多数人的第一反应是该用什么工具,比如:Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀,甚至出现“ 做平台的 > 写脚本的 > 用工具的 ”诸如此类的鄙视链,但却很少有人去关注接口测试用例的设计问题。
测试蔡坨坨
2022/12/21
8590
通过ChatGPT生成测试用例
设计测试用例时,我们需要确保覆盖所有功能需求、安全需求以及边界条件。以下是基于您提供的用户注册界面需求的一组测试用例:
顾翔
2024/11/25
1540
通过ChatGPT生成测试用例
浅谈pytest+HttpRunner如何展开接口测试
根据wiki中的定义,接口是一个共享的边界,计算机系统的多个独立组件通过它交换信息。这些信息的交换可以基于软件、硬件、外部设备、人和它们之间的组合。根据上述定义,可以面向软件、硬件、交互设备等展开接口测试。软件的接口测试是面向独立组件之间接口的一种测试,主要用于检测内外部系统及内部各子系统之间的交互点。测试的重点在于检查逻辑正确性、交互依赖性、数据正确性。
袋鼠云数栈
2021/12/07
1.4K0
浅谈pytest+HttpRunner如何展开接口测试
在培训机构也学不到的Robot Framework自动化测试企业级实战教程
大家好,我是洋子,今天给大家分享一下Robot Framework自动化测试框架的使用教程,Robot Framework是一个可扩展、关键字驱动的测试自动化框架,可用于做接口、UI自动化,并且可以使用 Python 或者Java 去编写测试用例依赖的lib库,是一款非常强大的测试框架
Bug挖掘机
2022/09/28
1.6K0
在培训机构也学不到的Robot Framework自动化测试企业级实战教程
关于接口测试——自动化框架的设计与实现
在大部分测试人员眼中只要沾上“框架”,就感觉非常神秘,非常遥远。大家之所以觉得复杂,是因为落地运用起来很复杂;每个公司,每个业务及产品线的业务流程都不一样,所以就导致了“自动化测试框架”去完成自动化测试的时候产生很多不稳定因素,这样就很难定位成一个固定的框架。其实不然,真正的自动化测试框架不是一个模式,而是一种思想和方法的集合,通俗的讲就是一个架构。
数澜科技
2019/10/16
1.9K0
关于接口测试——自动化框架的设计与实现
Pytest测试框架一键动态切换测试环境实现思路及方案
在上一篇文章《Pytest fixture及conftest详解》中,我们介绍了fixture的一些关键特性、用法、作用域、参数等,本篇文章将结合fixture及conftest实现一键动态切换自动化测试环境。在开始前,我们可以先思考几个问题:动态切换测试环境的目的是什么(能够解决什么问题)?该如何实现(实现方案)?具体步骤是什么(实现过程)?
大刚测试开发实战
2022/11/14
1.4K0
Pytest测试框架一键动态切换测试环境实现思路及方案
基于LangChain手工测试用例转接口自动化测试生成工具
接口自动化测试用例是一个老生常谈的问题,在未引入人工智能之前,也有非常多的生成方案,比如如下所示,通过har生成接口自动化测试用例:
霍格沃兹测试开发Muller老师
2024/08/16
1600
pytest + yaml 框架 -13.多环境配置切换
当我们在测试环境写好自动化的代码,领导说你把代码部署到联调环境再测一测,这时候去改用例里面的配置是很痛苦的。 所以我们在设计自动化用例的时候,就先要想到多环境的配置与切换。
上海-悠悠
2023/01/03
8250
怎么编写接口测试用例?
怎么编写接口测试用例?接口测试用例如何编写?看到许多这样的问题,大家都知道编写接口测试用例是接口测试的重要组成部分,它决定了测试的质量和可靠性。因此,程序员必须编写高质量的接口测试用例,以确保接口在生产环境中能够正常运行。
物立
2023/02/17
8170
API测试用例的编写
在API的自动化测试维度中,测试维度分为两个维度,一个是单独的对API的验证,客户端发送一个请求后,服务端得到客户端的请求并且响应回复给客户端;另外一个维度是基于业务场景的测试,基于业务场景的也就是说编编写的API的测试用例是基于产品的业务逻辑,关于这点在我出版的书《Python自动化测试实战》测试案例实战中都有丰富的代码案例,这里就不详细的再说明。抛开两个维度的思考点,作为测试团队的工作内容,首先要保障产品的业务逻辑是可以使用的,只要这样,产品才能够给客户带来价值,在基本的业务逻辑稳定的基础上,再一步需要思考的是整个系统的稳定性,抗压性和系统的承载负载的能力。那么在工程效率的角度上来思考,使用代码或者工具都不是核心,核心是如何使用这些工具或者代码来提升测试的效率,优化研发的流程,并持续的改进,从而达到过程中的改进。不管工具还是代码,对产品完整性的测试,都要考虑产品的业务逻辑,也就是产品的场景,而如何通过API的自动化测试方式来达到产品的业务场景的测试,在单元测试框架的视频里面我特别的说到了七个点,每个点都举了案例,其中最核心的一个点就是编写的每个测试用例都必须得有断言同时基于API的测试要基于产品的业务逻辑来进行,而单纯的测试API是没有多少意义的,比如一个登录的业务场景,登录接口好的就能够证明登录的业务场景是好的吗?很显然不能。
无涯WuYa
2019/10/13
9870
自动化测试用例规范
不管是市场需求还是测试效率而言,自动化测试都是作为测试工程师需要掌握的一门技术,并且在公司能够逐步的应用到常规的测试中,如回归测试。自动化测试的价值在于它能够有效的检测被测对象的质量并且能够给出有价值的结果信息,而且这个结果需要具备权威性,不需要太多人为的参与与干预。
无涯WuYa
2023/09/02
4500
自动化测试用例规范
httprunner 2.x学习4-测试用例分层
httprunner 2.x版本最大的改进就是分层机制了,1.x的版本是线性设计的,每个用例都是独立的。 一个用例里面涉及到流程性的,我们测试修改个人信息是否修改成功,在yaml文件里面需写3个步骤:登录-修改个人信息-查询个人信息。 这样3个测试步骤,每个测试步骤写的test下。但是下个测试用例,重新写个yaml文件也需要遇到登录的话,这样登录的步骤就会重复去写,所以维护起来不方便。 httprunner 2.x版本开始引入分层机制,可以定义公共的方法,在用例里面直接引入步骤,这样登录方法我们只需写一次
上海-悠悠
2020/06/17
8410
软件测试|Yaml实现测试数据驱动
理念与同“UI自动化测试框架”中的“测试步骤的数据驱动”相同,接口中的测试步骤的数据驱动就是将接口的参数(比如 method、url、param等)封装到 yaml 文件中管理。当测试步骤发生改变,只需要修改 yaml 文件中的配置即可。
霍格沃兹测试开发Muller老师
2023/01/04
7980
如何评估测试用例有效性
每一个测试人都经历过测试用例评审,但是如何评估测试用例的有效性呢? 是不是我按照黑盒测试用例的设计原则来设计,这个测试用例就是一个有效的测试用例呢?(黑盒测试用例设计方法有:等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法)。
iTesting
2020/12/15
2.7K0
如何评估测试用例有效性
自动化测试实战技巧:「用例失败重试机制」实现方案分享
在开展自动化测试工作时,经常会由于一些外在原因(如网络中断、返回超时)导致自动化测试用例运行失败,而这些失败并不是用例本身验证或被测程序存在Bug而引起的,更可气的是这些失败场景有可能还是偶发的,为了保证测试用例运行的稳定性和验证有效性,我们需要一种针对失败用例重试的运行机制。
测试开发技术
2020/06/23
1.3K0
自动化测试实战技巧:「用例失败重试机制」实现方案分享
快速打造属于你的接口自动化测试框架
接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大,且维护成本相对来说较低,是我们进行自动化测试的首选
测试开发社区
2020/09/27
6940
快速打造属于你的接口自动化测试框架
【Node】接口测试用例
另外我们平常调试接口都是使用postman之类的,接口调试用例无法沉淀,自己构造自己用,别人无法共用,所以接口用例的持久化也很有必要。
神仙朱
2022/05/25
1.1K0
【Node】接口测试用例
推荐阅读
相关推荐
技术分享 | 接口自动化测试,如何实现多套环境的自动化测试?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文