pytest学习笔记

一、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路径原来的报告

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值