使用pytest大家都会有些自己的心得和理解,但要谈到执行顺序,可能很多人都会像我一样顿感混乱,到底谁先谁后真是傻傻分不清楚。
为此我特地参照网友前辈分享学习了一下。学习过后才觉强大,原来pytest执行顺序可以私人订制。
安装
pip install pytest-ordering
设置单文件执行顺序
在未使用pytest-ordering设定执行顺序前,执行顺序按照测试方法从上到下顺序执行。
test_a_temp1.py
# -*- coding:utf-8 -*-
import pytest
@pytest.mark.run(order=2)
def test_order1_2():
print("order=2")
@pytest.mark.run(order=0)
def test_order1_0():
print("order=0")
@pytest.mark.run(order=1)
def test_order1_1():
print("order=1")
@pytest.mark.run(order=-1)
def test_order1__1():
print("order=-1")
@pytest.mark.run(order=-2)
def test_order1__2():
print("order=-2")
当使用@pytest.mark.run(order=NUMBER) 设定执行顺序后。NUMBER的取值范围同数组顺序,以0、1、2......-2、-1顺序执行测试。
设置多文件执行顺序
那多文件执行时,会先按照文件名的ASCII码顺序执行,还是先遵循@pytest.mark.run(order=NUMBER)设定的顺序呢?增加一个同顺序文件,看看结果。
test_a_temp2.py
# -*- coding:utf-8 -*-
import pytest
@pytest.mark.run(order=2)
def test_order2_2():
print("order=2")
@pytest.mark.run(order=0)
def test_order2_0():
print("order=0")
@pytest.mark.run(order=1)
def test_order2_1():
print("order=1")
@pytest.mark.run(order=-1)
def test_order2__1():
print("order=-1")
@pytest.mark.run(order=-2)
def test_order2__2():
print("order=-2")
结果大出意料,多文件执行时,仍然是按照测试方法的从0、1、2......-2、-1顺序执行,而不是按照文件名ASCII码顺序执行。相当于order这个参数将测试方法划分成了不同级别,执行完所有order=0的测试方法,才会执行order=1的用例。
setup、teardown控制执行顺序
setup、teardown在unittest或pytest的出镜率极高,对于这两个做前置、后置处理的方法多数人都能熟练掌握。但要说起不同级别
前后置处理方法的使用, 可能多数人也会跟我一样犯晕。这个问题还是列个表格摊开说明更容易理解。
方法级别 | 方法名 | 作用范围 |
模块(文件) | setup_module/teardown_module | 写于类外,优先于在函数级方法 |
函数级 | setup_function/teardown_function | 写于类外,优先于类级方法 |
类级 | setup_class/teardown_class | 写于类中,优先于方法级方法 |
方法级 | setup_method/teardown_method | 写于类中,优先于无级别方法 |
无级别 | setup/teardown | 写于类中 |
setup、teardown级别如同洋葱一样层层包裹,优先级从外到内逐层递减,setup越优先执行,对应teardown越往后执行。
# -*- coding:utf-8 -*-
import pytest
def setup_module():
print("\nsetup_module1")
def setup_function():
print("setup_function1")
def teardown_module():
print("teardown_module1")
def teardown_function():
print("teardown_function1")
class TestDemo1(object):
def setup_method(self):
print("setup_method1")
def test_case1(self):
print("case1")
def setup(self):
print("setup1")
def setup_class(self):
print("setup_class1")
def teardown_method(self):
print("teardown_method1")
def teardown(self):
print("teardown1")
def teardown_class(self):
print("teardown_class1")
class TestDemo2(object):
def setup_method(self):
print("setup_method2")
def test_case1(self):
print("case2")
def setup(self):
print("setup2")
def setup_class(self):
print("setup_class2")
def teardown_method(self):
print("teardown_method2")
def teardown(self):
print("teardown2")
def teardown_class(self):
print("teardown_class2")
if __name__ == '__main__':
pytest.main(['-s'])