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了。

posted @ 2021-09-13 14:02  qiupeng  阅读(330)  评论(0)    收藏  举报