Pytest用例运行及先后顺序
温馨提示
本篇约1600字,看完需3-5分钟,学习学半小时,加油!
先看普通函数运行顺序
import pytest
def test_one():
print("我是清安")
def test_02():
print("--02--")
def test_a():
print("--a--")
def test_a_1():
print("--a_01__")
def test_01():
print("--01--")
可以看到,这样写,用例的运行先后顺序根据自己写的先后函数顺序进行执行的。
那么写到类中呢?
import pytest
class Testcase:
def test_one(self):
print("我是清安")
def test2(self):
print("--02--")
def test_a(self):
print("--a--")
def test_a_1(self):
print("--a_01__")
def test1(self):
print("--01--")
没有丝毫变化。
模块用例运行先后顺序
首先准备两个.py文件,名称为test_a,test_b。内容如下:
import pytest
class Test_a:
def test_a1(self):
print(f"我是-{__class__.__name__}-类")
import pytest
class Test_b:
def test_b1(self):
print(f"我是-{__class__.__name__}-类")
看,是有先后顺序的。其实你也可以理解为是Pycharm已经事先排过一次顺序了,按a-z亦或者1-9这样的顺序已经排过了,因为,你在创建.py文件的时候,就已经产生了顺序,pytest只是按照特定顺序进行测试而已。
前置后置
import pytest
class Testcase():
def setup(self):
"""每个方法用例运行前运行"""
print("---1-set---")
def teardown(self):
"""每个方法用例运行后运行"""
print("---1-down---")
def setup_class(self):
"""每个 class 运行前运行(只运行一次)"""
print("---2-set class---")
def teardown_class(self):
"""每个 class 运行后运行(只运行一次)"""
print("---2-down class---")
def test_02(self):
print("--02--")
def test_01(self):
print("--01--")
它会告诉你teardowm在后续准备取消了,建议改用teardowm_method,改完后再跑,就不会出现这种警告了。(setup改setup_method以及teardowm改teardowm_method此处需自己改动)
并且是不计入用例的。并且它不会像unittest一样根据用例的名称来自动判断执行用例的先后顺序。它有自己的方式方法。
💥注意看优先级,以及代码中的注释,setup_class先运行,并且直到代码全部跑完,teardown_class才运行,其中setup_method以及teardowm_method每个用例运行的时候前后都会运行一次。
用例先后顺序设定
这就需要用到第三方插件了
pip install pytest-ordering
import pytest
class Testcase():
def setup_method(self):
"""每个方法用例运行前运行"""
print("---1-set---")
def teardown_method(self):
"""每个方法用例运行后运行"""
print("---1-down---")
def setup_class(self):
"""每个 class 运行前运行(只运行一次)"""
print("---2-set class---")
def teardown_class(self):
"""每个 class 运行后运行(只运行一次)"""
print("---2-down class---")
def setup_module(self):
"""模块运行前运行(只运行一次)"""
print("---3-module class---")
def teardown_module(self):
"""模块运行后运行(只运行一次)"""
print("---3-module class---")
@pytest.mark.run(order=2)
def test_02(self):
print("--02--")
@pytest.mark.run(order=1)
def test_01(self):
print("--01--")
如上简单的小测试,以便于了解。接下来详细说说!
源码小片段
orders_map = {
'first': 0,
'second': 1,
'third': 2,
'fourth': 3,
'fifth': 4,
'sixth': 5,
'seventh': 6,
'eighth': 7,
'last': -1,
'second_to_last': -2,
'third_to_last': -3,
'fourth_to_last': -4,
'fifth_to_last': -5,
'sixth_to_last': -6,
'seventh_to_last': -7,
'eighth_to_last': -8,
}
上述是源码中对于优先级
一个小示范
import pytest
class Testnew:
@pytest.mark.second
def testa_02(self):
print("--02--")
@pytest.mark.third
def testa_03(self):
print("--03--")
@pytest.mark.fourth
def testa_04(self):
print("--04--")
@pytest.mark.first
def testa_01(self):
print("--01--")
鉴于上述,运行的时候会提示一系列的信息(此处不展示),看着不爽,可以:
import pytest
class Testnew:
@pytest.mark.run(order=2)
def testa_02(self):
print("--02--")
@pytest.mark.run(order=3)
def testa_03(self):
print("--03--")
@pytest.mark.run(order=4)
def testa_04(self):
print("--04--")
@pytest.mark.run(order=1)
def testa_01(self):
print("--01--")
当然上述代码中你也可以写入负数,也是可以的。
执行特定的用例
也就是前面讲过的-k参数。一起看看
import pytest
class Test_new:
def test_b2(self):
print("**b2**")
def test_b1(self):
print("**b1**")
def test_a1(self):
print("--a1--")
def test_a2(self):
print("--a2--")
它可以帮助我们过滤掉一些不想运行的用例,也是一个很不错且比较常用的参数。