[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)