8、pytest的前后置(测试固件)

79 阅读3分钟

前言

测试固件也叫测试夹具,用于指定初始化代码或清理代码/扫尾工作

1、setup和teardown

pytest可以使用这2个函数实现测试固件的功能 代码如下

#coding=utf-8
import time
import pytest

class Test_Pytest():
        def setup(self):
                print('\n测试前置动作\n')
        def teardown(self):
                print('\n测试后置动作\n')

        def test_one(self):

                print("test_one方法执行\n" )

        def test_two(self):
                print("test_two方法执行\n" )


        def test_three(self):
                print("test_three方法执行\n" )

        def test_four(self):
                print("test_four方法执行\n")

运行结果如下图

每个函数都会去执行我们这个前后置的函数,作用域是函数级的

image.png

2、setup_class和teardown_class

代码如下

#coding=utf-8
import time
import pytest

class Test_Pytest():
        def setup_class(self):
                print('\n测试前置动作\n')
        def teardown_class(self):
                print('\n测试后置动作\n')

        def test_one(self):

                print("test_one方法执行\n" )

        def test_two(self):
                print("test_two方法执行\n" )


        def test_three(self):
                print("test_three方法执行\n" )

        def test_four(self):
                print("test_four方法执行\n")

运行结果如下 可以看到前后置在这个类被调用一次,作用域是类级别的

image.png

3、 pytest中的fixture

上面介绍了(setup/teardown)的用法,但pytest还有一种更便捷的,fixture提供了区别于传统单元测试(setup/teardown)风格的令人惊喜的功能,而且pytest做得更炫更灵活。

4、fixture之scope的用法

  • function 功能: 在函数或方法运行时执行fixture函数的功能 默认作用域
  • class 功能:在类运行时调用一次。
  • module 功能:在一个模块(一个py文件为一个模块)被运行时,执行一次fixture
  • package 功能:当前被使用fixture的文件所在的包,执行一次fixture
  • session 功能:当前被使用fixture的文件所在的整个项目目录,执行一次fixture

代码如下

import pytest


@pytest.fixture(scope="class", autouse=True)
def login():
    print("\n登录\n")
    yield
    print("\n登出\n")


class TestCase:
    def test_1(self):
        print("\ntest 1\n")

    def test_2(self):
        print("\ntest 2\n")

执行结果如下 可以看到这个类只执行一次测试固件

image.png

5、fixture之params用法

params 参数:一个可选的参数列表,它将导致多次调用fixture函数和使用它的所有测试,获取当前参数可以使用request.param,request 是pytest的内置 fixture ,主要用于传递参数 代码如下

import pytest

data = [("test1", "test1"), ("test2", "test2")]


@pytest.fixture(scope="function", params=data)
def get_data(request):
    print(request.param)
    return request.param


def test_login(get_data):
    print("账号:%s" % get_data[0], "密码:%s" % get_data[1])

运行结果如下

image.png

6、fixture之autouse用法

fixture 里面有个参数 autouse,默认是 Fasle 没开启的,可以设置为True 开启,就可以自动使用了,也就是说不用再手动传参就可以自动运行该用例了。代码如下 代码中演示了2种引入fixture的方式
-   第一种:直接将fixture的函数名作为参数传递给测试用例
-   第二种:使用pytest.usefixtures()进行调用

import pytest

class TestCase:
    @pytest.fixture()
    def login(self):
        print("\n登录\n")
        yield
        print("\n登出\n")

    def test_1(self,login):
        print("\ntest 1\n")

    @pytest.mark.usefixtures('login')
    def test_2(self):
        print("\ntest 2\n")

运行结果如下

image.png

7、fixture之ids用法

ids需要配合params一起使用 代码如下所示

import pytest




@pytest.fixture( params=[1,2,3,4],ids=['one','two','three','four'])
def demo(request):
    return request.param

def test_f(demo):
    print("{}".format(demo))

运行结果如下所示 image.png

8、fixture之name用法

相当于给函数起别名,当取了别名之后,原来函数名就调用不了 代码如下

import pytest


@pytest.fixture( params=[1,2,3,4],ids=['one','two','three','four'],name='bieming')
def demo(request):
    return request.param

def test_f(bieming):
    print("{}".format(bieming))

运行结果如下

image.png