【测试沉思录】23. 如何实现基于场景的接口自动化测试用例?

news/2024/5/2 11:04:38/文章来源:https://blog.csdn.net/wirelessqa/article/details/128201578

作者:陈爱娇 编辑:毕小烦

自动化本身是为了提高工作效率,不论选择何种框架,何种开发语言,我们最终想实现的效果,就是让大家用最少的代码,最小的投入,完成自动化测试的工作。

基于这个想法,我们的接口自动化测试思路如下:

  1. 不变的内容全部通过配置化来实现,比如:脚本执行的环境、请求的 HOST、URL 路径、测试数据等;
  2. 环境和数据关联变更:依据不同的环境,选择不同的配置及对应的测试数据;
  3. 抽取公共方法,避免冗余代码;
  4. 场景化的用例,实现可配置化;
  5. 数据驱动;

一. 问题

在做自动化的过程中,不能只考虑单接口的脚本,也要考虑场景化的用例。 场景化的用例不需要每个步骤都去校验所有的数据,可能更多看重串联后的最终效果

那什么是场景用例?

其实就是多个接口组成的业务场景,常规写代码的做法是,先调用接口 1,验证结果, 再调用接口 2,再继续接口 3,… 等等; 在测试场景中,可能只是各个接口的入参不一样,或者是调用的接口不一样。这样代码写起来就会冗余。

比如:

def test_01(self):# step 01result1 = PackDemo().getTest()assert result1 == 4# step02result2 = PackDemo2().getTest2("name")assert result2 == 'name'# step03result3 = DemoApi().getTest()assert result3 == 2

这样的用例,对于简单的接口没什么问题,但是对于复杂的接口,校验逻辑比较多,或者入参比较多,实现的方式就过于单一了。且不同场景的话,每个都要更改调用的步骤和返回值,场景越多冗余越多。

如果使用配置化的方式,每次从配置文件中动态加载配置的场景用例, 而且能够做到加载后做对应的断言,那该多好。

怎么做呢?

咱们看看一些核心的实现。

二. 方案

2.1 项目结构

项目结构如下:

img

采用当前比较流行的 Python + Pytest + Allure 来实现,具体结构不做展开。

2.2 场景用例的配置数据

# test_scenario.json
{"test_01": {"step_1": {  ---- 步骤节点名称,可自定义"packagePath": "api", --- 这个步骤要运行的方法所属类的包路径"class": "DemoApi", --- 这个步骤要运行的方法所属类名称"method": "getTest", --- 这个步骤要运行的方法名称"request": null,  ---这个步骤运行的方法入参"response": 2, ---这个步骤运行的结果,可以是一个值,或者对象"verify": { --- 数据校验的节点"type": 1, ---数据校验的类型"keys": null  ---如果是校验的特定字段,这里需要输入部分校验的字段}},"step_2": {"packagePath": "api.demo","class": "PackDemo","method": "getTest2","request": "request -> name","response": 6,"verify": {"type": 1,"keys": null}},"step_3": {"packagePath": "api.demo","class": "PackDemo2","method": "getTest3","request": {"name": "param-name","num_list": ["a", "b", "c"]},"response": 8,"verify": {"type": 1,"keys": null}}}
}

2.3 动态加载类

在我们配置了以上的测试场景的数据后,我们希望在用例执行的过程中,通过获取我们的配置,能够动态的加载数据文件中提到的方法,并执行对应的方法,那这个过程的实现我们主要通过如下的动态加载类来实现。

# DynamicLoad.py 
# 部分主要的摘录如下def __load_module(self):"""加载对应路径下的模块:param package_path: 包路径:param class_name: 类名称:return:"""return importlib.import_module("." + self.class_name, package=self.package_path)def __getClassInstance(self):"""加载对应的模块下的类,并返回对应类的实例 :param module_name: 对应的模块:param class_name::return:"""self.my_module = self.__load_module()self.my_class = getattr(self.my_module, self.class_name)()return self.my_classdef execMethod(self, method, *args):"""加载对应类下的方法 :param instance: 对应的实例:param method: 要执行的方法:return:"""result = getattr(self.__getClassInstance(), method)(*args)return result

有了以上动态加载的方法后,在执行场景用例时,依据上述的方法,就可以执行测试文件中提到的方法。

2.4 场景分析类

在场景用例的测试数据中,除了需要解析需要执行的类、方法外,还要解析文件中涉及到的出入参及数据比对方式,因此,这里还需要一个场景分析类,来解析数据文件中关于具体执行过程的配置。

 #ScenariosAnalyze.pydef analyse_exe_scenario(self, case_data):step_result = {}summary = Truefor i in case_data:instance = DynamicLoad(case_data[i]['packagePath'], case_data[i]['class'])if case_data[i]['request'] is not None:result = instance.execMethod(case_data[i]['method'], case_data[i]['request'])else:result = instance.execMethod(case_data[i]['method'])if case_data[i]['verify'] is not None:compare_type = case_data[i]['verify']['type']keys = case_data[i]['verify']['keys']step_compare_result = DataCompare().compare_type(compare_type=compare_type, actual=result,expect=case_data[i]['response'], keys=keys)if not step_compare_result:summary = Falsestep_result[i] = step_compare_resultstep_result['summary'] = summaryreturn step_result

2.5 用例实现

# @File : test_scenario.pyclass TestScenario:@allure.story('场景用例01')@allure.severity(allure.severity_level.BLOCKER)@pytest.mark.smokedef test_01(self):result = Nonecase_data = self.test_data_json['test_01']result = self.scenario_analyze.analyse_exe_scenario(case_data)assert result['summary'] is True

通过上述简单的脚本调用,就可以完成一个场景用例的测试了。

三. 小结

以上就是场景用例配置化的实现思路。

它的优点是:

  1. 配置化: 一切固定不变的内容全部配置化,最终达到:一个环境配置文件,一套脚本,几套测试数据,依据环境的不同选择不同的测试数据执行对应的测试脚本;
  2. 门槛低: 因为配置化,测试同学只要把测试数据文件中的关键节点配置好,然后在脚本中写下调用方法,就完成用例编写了;
  3. 好扩展: 在后续的实现中,可以将这些配置全部页面化,包括环境、数据、脚本,达到无代码开发的目的;

缺点当然是不够灵活,所以没有完美的方案,只有合适的,以上,仅供大家参考。

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_231281.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K-Means++代码实现

K-Means代码实现 数据集 https://download.csdn.net/download/qq_43629083/87246495 import pandas as pd import numpy as np import random import math %matplotlib inline from matplotlib import pyplot as plt# 按文件名读取整个文件 data pd.read_csv(data.csv)class…

学编程:Python入门考级必备[11]

目录 1.查找字符串 2.字符串的格式化 3.字符串的转义字符 \ \" 4. 修改字符串 5.字符串连接与分割 附件代码: 炼 知识模块(11) 名符其实--字符串 1.查找字符串 # 1.1用 in 函数 a aa in acacacacaabaac print(a) # 1.2 用index 找不到就报错 b h…

民办二本程序员阿里、百度、平安等五厂面经,5 份 offer(含真题)

昨天小休,一位高中同学联系了我,说是要请我吃饭,有这种好事,我当然是毫不犹豫的答应了啦! 等等...会不会是找我借钱的? 好慌,怎么办?已经答应过去了。 在后面的交谈中,…

Odoo丨如何在明细行中添加复选框?

最近,在项目实际业务中遇到需要对明细订单添加复选框和按钮进行操作的需求。 起初在拿到需求时,我联想到Odoo默认tree视图是有复选框和操作按钮的功能,于是查看了源码,确认了这个想法。 因为这个是属于字段中one2many 关系属性来…

三车道交通流元胞自动机研究(matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

中国电信移动物联网发展成果与创新实践 ,干货满满

近日,首届移动物联网大会(2022)(以下简称“大会”)在江苏省无锡市举办。本次大会由工信部指导,中国信息通信研究院(以下简称“中国信通院”)、中国通信学会、无锡市人民政府、人民邮…

大数据学习:进程管理

文章目录一、进程ID(PID)二、查看进程1、进程查看命令-ps(1)命令作用(2)参数说明(3)操作案例2、Linux进程状态3、观察进程变化命令 -top(1)参数选项&#xff…

超声功率放大器在MEMS超声测试中的应用

MEMS(微机电系统)技术的不断发展,目前已经广泛应用在生物、航空、医学、航天等多领域。MEMS传感器即微机电系统(Micro-electroMechanicalSystems),是指精密机械系统和微电子电路技术结合发展出来的一项工程…

【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十八章 以太…

【C++11多线程】线程同步之线程互斥:mutex、lock_guard

文章目录1.mutex2.锁双重判断3.lock_guard4.unique_lockunique_lock的构造函数1.mutex 头文件 #include <mutex> mutex 是一个类&#xff0c;其源码如下图所示。 互斥锁其实就是一个类对象&#xff0c;多个线程尝试用成员函数 lock() 来加锁&#xff0c;只有一个线程能…

自定义HandlerMethodArgumentResolver如何注册到springmvc框架里的

目录 1.DEBUG 注册代码 1.1 WebMvcConfigurerComposite 1.2 DelegatingWebMvcConfiguration 1.3 AutowiredAnnotationBeanPostProcessor 2.DEBUG调用代码 2.1 this.argumentResolvers 日常工作开发中&#xff0c;总有一些参数&#xff0c;在未传参数时&#xff0c;需要自定…

Web3中文|马斯克也疯狂?网红AI “ChatGPT”有多火?

一个名为“ChatGPT”的网红AI竟写出了毁灭人类的计划书。 计划书的步骤详细到入侵各国计算机系统、控制武器、破坏通讯、交通系统等等。和电影里的情节一模一样&#xff0c;甚至ChatGPT还给出了相应的Python代码。 诱导ChatGPT写下该计划的是一位名为扎克德纳姆&#xff08;Z…

计算机网络-网络层:IP协议

目录 一、IP协议格式 二、IP地址管理 1.动态地址分配&组建私网 1.1 动态地址分配DHCP 1.2 NAT技术组建私网 2. 早期网络划分方式 3. 当前网络划分方式CIDR方案 4. 特殊IP地址 5. 公网与私网&#xff08;外网与内网&#xff09; 6. 路由选择 网络层&#xff1a;负…

【win11内存占用高优化】未运行程序,系统内存占用50以上

这里写自定义目录标题前言打开控制面板找到电源键功能找到快速启动选项&#xff0c;取消勾选&#xff0c;确定win X以管理员身份打开powershell输入如下命令&#xff0c;回车关闭终端完成前言 windows11在未运行任何其他程序的情况下&#xff0c;内存占用超50%&#xff0c;可…

深入浅出java nio

Buffer 缓冲 为什么需要缓冲&#xff1f; 思考&#xff1a;没有buffer之前的读写。 子类 常见类型的缓冲 ByteBuffer public abstract class ByteBufferextends Bufferimplements Comparable<ByteBuffer> {}ByteBuffer是抽象类无法直接实例化&#xff0c;可以通过all…

研究 | CT图像迭代重建算法研究进展

上次讲到我实现了一下代数迭代重建&#xff08;ART&#xff09;&#xff0c;到周六开会的时候才大概了解了我的研究方向应该是统计迭代重建&#xff0c;一下子就把我给搞懵了。按照书上的说法&#xff0c;统计迭代法是在发射型CT&#xff08;SPECT和PET&#xff09;中应用广泛&…

[附源码]计算机毕业设计勤工俭学管理小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Docker学习4-常用命令之重要的容器命令

本文是Docker学习系列教程中的第四篇。本文是Docker常用命令中的重要命令。为什么说重要呢&#xff1f;因为这些命令&#xff0c;在以后开发过程中&#xff0c;会经常使用到。比如&#xff1a;怎么查看容器中运行的日志&#xff1f;怎么查看容器运行的进程&#xff1f;怎么导出…

【安全测试】渗透测试神器BurpSuite环境搭建

工欲善其事&#xff0c;必先利其器&#xff0c;要想更好的进行安全测试&#xff0c;就需要有一个趁手的工具&#xff0c;BurpSuite就是一个不错的选择&#xff0c;是广大安全测试工程师的必备工具&#xff0c;今天就带着大家把这个工具给装上&#xff0c;开启大家的安全测试之旅…

引擎入门 | Unity UI简介–第2部分(5)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 9.设置动画对话框 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第五篇。 9.设置动画对…