今天总结下pytest,pytest简直就是python自动化中的高富帅,各种操作,哈哈
这次总结主要涉及到了以下几点:
1、unittest中的setUp、tearDown、setUpClass、tearDownClass
2、pytest中的前置后置如何表达
3、pytest中的前置后置的级别如何区分
4、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中的前置后置的级别如何区分
查看源码可以看出这个fixture函数存在scope这个参数,这个参数是确定这个前置后置的级别,pytest中前置后置的界别分为函数级别、类级别、模块级别、会话级别,当然我们常用的还是类级别和函数级别
4、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"])