如何实现基于场景的接口自动化测试用例?来看看大佬的方案

news2024/11/20 18:33:30

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

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

1.不变的内容全部通过配置化来实现,比如:脚本执行的环境、请求的 HOST、URL 路径、测试数据等;

2.环境和数据关联变更:依据不同的环境,选择不同的配置及对应的测试数据;

3.抽取公共方法,避免冗余代码

4.场景化的用例,实现可配置化;

5.数据驱动。

1.问题

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

那什么是场景用例?

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

比如:

def test_01(self):
    # step 01
    result1 = PackDemo().getTest()
    assert result1 == 4

    # step02
    result2 = PackDemo2().getTest2("name")
    assert result2 == 'name'
    
    # step03
    result3 = DemoApi().getTest()
    assert result3 == 2

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

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

怎么做呢?咱们看看一些核心的实现。

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_class

def execMethod(self, method, *args):
    """
    加载对应类下的方法 
    :param instance: 对应的实例
    :param method: 要执行的方法
    :return:
    """
    result = getattr(self.__getClassInstance(), method)(*args)
    return result

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

2.4 场景分析类

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

 #ScenariosAnalyze.py
 def analyse_exe_scenario(self, case_data):
        step_result = {}
        summary = True
        for 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 = False
            step_result[i] = step_compare_result
        step_result['summary'] = summary
        return step_result

2.5 用例实现

 @File : test_scenario.py

class TestScenario:

    @allure.story('场景用例01')
    @allure.severity(allure.severity_level.BLOCKER)
    @pytest.mark.smoke
    def test_01(self):
        result = None
        case_data = self.test_data_json['test_01']
        result = self.scenario_analyze.analyse_exe_scenario(case_data)
        assert result['summary'] is True

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

3.小结

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

它的优点是:

1.配置化: 一切固定不变的内容全部配置化,最终达到:一个环境配置文件,一套脚本,几套测试数据,依据环境的不同选择不同的测试数据执行对应的测试脚本;

2.门槛低:因为配置化,测试同学只要把测试数据文件中的关键节点配置好,然后在脚本中写下调用方法,就完成用例编写了;

3.好扩展:在后续的实现中,可以将这些配置全部页面化,包括环境、数据、脚本,达到无代码开发的目的;

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

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以加入我们的QQ群:746506216,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。


资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言七天入门教程七:项目实战

R语言七天入门教程七:项目实战 在完成之前R语言基础知识的学习后,今天的内容是项目实战,通过完成一些小项目来巩固知识。 一、矩阵运算计算器(变量与运算符练习) 1、问题描述 给定矩阵A和B,计算矩阵相加…

MySql常用内置函数详解

目录日期函数--了解***字符串函数--重要数学函数--了解其他函数--了解MySql为我们提供了一些内主函数,方便我们对特定数据进行相关操作! 注意:都是配合select使用哦,个人理解SQL的select相当于C中的printf; 日期函数–了解 一般用于insert in…

C++ 主函数几种语法

Cmain函数的两种写法 1&#xff0c;返回值为int&#xff0c;且main不带参数 #include<iostream> using namespace std; int main() { cout << "Hello C \n" << endl; system("pause"); return 1;//函数返回值取值范围0到255&#xf…

深入了解 JavaScript 语法错误以及如何防止它们

最近&#xff0c;在 Leader 的建议下&#xff0c;去看了看 emotion 和 storybook 的相关文档。学习过后&#xff0c;小有收获。因此&#xff0c;这次将以我自己的视角带你们体验一下 storybook&#xff0c;也算是对我自己学习过程中的一个 review。 何为 storybook 什么是 st…

第2关:伪分布式体验及分布式安装配置

服务器leader选举 为进一步了解ZooKeeper的leader选举过程&#xff0c;本节实训利用服务器的关闭启动&#xff0c;观察服务器的leader产生过程。利用以下命令查看当前服务器节点的状态(/xxx为安装目录)&#xff1a; ./xxx/bin/zkServer.sh status 当仅启动1个服务器节点&…

进博会期间,多地政府领导密集考察深兰科技

从11月初开始&#xff0c;借第五届中国国际进口博览会在上海举办的契机&#xff0c;来自全国各地的地级、县级市的各级领导纷纷来到上海&#xff0c;深入到各个行业领域的国企、央企、民企和跨国企业中走访调研&#xff0c;寻求技术合作&#xff0c;洽谈招商引资。 期间仅1日至…

流体力学基础——简介

流体定义&#xff1a;无规则的运动&#xff0c;流体&#xff1b;流体在静止时内部不能产生剪切力&#xff0c;流动产生的剪切力叫做粘力流体特点&#xff1a; 1、力与变形的关系不同&#xff1b;固体&#xff0c;应力正比于应变&#xff0c;静力学为主&#xff1b;流体&#xf…

DeepLearn关于数组和数的操作

本篇文章纯属作为自己的笔记&#xff0c;因为每次写程序都忘记下面的内容&#xff0c;找起来又很浪费时间&#xff0c;所有就索性一次性都整理下来&#xff0c;后续又不新的不会的内弄也会及时更新到文章当中&#xff0c;方便以后查阅。 DeepLearn关于数组和数的操作Python标准…

【详解】BIO、AIO、NIO Netty 知识点和工作原理

Netty框架 基础 三大网络编程 BIO 同步阻塞:服务器实现模式一个连接一个线程,既客户端有连接请求时,服务器就需要启动一个线程进行处理,如果这个连接不任何事情会造成不必要的线程线程开销 适用场景&#xff1a; 连接数目比较小且固定的架构&#xff0c;这种方式对服务器资源…

Android企业微信分享到小程序

1.官方文档Android应用 - 接口文档 - 企业微信开发者中心https://developer.work.weixin.qq.com/document/path/91196 2.创建应用 登录企业微信管理后台&#xff0c;选择企业应用&#xff0c;选择“企业微信授权登录”&#xff0c;在设置界面填写Android的 App的签名&包名…

[附源码]java毕业设计基于技术的新电商助农平台

项目运行 环境配置&#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…

HTTP 消息头

title: HTTP 消息头 date: 2022-11-16 14:36 tags: [HTTP,X-Real-IP,Host,X-Forwarded-For,Nginx] 文章目录〇、问题一、前言二、什么是消息头&#xff1f;三、Host四、X-Real-IP五、X-Forwarded-For参考更新〇、问题 什么是HTTP Headers&#xff1f;作用是什么&#xff1f; …

qemu-system-aarch64使用记录

qemu-system-aarch64 使用记录下载安装qemu查看是否支持KVM运行qemu-M内核启动问题内核编译下载安装qemu #!/bin/bashsudo apt update > /dev/null sudo apt upgrade > /dev/null sudo apt-get install -y make gcc g git > /dev/nullcd sudo apt-get install -y r…

一起来庆祝属于GISer的节日GIS DAY

概述 作为一名GISer的你&#xff0c;有没有想过其实我们GISer也有自己的节日&#xff1f;这个节日便是GIS DAY&#xff0c;今年的GIS DAY恰在今天&#xff08;2022年11月16日&#xff09;。究竟什么是GIS DAY&#xff1f;这里为大家介绍一下这个节日。 什么是GIS DAY GIS DA…

Python学习----异常、模块、安装第三方包

异常 异常的含义就不用解释了 打开一个不存在的文件&#xff1a; 异常的捕获 语法&#xff1a; 捕获所有异常 try:可能发生错误的代码 except:发生错误之后执行的代码try:可能发生错误的代码 except Exception as e:发生错误之后执行的代码两种写法都行 捕获指定异常&…

【maptplotlib大全图】一段代码洞查matplotlib图片真谛

此文通过给大家设计一个全面的代码&#xff0c;帮助大家了解matplotlib库画图的全貌 代码解读&#xff0c;略。 图示解读&#xff1a; 对照上图序号和下面序号看代码解释&#xff1a; 1.应用风格使用代码&#xff1a;plt.style.use(sty) 2.文本注释 plt.annotate(‘maximum…

QSS(Qt样式表)概念

Qt样式表是一个可以自定义部件外观的十分强大的机制&#xff0c;除了QStyle更改的样式&#xff0c;其他的都可以由QSS修改。由于受到Html的CSS启发&#xff0c;所以叫QSS。 代码添加样式表ui界面上添加样式表代码添加样式表&#xff1a; setStyleSheet&#xff08;&#xff09…

Beacon帧

一、简介 Beacon帧是802.11中一个周期性的帧&#xff0c;每隔一段时间就会向外界发出一个Beacon(信标)信号用来宣布自己802.11网络的存在。Beacon周期调高&#xff0c;对应睡眠周期拉长&#xff0c;故节能&#xff08;即越来休息100ms再起来发一个包&#xff0c;现在休息200ms…

python学习思路

话不多说&#xff0c;就是开始练习&#xff0c;因为之前编程的经验比较少&#xff0c;怎么办&#xff0c;就像马化腾一样&#xff0c;先抄袭&#xff0c;只有抄袭完成了之后&#xff0c;你才会获得你自己的知识 总体思路是先抄袭&#xff0c;再领悟。最后一定要自己默写打一次。…

电子统计台账:垂直流水账格式数据的导入

目录 1 前言 2 新建项目并打开数据源文件 3 模板设置 4 垂直过滤模板中&#xff0c;流水账过滤条件详细格式说明 1 前言 不少企业记录生产销售数据采用流水账格式。我们可以通过设置过滤模板来导入流水账格式的数据。 企业数据源文件&#xff0c;用excel打开后可以看到格式…