随着自研的测试平台在企业内部的深入应用,这个过程中既遭遇了测试平台建设过程中普遍存在的共性挑战,也面临了不同企业环境下独特的实施难题。
回顾过去四年的平台建设历程,不断优化平台应用架构和技术架构,以适应不断变化的需求。在此,特撰此系列文章,对平台的发展历程、优化策略进行全面复盘分析,也希望能够给大家在自己的测试平台化建设过程中提供一些参考。
该系列分享,初步规划了十个章节,包含原子性设计、分层设计、参数化设计、数据驱动模式设计、测试环境设计、执行模式设计、执行结果设计等。
接口自动化中参数化设计是一个重要环节,参数化可以实现测试脚本与测试数据的分离,使测试脚本更加灵活和可复用。从而简化测试过程、提高测试效率。
同时它也可以实现使用不同的数据集合来执行相同的测试脚本,从而覆盖更多的测试场景,提高测试的覆盖率。
3.1 参数化的目的
- 解耦数据与代码,降低维护成本:将测试数据和测试脚本分离,使得测试脚本更加便于维护。当测试数据发生变化时,只需要修改参数化数据集合,而不需要修改测试脚本本身。
- 数据驱动,提高测试效率与覆盖:使用不同的数据集合进行测试,可以快速验证接口在不同条件下的表现,提高测试覆盖率。
3.2 参数化的实现方式
参数化的本质是将测试代码中的测试数据(或配置)部分提取为变量。如下:
如下,例如在测试脚本中存在以下代码,其中该API的路径参数为29。
url = "/attribute/update_attribute_info/29"
将路径参数这个测试数据提取为变量 attribute_id,类型为字符串, attribute_id 变量指向的测试数据可以是29或其他ID。
url = f"/attribute/update_attribute_info/{attribute_id}"
也可以将路径参数这个测试数据提取为变量 attribute_id_list,类型为列表, 此时可以通过attribute_id_list中的每一个ID 驱动代码多次执行。如下
for id in attribute_id_list:
url = f"/attribute/update_attribute_info/{id}"
需要注意的是,数据驱动的本质不是重复执行,而是遍历数组多次执行。
变量的指向的测试数据可以是以下形式:
从外部文件/数据库加载
- 从文件中加载:测试数据可以存储在Excel、Csv、Json等文件格式中,可以通过Python第三方库,加载并处理这些测试数据,比如排列组合或正交组合等等。
- 从数据库中加载:对于大型系统或需要频繁更新测试数据的场景,可以将测试数据存储在数据库中,测试程序通过直接连接到数据库来获取数据。
从环境变量中加载
- 从环境中加载:对于经常发生变化的环境变量值(如主机名、端口号、用户名密码等),可以在测试前通过获取当前环境变量的方式进行传递。如
ENV_DEPLOYMENT_HOST = os.getenv('RUNTIME_HOST_IP', default="172.16.49.11")
从动态的随机函数的返回值中加载
- 从动态执行的函数返回值中加载:在某些测试场景中,对测试数据的时效性、随机性有一定要求,例如创建时间、或不唯一的随机字符串等,可以使用随机函数来生成并返回这些数据作为测试数据。
def get_random_time(format_time="%Y-%m-%d %H:%M:%S"):
"""
Args:
format_time:
Returns:
"""
format_time = datetime.datetime.strftime(fk.date_time(), format_time)
return format_time
从上文动态执行脚本的返回值中加载
- 从上文动态执行脚本的返回值中加载:对于场景化接口测试用例中,通过接口调用链路模拟用户使用场景,在调用链路的上下文中,通常存在下游接口的入参由上游接口的出参组成的情况。
3.3 测试平台中的具体设计
在该系列的分享中,测试用例原子性设计、分层设计中提到过关于变量提取、变量定义、数据驱动的相关设计,这里在进行简要回顾。
变量提取(数据指向某个变量)
将请求体、请求头、响应体中的测试数据指向到某个变量或动态函数。
如下:在请求头中将 Authorization 参数对应的值指向到了变量 access_token,为了方便后端解析变量,增加了$ 标识符作为前缀。
如下,在请求体Body中,将attribute_name 参数的值指向到了 动态的随机函数的返回值,random_string(min_chars=5 , max_chars=10),为了方便后端解析动态函数,增加了${} 标识符。同时也将 attribute_importance 参数指向到了a_test 变量。
也可以对响应体进行参数化。如下,在期望结果的响应体中,将响应体Json Path路径为 data.attribute_name 的值指向到了变量 attribute_name,同样为了方便后端解析变量,增加了$ 标识符作为前缀。
变量定义
定义静态变量,如通过从文件、数据库中定义的变量,如下定义了 access_token、a_test变量的值。
定义动态变量,如从上文执行结果的返回值中定义的变量,如下定义了 var_status_code 变量。
数据驱动
如下,在Excel中定义了name、age 变量,并分别传递了三组值执行相同的测试脚本,从而覆盖更多的测试场景,提高测试的覆盖率。
如下,在上传文件后,可同时设置数据的类型。
3.4 其他建议
- 测试数据之间保持独立性,应避免一个测试用例的失败影响其他测试用例的执行。同时,保持测试数据的可维护性,方便测试人员添加、修改或删除测试数据。
- 通过数据驱动实现参数化价值的最大化:通过参数化实现数据驱动测试,使测试脚本能够根据不同的测试数据执行不同的测试场景,提高测试用例的灵活性和可复用性。
若您对该系列文章感兴趣,欢迎 关注、点赞、收藏哦。
本文暂时没有评论,来添加一个吧(●'◡'●)