首页 > 技术文章 > pytest_前置后置

Pycainiao 2019-12-12 10:57 原文

今天总结下pytest,pytest简直就是python自动化中的高富帅,各种操作,哈哈

这次总结主要涉及到了以下几点:

1、unittest中的setUp、tearDown、setUpClass、tearDownClass

2、pytest中的前置后置如何表达

3、如何将前置后置和用例关联

4、pytest中的前置后置的级别如何区分

5、pytest中的前置后置“继承”关系,如何继承

简单总结下pytest的前置后置吧,pytest的前置后置非常简单,但是不同于unittest的前置后置,首先回顾下

1、unittest中的setUp、tearDown、setUpClass、tearDownClass

  在unittest中的前置后置有明确的格式,看如下代码

import unittest


class MyTestCase(unittest.TestCase):

    def setUp(self):
        print("我是set_up")

    def tearDown(self):
        print("我是teardown")

    def test_1(self):
        print("我是测试用例1")

    def test_ha(self):
        print("我说测试用例2")


if __name__ == '__main__':
    unittest.main()

可以得出结论,以下是运行结果:

 

 unittest的前置必须是放在setUp里面,后置必须是放在tearDown里面,这个是有明确的格式的

当然了,setUp、tearDown是用例级别的,unittest还有类界别 的,请看如下代码

import unittest


class MyTestCase(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("我是setupclass")

    @classmethod
    def tearDownClass(cls):
        print("我是teardownclass")

    def test_1(self):
        print("我是测试用例1")

    def test_ha(self):
        print("我说测试用例2")


if __name__ == '__main__':
    unittest.main()

结果如下:

 

 可以看出setUpClass和tearDownClass都是在这个测试类只运行一次的

 

 

说了这么多,还是言归正传,说下pytest的前置后置

2、pytest中的前置后置如何表达

  pytest的前置后置只用一个函数就可以解决

import pytest


@pytest.fixture
def iniy():
    print("我是前置")
    yield
    print("我是后置")


@pytest.mark.usefixtures("iniy")
class TestCase:

    def test_1(self):
        print("我是测试用例1")

    def test_ha(self):
        print("我说测试用例2")


if __name__ == '__main__':
    pytest.main(["test.py"])

上面代码中的iniy函数就是一个前置后置,只需要加上一个装饰器(pytes.fixture)即可,

 

3、如何将用例与前置后置关联

  设置了前置后置之后,用例如何引用?

 @pytest.mark.usefixtures("init_driver")
    def test_name_null_login(self, init_driver):
        """
        用户名为空

        """
        init_driver[1].login(test_login_datas.login_name_null_data["name"], test_login_datas.login_name_null_data["passwd"])
        assert(init_driver[1].error() == test_login_datas.login_name_null_data["expect"])

上面代码中标记的部分就是引用前置后置的方式,置于为什么用例需要传递参数?

r

4、pytest中的前置后置的级别如何区分

  查看源码可以看出这个fixture函数存在scope这个参数,这个参数是确定这个前置后置的级别,pytest中前置后置的界别分为函数级别、类级别、模块级别、会话级别,当然我们常用的还是类级别和函数级别

 

5、pytest中的前置后置“继承”关系,如何继承

  pytest中的前置后置还可以共用,类似于类的“继承”,当然这个也是需要固定的用法

如果要实现公用的前置后置,那么需要将这个前置后置放到指定的文件中去------conftest.py

当然这个继承关系也是有要求的:低级别可以继承高级别,高级别不能继承低级别

  举个栗子:函数级别的可以继承函数级别及更高的级别,但是类级别不能继承函数级别

# -*- coding:utf-8 -*-
"""
File Name: conftest
"""
import pytest


@pytest.fixture(scope="class")
def ini():
    print("我是类前置")
    yield 2
    print("我是类后置")


@pytest.fixture
def init(ini):
   pass

以上脚本可以看出init这个前置后置继承了ini这个类级别的前置后置,那么我们在下面脚本中直接调用这个init前置后置看看结果如何

import pytest


@pytest.fixture()
def iniy():
    print("我是前置")
    yield
    print("我是后置")


@pytest.mark.usefixtures("init")
class TestCase:

    def test_1(self):
        print("我是测试用例1")

    def test_ha(self):
        print("我说测试用例2")


if __name__ == '__main__':
    pytest.main(["test.py"])

推荐阅读