ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] pytest支持以xUnit格式型的测试模型(setup/teardown),但还与python自带的unittest还是有一点差别,如下 * 模块形式----使用setup\_module/teardown\_module   * 函数形式----使用setup\_function/teardown\_function * 类形式----使用setup\_class/teardown\_class * 方法形式---使用setup\_method/teardown\_method **注意:** **1.pytest也可以直接运行unittest模式的测试用例** **2.如果你在pytest模式中使用setupClass()函数是不行的,不会识别,但如果用例类继承之unittest.Testcase,还是可以识别的** <br> <br> ## 1、fixture scope的范围参数 之前使用@pytest.fixture(scope='module')来定义框架,scope的参数有以下几种 *  function   每一个用例都执行 * class        每个类执行 * module     每个模块执行(函数形式的用例) * session     每个session只运行一次,在自动化测试时,登录步骤可以使用该session <br> <br> ## **2、调用fixture的三种方法** <br> <br> ### **2.1函数或类里面方法直接传fixture的函数参数名称** ~~~ from __future__ import print_function import pytest @pytest.fixture(scope='module') def resource_a_setup(request): print('\nresources_a_setup()') def resource_a_teardown(): print('\nresources_a_teardown()') request.addfinalizer(resource_a_teardown) def test_one(resource_a_setup): print('test_one()') def test_tow(): print('\ntest_tow()') def test_three(resource_a_setup): print('\ntest_three()') ~~~ 使用-s -v运行查看结果 ![](https://img.kancloud.cn/9d/ad/9dad1c3f1e234087bfe491b94c64d490_1406x441.png) <br> <br> ### **2.2@pytest.mark.usefixtures()** **2.2使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例** ~~~python import pytest @pytest.fixture() def test1(): print('\n开始执行function') @pytest.mark.usefixtures('test1') def test_a(): print('---用例a执行---') @pytest.mark.usefixtures('test1') class TestCase: def test_b(self): print('---用例b执行---') def test_c(self): print('---用例c执行---') if __name__ == '__main__': pytest.main(['-s', 'pytest_test.py']) ~~~ ![](https://img.kancloud.cn/08/da/08da2ae12185857a67f7ae002157e6ce_927x316.png) <br> <br> ### 2.3**叠加usefixtures** 如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixture()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层 ~~~ import pytest @pytest.fixture() def test1(): print('\n开始执行function1') @pytest.fixture() def test2(): print('\n开始执行function2') @pytest.mark.usefixtures('test1') @pytest.mark.usefixtures('test2') def test_a(): print('---用例a执行---') @pytest.mark.usefixtures('test2') @pytest.mark.usefixtures('test1') class TestCase: def test_b(self): print('---用例b执行---') def test_c(self): print('---用例c执行---') if __name__ == '__main__': pytest.main(['-s', 'pytest_test.py']) ~~~ ![](https://img.kancloud.cn/a5/52/a55209dcdafc4410b4eb774d41d708a9_859x460.png) <br> <br> ## 3.**usefixtures与传fixture区别** 如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。 当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。 <br> <br> ## **4.fixture自动使用autouse=True** 当用例很多的时候,每次都传这个参数,会很麻烦。fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了 autouse设置为True,自动调用fixture功能 ~~~ import pytest @pytest.fixture(scope='module', autouse=True) def test1(): print('\n开始执行module') @pytest.fixture(scope='class', autouse=True) def test2(): print('\n开始执行class') @pytest.fixture(scope='function', autouse=True) def test3(): print('\n开始执行function') def test_a(): print('---用例a执行---') def test_d(): print('---用例d执行---') class TestCase: def test_b(self): print('---用例b执行---') def test_c(self): print('---用例c执行---') if __name__ == '__main__': pytest.main(['-s', 'pytest_test.py']) ~~~ <br> <br> ## **5.conftest.py的作用范围** 一个工程下可以建多个conftest.py的文件,一般在工程根目录下设置的conftest文件起到全局作用。在不同子目录下也可以放conftest.py的文件,作用范围只能在改层级以及以下目录生效。 **项目实例:** **目录结构:** ![](https://img2018.cnblogs.com/blog/1353157/201901/1353157-20190130163615412-1577295980.png) ### 5.1conftest在不同的层级间的作用域不一样 ~~~ import pytest @pytest.fixture(scope='session', autouse=True) def login(): print('----准备登录----') # conftest层级展示/sougou_login/conftest import pytest @pytest.fixture(scope='session', autouse=True) def bai_du(): print('-----登录百度页面-----') # conftest层级展示/sougou_login/login_website import pytest class TestCase: def test_login(self): print('hhh,成功登录百度') if __name__ == '__main__': pytest.main(['-s', 'pytest_test.py']) ~~~ <br> <br> ### 5.2conftest是不能跨模块调用的(这里没有使用模块调用) ~~~python import pytest @pytest.fixture(scope='function', autouse=True) def log_web(): print('打印页面日志成功') # conftest层级演示/log/log_website.py import pytest def test_web(): print('hhh,成功一次打印日志') def test_web1(): print('hhh,成功两次打印日志') if __name__ == '__main__': pytest.main(['-s', 'pytest_test.py']) ~~~ ![](https://img.kancloud.cn/22/67/2267be6708aea4ca3c41380ff5e95e15_846x279.png)