重中之重,Pytest框架的学习

8 阅读3分钟

这是测试框架的学习,开始和python结合起来了,边学习边补充语法吧 image.png

我先来总结一下标记 标记分为用户自定义标记和框架内置标记

1.用户自定义标记

下面是标记注册,先创建一个ini的本文,注意要在根目录下

image.png

下面是引用标记

image.png

比如我想只测试web标记的用例,用pytest -m web 来筛选

image.png

2.内置标记

不用注册可直接使用,可筛选可增加特殊效果,不同标记可增加不同效果

image.png

读懂测试用例结果 image.png

fixtrue

image.png

image.png

因为 fixture 不是普通函数

加了 @pytest.fixture 后:它变成了 pytest 专属工具调用方式变成:调用方式变成:写函数名当参数 → 自动运行

还可以自动执行,比如下面有几百个用例,这样就不区别对待了

image.png

yield作用

image.png

  • pytest 执行 test_1(f) 时,发现参数 f 对应上面的 fixture f()

  • 执行 fixture 里 yield 之前的代码:打印 “用例开始执行”

  • 执行到 yield 123 时,pytest 会把 123 这个值 “返回” 给用例里的 f 参数

  • 用例 test_1 里的 print("接收到yield传来的值", f) 执行,所以输出 接收到yield传来的值 123

  • 用例执行完,再回到 fixture 里,执行 yield 后面的代码:打印 “用例结束执行”

接下来说一下不同参数对应的输出信息

image.png

module 不用每次都执行,只在最前最后面执行,比如你要打开浏览器页面,不可能每个用例都打开一次,这也叫范围共享,省了很多时间

image.png

配置全局fixtrue之conftest.py文件

所以在正常的情况下。我们一般都是把fixtrue的功能放在conftest.py文件内,然后外面调用的时候用@pytest.fixture时候去使用。这里要记住一点,那就是conftest.py文件的名称是固定的,也就是内置的。只有设置成这个文件的名称才回去直接执行里面的内容。 就比如我在conftest里写一个 '

@pytest.fixture()
def f():
print("1")
yield
print("2")
import pytest 
@pytest.mark.usefixtures("f") # 注意:双引号包起来
def test_a(): 
print("我是测试用例")

就可以用了

1)conftest.py

  • 它是 pytest 的公共配置文件
  • 专门用来放所有测试文件都能用的 fixture
  • 不用导入,整个项目自动识别

2) @pytest.fixture()

  • 用来定义一个夹具(前置 + 后置 + 返回值)
  • 相当于造一个可复用的工具
  • 可以写在 conftest 里,也可以写在测试文件里

3) @pytest.mark.usefixtures("xxx")

  • 给用例 / 类绑定 fixture
  • 让 fixture 自动执行前后置
  • 不拿返回值

image.png

当然,@pytest.fixture也可以写在测试项目里

image.png

插件

html插件

pytest --html=report.html

可以生成html报告

xdist插件

让你的 pytest 用多进程并行跑测试用例,大幅缩短执行时间

-n后面加数字,代表分为几个进程

pytest -n 4

rerunfailures插件

  • --reruns N:失败的用例,自动重试 N

  • --reruns-delay S:每次重试之间,延迟 S 秒再跑

pytest --reruns 2 --reruns-delay 1

生成企业级报告

pytest --alluredir=./allure-results 
allure generate ./allure-results -o ./allure-report --clean
  • pytest → 运行测试
  • --alluredir=指定 Allure 结果存放目录
  • ./allure-results文件夹名字(你自己随便起)

-o = output = 输出到哪里

--clean = 清空旧报告