Python+pytest+selenium:打造高效Web自动化测试平台

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

脚本

底层用了三个内容: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.调用对应的方法传不定长参数

    02 核心执行器框架逻辑梳理

    操作步骤

    1、创建虚拟环境

    2、安装依赖包:pipinstall-rrequirements.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
    

      Python+pytest+selenium:打造高效Web自动化测试平台_第1张图片

      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框架中用来动态生成测试用例参数的钩子函数。通过它,我们可以在运行时动态地生成测试参数,从而避免手动编写重复的测试用例。

      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文件

        用例解析器,根据你传过来的参数,选择不同的解析器

        Python+pytest+selenium:打造高效Web自动化测试平台_第2张图片

        YamlCaseParser.py

        Python+pytest+selenium:打造高效Web自动化测试平台_第3张图片

        TestRunner.py执行测试用例

        Python+pytest+selenium:打造高效Web自动化测试平台_第4张图片

        Python+pytest+selenium:打造高效Web自动化测试平台_第5张图片

        CasesPlugin.py文件先执行对数据进行处理,传给WebTestRunner.py后执行

        allure报告体现

        Python+pytest+selenium:打造高效Web自动化测试平台_第6张图片

        重点

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

        场景

        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+pytest+selenium:打造高效Web自动化测试平台_第7张图片

        03 核心执行器利用命令驱动执行

        通过pythonsetup.pyinstall进行安装

        执行对应的测试用例:

        huace-webrun–cases=./examples-sv–capture=tee-sys–alluredir=allure-data

        生成测试报告:

        alluregenerateallure-data-c-oallure-report

        最后作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些软件测试的学习资源,希望能给你前进的路上带来帮助。

        软件测试面试文档

        我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

        测试文档模板

        图片

        测试简历模板

        图片

        视频文档获取方式:
        这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

        你可能感兴趣的:(软件测试,python,pytest,selenium,功能测试,软件测试,自动化测试,程序人生)