pytest测试框架
前言:pytest是 python 的第三?单元测试框架
前言
提示:仅供参考 如有问题请留言
一、环境搭建
?先使? pip 安装 pytest
pip install pytest
pip install pytest-html
pip show pytest
二、使? pytest 执?测试需要遵?的规则
1.py测试文件必须以test_开头或者以_test结尾
2.测试类必须以Test开头,并且不能有init方法
3.测试方法必须以test_开头
4.断言使用assert
代码如下(示例):
"""
需求:断言预期结果与实际结果是否一致
分析需求:
1-需要拿到实际结果
2-需要取到预期结果
3-断言两方结果的一致
4-断言失败 需抛出异常
解决方案:
1-需要pytest框架中mark装饰器的parametrize做数据驱动
2-调用业务层中的login获取到实际结果
3-调用方法包中的excel
4-断言失败:需要进行try except 封装,避免在每个接口中重复使用try excpet
"""
import pytest
from utils.handle_yml import getYamlCase
from utils.handle_path import case_tmsLoginPath
from utils.handle_path import tmsConfig_path
from libs.login import Login
from common.baseAPI import apiAssert
getyamlcase = getYamlCase(case_tmsLoginPath,'loginIn')
class TestLogin:
@pytest.mark.parametrize('title,inData,expData',getyamlcase)
def test_login(self,title,inData,expData):
res = Login(filePath=tmsConfig_path).loginIn(inData)
apiAssert.get_api_assert(res,expData)
if __name__ == '__main__':
pytest.main(['test_tmsLogin.py','-s'])
三、pytest中的四种setup和teardown
1、setup_method和teardown_method在class内的每个?法运?前后运?;
2、setup_function、teardown_function则是在?class下的每个测试?法的前后运?;
3、setup_class和teardown_class则在整个?件中的?个class中所有?例的前后运?;
4、setup_module和teardown_module在整个测试?例所在的?件中,所有的?法运?前和运?后运?,只运??次;
执?:pytest test_login.py -s '-s 输出print信息'
四、pytest 环境初始化与数据清除
4.1 fixture 源码详解
fixture(scope='function',params=None,autouse=False,ids=None,name=None):
1.scope:有四个级别参数"function"(默认),"class","module","session"
2.params:?个可选的参数列表,它将导致多个参数调?fixture功能和所有测试使?它。
3.autouse:如果True,则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture
4.ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的?部分。如果没有提供ID它们将从params?动?
5.name:fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的统?模块中使?,夹具的功能名称将被请求夹具的功
问题的?种?法时将装饰函数
4.2 fixture 的作用范围
fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function
1. session 会话级别:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
2. module 模块级别:每一个.py文件调用一次,该文件内又有多个function和class
3. class 类级别:每一个类调用一次,一个类中可以有多个方法
4. function:默认模式,每一个函数或方法都会调用
4.3 调用fixture 的三种方法
1、函数或类???法直接传fixture的函数参数名称
@pytest.fixture()
def test1():
print('开始执?function')
def test2(test1):
print('---?例test2执?---')
2、使?装饰器@pytest.mark.usefixtures()修饰需要运?的?例
import pytest
@pytest.fixture()
def test1():
print('\n开始执?function')
@pytest.mark.usefixtures('test1')
def test_a():
print('---?例a执?---')
3、叠加usefixtures
如果?个?法或者?个class?例想要同时调?多个fixture,可以使?@pytest.mark.usefixture()进?叠加。注意叠加顺序,先执? 上层。
@pytest.fixture()
def test1():
print('开始执?function1')
@pytest.fixture()
def test2():
print('开始执?function2')
@pytest.mark.usefixtures('test1')
@pytest.mark.usefixtures('test2')
def test_a():
print('---?例a执?---')
3.1、usefixtures与传fixture区别
1. 如果fixture有返回值,那么usefixture就?法获取到返回值,这个是装饰器usefixture与?例直接传fixture参数的区别。
2. 当fixture需要?到return出来的参数时,只能将参数名称直接当参数传?,不需要?到return出来的参数时,两种?式都可以。
3.2、fixture?动使?autouse=True
1. 当?例很多的时候,每次都传这个参数,会很麻烦。fixture??有个参数autouse,默认是False没开启的,可以设置为True开启?
样?例就不?每次都去传参了
2. autouse设置为True,?动调?fixture功能
|