原来pytest执行顺序可以私人订制,又get到前辈们的精髓了

使用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顺序执行测试。

原来pytest执行顺序可以私人订制,又get到前辈们的精髓了_第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的用例。

原来pytest执行顺序可以私人订制,又get到前辈们的精髓了_第2张图片

 

 

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'])

 

原来pytest执行顺序可以私人订制,又get到前辈们的精髓了_第3张图片

你可能感兴趣的:(pytest,自动化测试,python)