pytest框架简介


一、pytest框架简介

  1. pytest是单元测试框架(测试函数、方法)
  2. 自动化测试框架的功能:发现用例 —> 执行用例 —> 判断结果 —> 输出结果
  3. pytest框架 < 单元测试框架 < 自动化测试框架
  4. pytest+插件/包:
    1. requests:接口自动化
    2. selenium、appium:UI自动化
    3. allure-pytest:美观的测试报告
    4. Jenkins:持续集成
    5. pytest-html:生成HTML格式的报告
    6. pytest-xdist:分布式执行
    7. pytest-ordering:更改执行顺序
    8. pytest-rerunfailures:重跑失败用例

二、pytest测试用例命名规则

  1. 模块(.py文件)名必须以test_开头或以_test结尾;
  2. 类名必须以Test开头,且不能有init方法;
  3. 方法名必须以test开头;

三、pytest运行方法

1. 主函数模式:
  1. 运行所有用例:pytest.main([“-vs”])

    主函数在任何一个py文件中,都能执行同目录及以下所有py文件中的用例

  2. 指定目录(文件夹名):pytest.main(["-vs", "login"])

  3. 指定模块(.py文件):pytest.main(["-vs", "login/test_login.py"])

  4. 指定方法(nodid,::作为隔离符 ):pytest.main(["-vs", "login/test_login.py::TestLogin::testLogin"])

2. 命令行模式:
  • 参考主函数运行模式
3. 通过读取pytest.ini配置文件运行(实际工作中最常使用)
  1. pytest.ini:pytest核心配置文件
    1. 位置:一般在项目根目录
    2. 编码:ANSI
    3. 作用:改变pytest的默认行为,运行pytest前都会去读取此文件

    [pytest]
    addopts = -vs # 命令行的参数
    testpaths = ./test #测试用例的路径
    python_files = yqsl_*.py # 测试模块名规则
    python_classes = Yqsl* # 测试类名规则
    python_functions = yqsl* #测试方法名规则
    markers = # 运行哪些标记用例

参数详解:

-vs:输出更详细的信息 + 输出调试信息(包括print打印信息)
-n 数量:分布式运行,pytest.main(["-vs", "test_login.py", "-n=2"])
-x:用例报错即停止测试
--maxfail 数量:报错达到最大数量才停止测试,pytest.main(["-vs", "test_login.py", "--maxfail=2")
--reruns 数量:失败的用例重跑次数, pytest.main(["-vs", "test_login.py", "--reruns=2"])
-k:用例名称模糊匹配后执行,pytest.main(["-vs", "test_login.py", "-k=login''])
--html ./report/report.html:生成HTML格式报告

四、pytest执行顺序

  1. 默认从上到下执行
  2. 可以使用mark标记来更改顺序:

    @pytest.mark.run(order=1)
    提示:必须先安装pytest-ordering插件

五、分组执行

  1. pytest中用markers标记用例,可以指定执行标记用例(如:测试模块,用户管理模块)
  2. 代码中用@pytest.mark.xxx给用例打上标记
  3. pytest -vs -m "xxx or xxx":使用命令行方式执行时

六、跳过部分用例执行

1. 无条件跳过

@pytest.mark.skip(reason="跳过原因")

1. 有条件跳过

@pytest.mark.skipif(age>=18, reason="跳过原因")
变量age大于18时,跳过执行此用例

七、前后置(夹具),常用的有三种

  1. setupteardown(setup_classteardown_class)

    1. def setup_class(self): # 这个在所有用例执行前执行一遍
    2. def setup(self): # 这个在每个用例执行执行一遍
    3. def teardown(self): # 这个在每个用例执行执行一遍
    4. def teardown_class(self):# 这个在所有用例执行后执行一遍

    缺点:如果一个测试类下部分用例要执行夹具(如:打开浏览器),则不能实现

  2. @pytest.fixture(scope="", params="", autouse="", ids="", name="")

    1. scope表示被标记方法的作用域(function(默认)classmodulepackage/session
    2. params参数化:
      1. 支持列表[]、元祖()、字典列表[{}, {}, {}]、字典元祖({}, {}, {})
      2. 如果有多个参数,被标记的方法则会执行多次
    3. autouse=Ture类下所有用例执行前自动添加夹具方法(无需给每个用例都引用夹具名称),默认是false
    4. ids当使用params时给每一个值设置一个变量名。意义不大
    5. name给被标记的方法取一个别名
  3. conftest.py

    1. 单独用于存放fixture的配置文件
    2. conftest.py中的固件在使用时不需要引用
    3. 可以有多个conftest.py文件
    4. 用例中先引用的固件,则先执行

八、处理全局、中间变量

  1. 比较成熟的方式是:通过一个yaml文件管理(接口框架封装第一步)
  2. 通过一个范围是session的fixture来调用clear_yaml。保证每次session之前都清楚yaml文件内容

九、断言

  1. 一般断言方式:
    1. assert xxx in response
    2. assert response["body"] == xxx

十、结合allure-pytest生成报告

  1. 前提安装插件、包:
    1. 官网下载并解压allure到目录;
    2. 将allure/bin目录添加到全局配置path中;
    3. 验证安装成功allure --version;
    4. pip list中安装allure-pytest插件;
  2. 报告生成流程:
    1. 生成临时的json文件:
      1. pytest.ini中添加命令:addopts=-vs --alluredir ./temp
    2. 通过json文件生成allure报告:
      1. 命令:os.system(allure generate ./temp -o ./reports --clean)
      2. 解释:
        1. allure generate ./temp:生成allure报告,从./temp目录中读取临时json文件;
        2. -O ./reports:输出结果到./reports目录下;
        3. clean:输出前清除上一次的数据;

十一、使用yaml实现数据驱动

  1. 使用@fixture.mark.parametrize(args_name, args_value)完成

    args_name:参数名(多个参数名,则可以解包。如"name1, value1")

    args_value:参数值(支持列表[]、元祖()、字典列表[{}, {}, {}]、字典元祖({}, {}, {}),如果有多个参数,被标记的方法则会执行多次)

  2. 举例:@fixture.mark.parametrize("name, value", [["张三", 18], ["李四", 20]])


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM