1、pytest简介
Pytest作为一种自动化框架,由于是由unittest框架继承而来,因此它的易用性和扩展性比较好,并且向下兼容unittest,成为目前主流的测试框架之一原因如下:
- 简单灵活,容易上手
- 支持jenkins持续集成(CI)
- 支持allure报告输出
- 支持参数化,重复执行(pytest-repeat框架),部分执行,测试跳过(skip)
- 第三方插件丰富,良好的自定义扩展性
- 简单的断言表达:assert 表达式即可
2、pytest的使用
①.用例设计原则
- pytest文件名以test开头(也可以以test结尾):testcase.py或casetest.py
- 类以Test开头,且类中不能含有init方法:class Testcase:
- 函数或方法以test开头:def tesstcase():
- assert进行断言:assert resp['code']==exception['code']
②.装饰器——数据驱动@pytest.mark.parmeterize((),[(),(),...])
list1=[(用例字段参数a1,用例字段参数b1,用例预期结果),(用例字段参数a2,用例字段参数b2,用例预期结果),(用例字段参数a3,用例字段参数b3,用例预期结果)]
@pytest.mark.parmeterize('a,b,exception',list1)
def test_a(self,a,b,exception):
resp=request.post(a,b)
assert resp['code']==exception['code']#断言
③.装饰器——初始化环境与数据清除@pytest.fixture()
fixture是由uinittest的setup/teardown改进而来,声明下面的函数是setup函数(case前执行),yield后相当于teardown函数(case后执行),yield 放函数返回值,类似于return,然后再执行后面代码;scope参数控制fixture的作用范围,scope缺省值是function。
scope的作用范围:session>module>class>function
- function:该方法/函数调用
- class:该类调用,一个类包含多个方法
- module:该.py文件调用,.py文件内有多个class或function
- session:该目录下.py文件调用,该目录下有多个.py文件,一个.py文件基于是一个module
import pytest
@pytest.fixture(scope='class')
def class1():
print('相当于setup_class函数!')
yield
print('相当于teardown_class函数!')
注意事项:
- fixture命名不要以test开头,跟用例区分开;
- 一个fixture可以多个函数来使用;
- fixture之间可以相互调用;
- 一个方法可以有多个fixture;
- 调用fixture的返回值,直接就是把fixture的函数名称当做变量名称;
import pytest
@pytest.fixture(scope='session')
def getcookies():
cookie1='alksdfjaslhfdoquser192374913i2hroiashefoi7y12983yredhiu hweaieyr718273ylyhkashdflksa98243ui'
yield cookie1
@pytest.fixture(scope='session')
def shop_init(getcookies):
print(getcookies)#打印出'alksdfjaslhfdoquser192374913i2hroiashefoi7y12983yredhiu hweaieyr718273ylyhkashdflksa98243ui'
yield getcookies
④.全局配置文件——conftest.py
conftest.py 这个文件可以实现数据共享,不需要import就能自动找到一些配置,可供多个py文件调用,用来支持全局的共享前置后置。
注意事项:
1、conftest.py文件名字是固定的,不可以做任何修改;
2、文件和用例文件在同一个目录下,那么conftest.py作用于整个目录,如果下级目录存在conftest.py文件,则就近使用conftest.py;
3、conftest.py文件所在目录必须存在__init__.py文件;
4、conftest.py文件不能被其他文件导入;
5、所有同目录测试文件运行前都会执行conftest.py文件。