pytest 测试实战 2 - 进阶篇

目录

  • 数据驱动
  • Fixture 高级用法
  • pytest 插件应用
  • pytest hook 插件
  • Allure 生成测试报告

数据驱动

数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。

YAML 用法

https://www.runoob.com/w3cnote/yaml-intro.html

Fixture 用法

Fixture 特点及优势

  • 1、命令灵活:对于 setup,teardown,可以不起这两个名字
  • 2、数据共享:在 conftest.py 配置⾥写⽅法可以实现数据共享,不需要 import 导⼊。可以跨⽂件共享
  • 3、scope 的层次及神奇的 yield 组合相当于各种 setup 和 teardown

Fixture 在自动化中的应用 1

  • 场景:

测试⽤例执⾏时,有的⽤例需要登陆才能执⾏,有些⽤例不需要登陆。

setup 和 teardown ⽆法满⾜。fixture 可以。默认 scope(范围)function

  • 步骤:
    • 1.导⼊ pytest
    • 2.在登陆的函数上⾯加@pytest.fixture()
    • 3.在要使⽤的测试⽅法中传⼊(登陆函数名称),就先登陆
    • 4.不传⼊的就不登陆直接执⾏测试⽅法。

Fixture 在自动化中的应用 2

  • 场景:

你与其他测试⼯程师合作⼀起开发时,公共的模块要在不同⽂件中,要在⼤家都访问到的地⽅。

  • 解决:

使⽤ conftest.py 这个⽂件进⾏数据共享,并且他可以放在不同位置起着不同的范围共享作⽤。

  • 前提:

    • conftest ⽂件名是不能换的
    • 放在项⽬下是全局的数据共享的地⽅
  • 执⾏:

    • 系统执⾏到参数 login 时先从本模块中查找是否有这个名字的变量什么的,
    • 之后在 conftest.py 中找是否有。
  • 步骤:

将登陆模块带@pytest.fixture 写在 conftest.py

Fixture 在自动化中的应用 3

场景:

不想原测试⽅法有任何改动,或全部都⾃动实现⾃动应⽤,

没特例,也都不需要返回值时可以选择⾃动应⽤

解决:

使⽤ fixture 中参数 autouse=True 实现

步骤:

在⽅法上⾯加 @pytest.fixture(autouse=True)

Fixture 在自动化中的应用 4

场景:

你已经可以将测试⽅法前要执⾏的或依赖的解决了,

测试⽅法后销毁清除数据的要如何进⾏呢?

范围是模块级别的。类似 setupClass

解决:

通过在同⼀模块中加⼊ yield 关键字,yield 是调⽤第⼀次返回结果,

第⼆次执⾏它下⾯的语句返回。

步骤:

在@pytest.fixture(scope=module)。在登陆的⽅法中加 yield,之后加销毁清除的步骤

Pytest 实用的插件介绍

pytest 常用的插件

pip install pytest-ordering  控制用例的执行顺序(重点)
pip install pytest-xdist    分布式并发执行测试用例(重点)
pip install pytest-dependency   控制用例的依赖关系 (了解)
pip install pytest-rerunfailures   失败重跑(了解)
pip install pytest-assume          多重较验(了解)
pip install pytest-random-order  用例随机执行(了解)
pip intall  pytest-html            测试报告(了解)

pytest 执行顺序控制

场景:

对于集成测试,经常会有上下文依赖关系的测试用例。

比如 10 个步骤,拆成 10 条 case,这时候能知道到底执行到哪步报错。

用例默认执行顺序:自上而下执行

解决:

可以通过 setup,teardown 和 fixture 来解决。也可以使用对应的插件。

安装:pip install pytest-ordering

用法:@pytest.mark.run(order=2)

注意:多个插件装饰器(>2)的时候,有可能会发生冲突

Pytest 多线程并行与分布式执行

场景 1:

测试用例 1000 条,一个用例执行 1 钟,一个测试人员执行需要 1000 分 钟。

通常我们会用人力成本换取时间成本,加几个人一起执行,时间就会 缩短。

如果 10 人一起执行只需要 100 分钟,这就是一种布式场景。

场景 2:

假设有个报名系统,对报名总数统计,数据同时进行修改操作的时候有可能出现问题,

需要模拟这个场景,需要多用户并发请求数据。

解决:

使用分布式并发执行测试用例。分布式插件:pytest-xdist

安装及运行: pip install pytest-xdist

注意: 用例多的时候效果明显,多进程并发执行,同时支持 allure

分布式执行测试用例原则

  • 用例之间是独立的,不要有依赖关系
  • 用例执行没有顺序,随机顺序都能正常执行
  • 每个用例都能重复运行,运行结果不会影响其他用例

Pytest 执行-失败重新运行

场景:

测试失败后要重新运行 n 次,要在重新运行之间添加延迟时间, 间隔 n 秒再运行。

安装: pip install pytest-rerunfailures

执行:

pytest -vs --reruns 3 test_class.py
pytest -vs --reruns 5 --reruns-delay 1

@pytest.mark.flaky(reruns=5, reruns_delay=2) 用例的装饰器,指定这个用例rerun5次,每次延时2秒 

注意:

  • 1、失败的 fixture 与 setup_class 也会被执行
  • 2、不要与 setup_class,setup_module 方法使用

Pytest 执行-支持多断言

场景:

一个方法中写多条断言,通常第一条过不去,下面就不执行了。

我们想报错也都执行一下。

安装: pip install pytest-assume

执行:

pytest.assume(1==4)
pytest.assume(2==4)

pytest hook 插件

改变编码格式

def pytest_collection_modifyitems(session, config, items:list):
  for item in items:
      item.name = item.name.encode('utf-8').decode('unicode-escape')
      item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')  

Allure生成测试报告

Allure

Allure2 解析过程:

  • 1.安装 allure2 (信赖Java1.8)

下载地址:

https://repo1.maven.org/maven2/io/qameta/allure/allure-commandline/

  • 2.安装 allure-pytest 命令:pip install allure-pytest
  • 3.生成 allure 测试结果 :pytest --alluredir=./report/
  • 4.展示报告:allure serve ./report
  • 5.生成最终版本的报告: allure generate ./report

布署报告:本地搭建一个网站服务(例如:Django)

python manage.py runserver (http://127.0.0.1:8000/)

pytest 测试框架课后作业

  • 1、改造 计算器 测试用例,使用 fixture 函数获取计算器的实例
  • 2、计算之前打印开始计算,计算之后打印结束计算
  • 3、添加用例日志,并将日志保存到日志文件目录下
  • 4、生成测试报告,展示测试用例的标题,用例步骤,与测试日志,截图附到课程贴下