一、pytest特点与优点
1、成熟的测试框架,比unittest更灵活
2、可实现跳过和rerun失败用例重试
3、和allure生成美观的测试报告
4、和jenkins持续集成
5、有很多插件
二、安装插件
1、常用插件:
pytest
pytest-html:生成html格式自动化测试报告
pytest-xdist:测试用例分布式执行,多CPU分发
pytest-ordering:改变测试用例的执行顺序(默认顺序是从上倒下)
pytest-rerunfailures:用例失败后重跑
allure-pytest:生成美观的测试报告
2、批量安装
将所有要安装的插件写进requirements.txt(存放在项目的根目录)中,然后terminal中执行
pip install -r requirements.txt
注意:在terminal中安装插件是局部的,在cmd里安装是全局的
三、使用pytest默认的测试用例规则
1、模块名必须以test_开头或_test结尾
2、测试类必须以Test开头,且不能有init方法
3、测试方法必须以test开头
四、pytest测试用例的运行方式
1、主函数运行
1)运行所有:pytest.main()
2)指定模块:pytest.main([‘-vs’, ‘test_login.py’])
3)指定目录:pytest.main([‘-vs’, ‘./interface_testcase’])
4)通过nodeId指定用例运行:nodeId由模块名,分隔符,类名,方法名,函数名组成
pytest.main([‘-vs’, ‘./interface_testcase/test_interface.py::test_04_func‘])---->指定函数
pytest.main([’-vs’, './interface_testcase/test_interface.py::TestInterface:test_03])---->指定方法
2、命令行模式
1)运行所有:pytest
2)指定模块:pytest -vs test_login.py
3)指定目录:pytest -vs ./interface_testcase
4)通过nodeId指定用例运行:nodeId由模块名,分隔符,类名,方法名,函数名组成(和主函数运行相同)
pytest -vs ./interface_testcase/test_interface.py::test_04_func
以上2种执行都可携带参数,参数详解如下:
-s:输出调试信息,包括print
-v:显示更详细信息,包括用例名称
-vs:以上2个参数一起使用
-n:支持多线程火花则分布式运行测试用例
–reruns NUM:失败用例重跑
-x:只要有一个用例失败,就测试停止
–maxfail=2:出现2个用例失败就停止
-k:根据测试用例的部分字符串指定测试用例
如:
pytest -vs ./interface -k "ao"
–html ./report/report.html:生成html的测试报告(用的少)
3、通过读取pytest.ini配置文件运行
这种运行方式才是最常用的。pytest.ini这个文件是pytest单元测试框架的核心配置文件
1)位置:项目的根目录,名字必须是pytest.ini
2)编码:必须是ANSI,可以使用notepad++修改编码格式
3)作用:改变pytest默认的行为
4)运行规则:不管是主函数运行还是命令行运行,都会读取这个配置文件
5)配置内容
[pytest]
#命令行参数
addopts = "-vs"
#测试用例文件夹,可自己配置
testpaths = "./case_api"
#配置测试搜索的模块文件名称
python_files = "api*.py"
#配置测试搜索的测试类名
python_classes = "Aaa"
#配置测试搜索的测试函数名
python_functions = "cc"
markers =
smoke:冒烟测试用例
usermanage:用户管理模块测试用例
product:商品模块
说明:
addopts:主要用来配置运行用例时,查看cesa的一些配置参数,我这里设置的是 “vs”,那么在执行时,就会默认加上-vs参数
五、pytest执行测试用例的顺序
unittest是按照ascii的大小来绝对执行的
pytest默认是从上到下
改变默认的执行顺序:使用mark装饰器
@pytest.mark.run(order=1)
六、如何分组执行(冒烟,分模块,web,接口)
smoke:冒烟用例,分布在各个模块里面
pytest -m "smoke"只执行smoke用例
pytest -m “smoke or usermanage” 执行smoke和usermanage 用例
七、pytest跳过测试用例
1、无条件跳过
@pytest.mark.skip(reason="be abroad")
2、有条件跳过
age = 19
......
@pytest.mark.skip(age>=18,reason='age is big')
八、前后置处理,常用三种
1、setup/teardown:在每条用例前后执行一次。
应用场景:打开浏览器
setup_class/teardown_class:在类的前后执行一次
应用场景:创建日志对象,创建数据库连接,创建接口的请求对象
注意:setup/teardown,setup_class/teardown_class都是小写,与unittest不一样
2、使用fixture装饰器(最好的方式)来实现部分/全部用例的前后置
@pytest.fixture(scope="",params="",autouse="",ids="",name="")
fixture共有5个参数,说明如下:
scope:作用域,作用于function(默认),class,module,package/session
params:参数化,支持列表[],元组(),字典列表[{},{},{}],字典元组({},{},{})
autouse=True:自动使用,默认是False
ids:当使用params参数化时,给每一个值一个变量名,意义不大。
name:给标记的方法取个别名,意义不大
@pytest.fixture(scope='function')
#前后置方法作用test02方法前后
def my_fixture():
print('这是前置方法')
yield
print('这是后置方法')
class Testlogin:
def test_01(self):
print('test01')
def test_02(self, my_fixture):
print('test02')
如果这样写,就会全部方法执行,且test02不需要引用
@pytest.fixture(scope='function', autouse='True')
#前后置方法作用所有方法前后
def my_fixture():
print('这是前置方法')
yield
print('这是后置方法')
class Testlogin:
def test_01(self):
print('test01')
def test_02(self):
print('test02')
参数化示例:,test_02会执行根据参数执行3次,调试窗口中每个参数别名分别为l,j , r
@pytest.fixture(scope='function', params=['lily','jam','rose'],ids=['l','j','r'])
#前后置方法作用所有方法前后
def my_fixture(request):
print('这是前置方法')
#注意:yield和return不能同时使用。yield是暂停,会执行后面的代码,return是结束,不会执行后面的代码
yield request.param
print('这是后置方法')
#下面这行是固定写法,param后面不用加s
#return request.param
class Testlogin:
def test_01(self):
print('test01')
def test_02(self,my_fixture):
print('test02')
names示例:改成aaa,当取了别名之后,原来的名字用不了
@pytest.fixture(scope='function', params=['lily','jam','rose'],ids=['l','j','r'],names='aaa')
def my_fixture(request):
print('这是前置方法')
yield request.param
print('这是后置方法')
class Testlogin:
def test_01(self):
print('test01')
def test_02(self,aaa):
print('test02')
3、通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局处理)
1)conftest.py是单独存放的一个夹具配置文件,名称是固定的,不可修改
2)可以在不同的py文件中中使用同一个fixture函数
3)原则上conftest.py需要和运行的用例放到同一层,且不需要做任何的import导入操作
总结:
1、setup/teardown作用于所有用例或所有类
2、@pytest.fixture()既可以部分,也可以全部前后置
3、conftest.py和@pytest.fixture()结合使用,作用于全局的前后置(可以有多个conftest,引用fixture时可以写多个,注意前后顺序)
九、断言
assert
十、pytest结合allure-pytest生成allure测试报告
1、加入命令生成json格式的临时报告
–alluredir ./temp
2、生成allure报告
os.system('allure generate ./temp -o ./report --clean')
allure generate 命令,固定的
./temp 临时的json格式报告的路径
-o 输出
./report 生成allure报告的路径
–clean 清空./report路径原来的报告