当前位置: 首页 > news >正文

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

在这里插入图片描述


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

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

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

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

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

目标:维护成本不要太高

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

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

核心执行器:

# 这是一个 同一个 测试用例执行器
# 读取到所有的 用例配置信息, 一个个执行# 1. 读取所有指定文件夹下面的 yaml文件内容
import osimport allure
import pytest
import yamlall_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 pytestfrom webrun.core.CasesPlugin import CasesPlugindef 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 pytestfrom webrun.parse.CaseParser import case_parser
from webrun.core.globalContext import g_contextclass 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\examplesif "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


http://www.mrgr.cn/news/61880.html

相关文章:

  • 小米充电宝哪款好用?2024年西圣、小米、罗马仕充电宝全方位测评
  • 网络中的一些基本概念
  • vue3中ref和reactive的用法,区别和优缺点,以及使用场景
  • 5. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验5:PWM驱动直流电机)
  • 数据库基础介绍
  • 简记Vue3(二)—— computed、watch、watchEffect
  • 匹配销售策略的CRM系统挑选指南
  • 如何改变微博ip地址
  • jjycheng字符签名
  • 「JVS更新日志」低代码、无忧文档、规则引擎等10.30功能更新说明
  • phy驱动功能详解
  • 希亦内衣洗衣机Pro:18项核心数据硬核黑科技,爆发10倍洁净力!
  • Leetcode54. 螺旋矩阵
  • 【从零开始的LeetCode-算法】3216. 交换后字典序最小的字符串
  • 基于 Java Swing 实现的简单科学计算器
  • 使用 async/await 时未捕获异常的问题及解决方案
  • 【C++】结构体、enum、union回顾
  • 全面解析:轻松掌握多模态技术精髓
  • YOLOv11改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含C2PSA二次创新)
  • 【Linux】环境ChatGLM-4-9B 模型部署
  • 消息队列-Rabbitmq(消息发送,消息接收)
  • 什么情况下会导致 RCU CPU Stall 警告?
  • 平价开放式耳机品牌推荐有哪些?五大性价比开放式耳机推荐!
  • 代码随想录算法训练营第十五天|110平衡二叉树、257二叉树的所有路径 、404左叶子之和、222完全二叉树的节点个数
  • 收藏 | 推荐15个数据可视化图表绘制网站
  • Windows on ARM编译python的sherpa-onnx库