web自动化测试平台开发之核心执行器

在这里插入图片描述


web自动化测试平台开发之核心执行器

  • 一、如何从自动化框架到核心执行器
  • 二、核心执行器框架逻辑梳理
  • 三、核心执行器利用命令驱动执行

一、如何从自动化框架到核心执行器

脚本:底层用了三个内容:python+pytest+selenium,线性脚本,只是单纯的把功能测试用例转化成代码的过程。——》脚本
缺点:

  • 企业成本高:落地难
  • 测试难度高:维护脚本
  • 时间成本高:WEB不好做,成本高、落地难

目标:维护成本不要太高

解决方案:python+pytest+selenium 组合,进行二次开发。

再次降低测试人员的基础 ——》 写web自动化测试case
数据驱动(DDT): 逻辑代码 和 数据进行分离,测试人员只需要写数据。Yaml、Excel -——》写完之后传入框架中

核心执行器:

# 这是一个 同一个 测试用例执行器
# 读取到所有的 用例配置信息, 一个个执行

# 1. 读取所有指定文件夹下面的 yaml文件内容
import os

import allure
import pytest
import yaml

all_case = []
for file in os.listdir("./yaml_cases"):  # 读取所有文件
    with open(f"./yaml_cases/{file}", "r", encoding="utf-8") as rfile:
        data = yaml.safe_load(rfile)  # 加载yaml内容
        all_case.append({
            "用例名称": file.split(".")[0],
            "用例步骤": data
        })

print("所有测试用例信息:", all_case)


@pytest.mark.parametrize("test_case", all_case)  # pytest 参数化 数据驱动
def test_ui_case(keywords, test_case):  # 一个函数执行所有的测试用例,不用每一个用例都写代码
    allure.dynamic.title(test_case['用例名称'])  # 测试报告里面 展示用例名称

    for step_name, step_args in test_case['用例步骤'].items():
        with allure.step(step_name):  # allure 记录每一个操作步骤
            key_function = keywords.__getattribute__(step_args["关键字"])  # 根据配置找到关键字方法
            key_function(**step_args)  # 调用关键字
            keywords.截图()

通过main.py文件找到测试用例,读取数据源,进行数据驱动,再进行反射到对应的关键字方法,并将数据传递过去,这就是数据驱动。

准备工作:
1.读取数据
2.进行参数化
3.结合关键字反射到对应的方法
4.调用对应的方法传不定长参数

二、核心执行器框架逻辑梳理

操作步骤:
1、创建虚拟环境
2、安装依赖包:pip install -r requirements.txt

  • 注意:pyyaml-include==1.3.1

3、运行入口:webrun——》cil.py
4、examples

  • 存放测试用例的文件夹
  • 编号_XXXXXX.yaml——测试用例文件——用例标题、前置用例、后置用例

程序入口文件:cli.py
其中:"-s", "-v", "--capture=sys", 是自带参数
--capture=sys在报告中也能展示
"--clean-alluredir", 自带参数
"--alluredir=allure-results", 自带参数
"--type=yaml", 指定运行的文件类型
"--cases=C:\\Users\Lenovo\Desktop\huace\huace_web_platform\class1\web-engine\examples", 指定测试用例的执行目录
"--keyDir=C:\\Users\Lenovo\Desktop\huace\huace_web_platform\class1\web-engine\webrun\extend\script":拓展功能

执行入口文件:

import os
import sys
import pytest

from webrun.core.CasesPlugin import CasesPlugin


def run():
    # 获取 python运行参数
    # 1. 读取命令行传入的参数
    pytest_cmd_config = []
    for arg in sys.argv:
        if arg.startswith("-"):
            pytest_cmd_config.append(arg)

    print(os.path.join(os.path.dirname(__file__), "core/WebTestRunner.py"))
    # 2. 构建pytest参数
    pytest_args = [os.path.join(os.path.dirname(__file__), "core/WebTestRunner.py")]
    pytest_args.extend(pytest_cmd_config)

    print("run pytest:", pytest_args)

    pytest.main(pytest_args, plugins=[CasesPlugin()])


if __name__ == '__main__':
    # 测试执行入口
    print(os.path.join(os.path.dirname(__file__), 'core', "WebTestRunner.py"))
    pytest_args = ["-s", "-v", "--capture=sys",  # todo 自带参数  --capture=sys在报告中也能展示
                   os.path.join(os.path.dirname(__file__), 'core', "WebTestRunner.py"),  # todo 指定运行的文件
                   "--clean-alluredir",  # todo 自带参数
                   "--alluredir=allure-results",  # todo 自带参数
                   # todo 自定义参数
                   "--type=yaml",  # todo 指定运行的文件类型
                   # "--cases=C:\\Users\Lenovo\Desktop\huace\web自动化平台\webUI自动化技术之测试开发演讲\web-engine\examples",  #todo 指定测试用例的执行目录
                   "--cases=C:\\Users\Lenovo\Desktop\huace\huace_web_platform\class1\web-engine\examples",    # todo 指定测试用例的执行目录
                   "--keyDir=C:\\Users\Lenovo\Desktop\huace\huace_web_platform\class1\web-engine\webrun\extend\script"
                   ]
    print("run pytest:", pytest_args)
    # todo pytest_args插件扩展
    pytest.main(pytest_args, plugins=[CasesPlugin()])  #todo 插件拓展

    # 集成 allure 示例
    os.system(r"allure generate -c -o report")  # 等于你在命令行里面执行 allure


在这里插入图片描述

pytest_args是一个pytest(Python的测试框架)中的选项,用于在运行pytest命令时传递额外的命令行参数给测试运行器。它可以接受一个字符串列表,允许用户自定义pytest的配置,例如指定测试套件、过滤特定测试模块、设置环境变量等。

pytest.main(pytest_args, plugins=[CasesPlugin()])

  • 在pytest中,pytest.main() 函数是一个直接与pytest库交互的方式,允许你启动整个测试运行过程。当你传入pytest_args参数时,它会接收到你指定的命令行参数列表,这可以用于控制测试运行的行为,比如选择特定的测试套件、启用插件等。
  • plugins=[CasesPlugin()]这一部分则是指定了一个或多个插件,这里是CasesPlugin(),这是一个自定义插件,可能是你项目中定义的一个处理测试案例特殊需求的插件。在调用pytest.main()时,将这个插件加入,意味着其功能将在测试过程中被加载和应用。

CasesPlugin.py插件文件

  • pytest_addoption():增加pytest运行的配置项
  • pytest_generate_tests:是Pytest框架中用来动态生成测试用例参数的钩子函数。通过它,我们可以在运行时动态地生成测试参数,从而避免手动编写重复的测试用例。https://blog.csdn.net/NHB456789/article/details/139247217
  • pytest_collection_modifyitems:用例收集完毕之后被调用,可以用来调整测试用例执行顺序
import pytest

from webrun.parse.CaseParser import case_parser
from webrun.core.globalContext import g_context

class CasesPlugin:
    """
    todo pytest插件 - 用于pytest运行时的用例配置信息加载
     应用了 pytest 钩子函数 (方法名不能改动)
    """

    def pytest_addoption(self, parser):

        """
        todo 增加pytest运行的配置项
        """
        parser.addoption(
            "--type", action="store", default="yaml", help="测试用例类型"
        )
        parser.addoption(
            "--cases", action="store", default="../examples", help="测试用例目录"
        )
        # 添加一个指定的关键字目录
        parser.addoption(
            "--keyDir",action="store", default="F:\\key_py",help="拓展关键字目录"
        )

    def pytest_generate_tests(self, metafunc):
        """
        todo method_meta: 运行的方法信息 :测试用例执行之前执行(对测试数据进行处理)
        """

        # 读取用户传过来的参数
        case_type = metafunc.config.getoption("type")
        cases_dir = metafunc.config.getoption("cases")
        key_dir = metafunc.config.getoption("keyDir")

        # 把这个key_dir 放入到公共变量去
        g_context().set_dict("key_dir",key_dir)

        # todo 重点:读取测试用例,同时需要进行参数化
        data = case_parser(case_type, cases_dir)
        # case_type:yaml    cases_dir:F:\ProjectHcEdu\platform\web-engine\examples

        if "caseinfo" in metafunc.fixturenames:
            metafunc.parametrize("caseinfo", data['case_infos'], ids = data['case_names'])

    def pytest_collection_modifyitems(self,items):
        """
        用例收集完毕之后被调用,可以用来调整测试用例执行顺序;
        """
        for item in items:
            item.name = item.name.encode("utf-8").decode("unicode_escape")
            item._nodeid = item.callspec.id

CaseParser.py文件
用例解析器, 根据你传过来的参数,选择不同的解析器
在这里插入图片描述
YamlCaseParser.py
在这里插入图片描述
TestRunner.py执行测试用例
在这里插入图片描述

在这里插入图片描述
CasesPlugin.py文件先执行对数据进行处理,传给WebTestRunner.py后执行

allure报告体现
在这里插入图片描述

重点:
1、关键字我们进行封装:有可能没有封装数据,拓展功能

场景:
1、直接跑对应的脚本
2、慢:指定驱动路径:driver_path
3、需要浏览器的参数:比如无头模式(没有界面)
4、分布式地址:指定grid_url
5、有部分关键字没有的情况,那么这个位置就需要指定:–keyDir=C:\Users\Lenovo\Desktop\huace\huace_web_platform\class1\web-engine\webrun\extend\script"

注意事项:

  1. 文件名、类名、方法名必须一致
  2. 必须有对应的构造方法,实例化的时候必须传对应driver过来

有关键字则去找,没有关键字则动态的进行维护,自己写关键字

在这里插入图片描述

三、核心执行器利用命令驱动执行

通过python setup.py install进行安装
执行对应的测试用例: huace-webrun --cases=./examples -sv --capture=tee-sys --alluredir=allure-data
生成测试报告: allure generate allure-data -c -o allure-report

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

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

相关文章

AI自媒体变现路径大盘点!建议收藏!

当下的我做为一人公司或者超级个体为目标的创业模式,无论是在写作、图文和短视频输出方面,我都是运用了N个AI工具来提升我的生产力。 这种创业模式就是一个人N个AI的模式,我们可以通过AI工具做提效来赚取差价,以时间复利来累计财…

Boost电路双闭环控制MATLAB仿真

一、Boost电路电流内环控制MATLAB仿真模型 1.MATLAB仿真模型 1.1.仿真模型图 因为要使用电流内环控制,相比较于开环控制中直接给定MOS开关的占空比,这里通过把电路的平均电流和一电流基准值相比较来控制MOS开关的占空比,因此称为闭环控制。…

centos7 zabbix监控nginx的pv和uv和status_code

zabbix监控nginx的pv: pv)cat /var/log/nginx/access.log|awk {print $1}|wc -l;;zabbix-get验证: [rootbogon ~]# zabbix_get -s 192.168.253.231 -k pv_uv[pv] 100zabbix监控nginx的uv uv)cat /var/log/nginx/access.log|awk {print $1}|uniq -c | w…

分布式系统理论基础:Raft、Zab

目录 引言RaftZabPaxos、Raft、Zab再比较小结 该系列博文会告诉你什么是分布式系统,这对后端工程师来说是很重要的一门学问,我们会逐步了解分布式理论中的基本概念,常见算法、以及一些较为复杂的分布式原理,同时也需要进一步了解…

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程 Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程前言 OpenCV概述核心功能优势特点应用领域安装与使用 OpenCV_contrib概述核心功能具体模块 安装与使用一、准备工作二、下载OpenCV和OpenCV_contrib三、编译和安装OpenCV四、…

【鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式教程详解】

鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式详解 在使用uniapp打包的鸿蒙项目的过程中,由于生成的是app文件,而hdc传给鸿蒙HarmonyOS系统需要的是hap文…

HarmonyOS 5.0应用开发——应用打包HAP、HAR、HSP

【高心星出品】 目录 应用打包HAP、HAR、HSPModule类型HAPHAR创建HAR建立依赖HAR共享内容 HSP创建HSP建立依赖同上HSP共享内容同上 HAR VS HSP 应用打包HAP、HAR、HSP 一个应用通常会包含多种功能,将不同的功能特性按模块来划分和管理是一种良好的设计方式。在开发…

数据结构————map,set详解

今天带来map和set的详解&#xff0c;保证大家分清楚 一&#xff0c;概念 map和set是一种专门用来搜索的容器或数据结构 map能存储两个数据类型&#xff0c;我们称之为<key-value>模型 set只能存储一个数据类型&#xff0c;我们称之为纯<key>模型 它们的效率都非…

Vue.js(2): 组件与路由基础指南

这一路上可能会有艰辛、困难、疑惑、付出、泪水、失败&#xff0c;但是一定要享受这个过程&#xff0c;因为所有的失败都是为了下一刻的成功 文章目录 组件什么是组件组件化开发的好处组件底层是什么全局注册组件局部注册组件组件嵌套组件命名规则组件传值 SPAvue-router路由动…

[c++高阶]二叉搜索树深度剖析

1.前言 从二叉搜索树开始&#xff0c;后面慢慢学的AVL树&#xff0c;红黑树&#xff0c;map,set&#xff0c;哈希表等等都会慢慢的变得更难了&#xff0c;也更加难以理解了。希望大家能够坚持下去&#xff0c;只要坚持&#xff0c;就是胜利。 本章重点 着重讲解什么是二叉搜索…

【力扣刷题实战】单值二叉树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 单值二叉树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#xff01;&#xff01;…

MySQL数据库MHA高可用

目录 一、MHA简述 二、MHA 的组成 三、MHA 的特点 四、MHA工作原理 五、MHA部署步骤 六、搭建 MySQL MHA MHA一主两从高可用集群示意图 实验环境 1. Master、Slave1、Slave2 节点上安装 mysql5.7 2. 关闭防火墙 3. 修改 Master、Slave1、Slave2 节点的主机名 4. 修…

国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台

​在当今的互联网时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了越来越多用户的喜爱。为了提供更好的用户体验和满足用户需求&#xff0c;一个好的短剧系统需要具备多元化的功能和优质的界面设计。 本文将介绍国内短剧源码短剧系统搭建小程序部署H5、APP所需的…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

Typora一款极简Markdown文档编辑器和阅读器,实时预览,序列号生成!免费!最新可用!

文章目录 一、Typora下载和安装二、Typora序列号生成 Typora是一款Markdown编辑器和阅读器&#xff0c;风格极简&#xff0c;实时预览&#xff0c;所见即所得&#xff0c;支持MacOS、Windows、Linux操作系统&#xff0c;有图片和文字、代码块、数学公式、图表、目录大纲、文件管…

C/C++(八)C++11

目录 一、C11的简介 二、万能引用与完美转发 1、万能引用&#xff1a;模板中的 && 引用 2、完美转发&#xff1a;保持万能引用左右值属性的解决方案 三、可变参数模板 1、可变参数模板的基本使用 2、push 系列和 emplace 系列的区别 四、lambda表达式&#xf…

海亮科技亮相第84届中国教装展 尽显生于校园 长于校园教育基因

10月25日&#xff0c;第84届中国教育装备展示会&#xff08;以下简称“教装展”&#xff09;在昆明滇池国际会展中心开幕。作为国内教育装备领域规模最大、影响最广的专业展会&#xff0c;本届教装展以“数字赋能教育&#xff0c;创新引领未来”为主题&#xff0c;为教育领域新…

MYSQL期中复习

MYSQL [语句不要拼错&#xff0c;表名、列名不要写错&#xff0c;语句难记要记住] 创建表 模版 create table 表名(列名1 数据类型 [约束], 列明2 数据类型 [约束], [表级约束]); 约束 单一主码约束 primary key 联合主码约束 primary key(列名1,列名2) [要在列名12定义后…

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统是一个非常强大的组合。以下是一个详细的步骤指南&#xff0c;帮助你构建这样一个系统。 硬件准备 Intel RealSense深度相机&#xff1a;例如D415、D435或L515。计算平台&#xff1a;一台具有足够计算能力的计算机&…

无人机之多源信息融合算法篇

一、概述 多源信息融合算法在无人机导航领域中扮演着越来越重要的角色。该算法通过整合来自不同传感器&#xff08;如全球定位系统GPS、惯性导航系统INS、磁力计、气压高度计、视觉传感器等&#xff09;的数据&#xff0c;利用先进的数据融合算法处理这些多源信息&#xff0c;以…