pytest--fixture详细介绍-作为参数传入,error和failed区别
前言
fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手!
fixture简介
fixture的目的是提供一个固定基线,在该基线上测试可以可靠地和重复地执行。fixture提供了区别于传统单元测试(setup/teardown)有显著改进:
- 独立的命名,并通过声明他们从测试函数、模块、类或整个项目中的使用来激活
- 按模块化的方式实现,每个fixture都可以互相调用。
- fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化,或者跨函数function、类class、模块module或整个测试会话session范围。
fixture作为参数传入
定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名。
fixture是可以有返回值的,如果没return默认返回None。用例调用fixture的返回值,直接就是把fixture的函数名称当成变量名称,如下面例子。
import pytest
@pytest.fixture()
def user():
print("得到用户名")
a="zs"
return a
def test_t1(user):
print(f'user=="zs":{user=="zs"}')
assert user=="zs"
if __name__ == "__main__":
pytest.main(["-s", " test_001.py"])
运行结果:
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\xyautotest
plugins: allure-pytest-2.8.19, Faker-4.18.0, hypothesis-6.14.6, assume-2.4.3, forked-1.3.0, html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1, xdist-2.3.0, tep-0.8.9collected 1 item
test_001.py 得到用户名
.user=="zs":True
[100%]
============================== 1 passed in 0.11s ==============================
error和failed区别
测试结果一般有三种:passed、failed、error.(skip的用例除外)
如果在test_用例里面断言失败,那就是failed
# -*- coding=utf-8 -*-
import pytest
@pytest.fixture()
def user():
print("得到用户名")
a="ls"
return a
def test_t1(user):
print(f'user=="zs":{user=="ls"}')
assert user=="Ls"
if __name__ == "__main__":
pytest.main(["-s", " test_001.py"])
运行结果:
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\xyautotest
plugins: allure-pytest-2.8.19, Faker-4.18.0, hypothesis-6.14.6, assume-2.4.3, forked-1.3.0, html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1, xdist-2.3.0, tep-0.8.9collected 1 item
test_001.py 得到用户名
Fuser=="zs":False
test_001.py:8 (test_t1)
zs != ls
Expected :ls
Actual :zs
<Click to see difference>
user = 'zs'
def test_t1(user):
print(f'user=="zs":{user=="ls"}')
> assert user=="ls"
E AssertionError: assert 'zs' == 'ls'
E - ls
E + zs
test_001.py:11: AssertionError
[100%]
================================== FAILURES ===================================
___________________________________ test_t1 ___________________________________
user = 'zs'
def test_t1(user):
print(f'user=="zs":{user=="ls"}')
> assert user=="ls"
E AssertionError: assert 'zs' == 'ls'
E - ls
E + zs
test_001.py:11: AssertionError
---------------------------- Captured stdout setup ----------------------------
得到用户名
---------------------------- Captured stdout call -----------------------------
user=="zs":False
=========================== short test summary info ===========================
FAILED test_001.py::test_t1 - AssertionError: assert 'zs' == 'ls'
============================== 1 failed in 0.29s ==============================
Process finished with exit code 0
Assertion failed
Assertion failed
如果在fixture里面断言失败了,那就是error
import pytest
@pytest.fixture()
def user():
print("得到用户名")
a="zs"
assert a =='ls'
return a
def test_t1(user):
print(f'user=="zs":{user=="zs"}')
assert user=="zs"
if __name__ == "__main__":
pytest.main(["-s", " test_001.py"])
运行结果:
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\xyautotest
plugins: allure-pytest-2.8.19, Faker-4.18.0, hypothesis-6.14.6, assume-2.4.3, forked-1.3.0, html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1, xdist-2.3.0, tep-0.8.9collected 1 item
test_001.py E得到用户名
test setup failed
zs != ls
Expected :ls
Actual :zs
<Click to see difference>
@pytest.fixture()
def user():
print("得到用户名")
a="zs"
> assert a =='ls'
E AssertionError: assert 'zs' == 'ls'
E - ls
E + zs
test_001.py:8: AssertionError
[100%]
=================================== ERRORS ====================================
__________________________ ERROR at setup of test_t1 __________________________
@pytest.fixture()
def user():
print("得到用户名")
a="zs"
> assert a =='ls'
E AssertionError: assert 'zs' == 'ls'
E - ls
E + zs
test_001.py:8: AssertionError
---------------------------- Captured stdout setup ----------------------------
得到用户名
=========================== short test summary info ===========================
ERROR test_001.py::test_t1 - AssertionError: assert 'zs' == 'ls'
============================== 1 error in 0.25s ===============================
Process finished with exit code 0
Assertion failed
Assertion failed
还有一种情况也会出现error,那就是自己代码写的有问题,自己本身代码报错,那就是error了。

浙公网安备 33010602011771号