-
pytest 是一个使构建简单和可伸缩的测试变得容易的框架。
-
测试具有表达性和可读性,不需要样板代码。
几分钟后就可以开始对应用程序或库进行小的单元测试或复杂的功能测试。
-
拥有成熟的第三方插件。
1、在同一级别目录创建requirements.txt写入所需要第三方插件及pytest同时部署安装
pytest #pytest
pytest-html #简易的报告
pytest-xdist #多线程执行
pytest-ordering #修改测试用例的执行顺序
pytest-rerunfailures #失败用例重跑
pytest-base-url #管理基础路径:测试环境、生产环境、线上环境
allure-pytest #生成allure报告
2、执行:
$ pip3 install -r requirements.txt
3、验证是否成功:
$ pytest --version # 查看版本
pytest 7.1.1
$ pytest --trace-config . # 查看pytest插件
pytest框架应用流程:
1、发现case
2、执行case
3、断言结果
4、测试报告
(1).py测试文件必须以“test_”开头(或“test”结尾)
(2)测试类必须以Test开头,并且不能有init方法
(3)测试用例必须以“test”开头
(4)断言必须使用assert
写一个例子:
在项目目录下写一个test_pytest.py文件,内容如下:
class Test_Api:
def test_01_useradd(self):
print("case1:添加用户")
def test_02_del(self):
print("case2:删除用户")
def test_02_login(self):
print("case3:登陆用户")
pytest运行方式:
命令行:
$ pytest test_pytest.py #不带任何参数运行
$ pytest -vs test_pytest.py
$ pytest -vs -n 3 test_pytest.py
$ pytest -vsx test_pytest.py
$ pytest -vs --maxfail 1 test_pytest.py
$ pytest -vs --maxfail 1 --html=./html/test_api.html test_pytest.py
$ pytest -vs -k "01" test_pytest.py
常见参数:
-v:打印详细信息
-s:打印调试信息
-n:多线程运行,比如3个线程并行执行,一次执行3条case
-x: 从上到下执行case,一旦出现一次错误立刻终止执行
--maxfail: 最大运行出现N次错误,达到N次错误终止执行
--html: 生成简易的测试报告
-k: 只运行包含01的case
$ pytest -vs ./test_api 以模块运行
$ pytest -vs ../test_project 以项目目录运行
nodeid运行指定某一条case,通过::分割
$ pytest -vs test_api/test_pytest.py::Test_Api::test_01_useradd
主函数:
可以选在项目目录或者模块下创建一个run.py的文件,作用域具体看你创建的位置
import pytest
if __name__ == '__main__':
pytest.main(['--html=./html/h5.html']) #['-vs']参数
pytest.main(['-vs'])
全局设置
pytest.ini:
在项目目录下创建一个pytest.ini代表pytest的配置文件,后续不管是pytest命令行、主函数方式运行,默认的参数都是读取pytest.ini这个文件。
[pytest] #声明这是pytest的配置文件
addopts = -vs #指定命令行默认参数,多个空格分割
python_files = test_*.py #指定测试文件的默认读取规则,以test_开头
python_classes = Test* #指定测试查找class类的默认读取规则,以Test开头
python_functions = test* #指定测试用例的默认读取规则,以test开头
testpaths = testcases #指定用例查找的文件夹
markers = L1 #自定义标签,通过-m '标签',运行包含标签的测试用例
L2
注意事项:
- 第一行必须是[pytest]
- 文件名称必须是pytest.ini
- 文件内不能包含中文
默认定义测试模块的顺序,按照模块下的用例顺序从上往下进行执行
如何指定case执行的顺序?
通过函数装饰器的⽅式,标记被测试函数来决定用例执⾏的顺序,需要使用pytest-ordering
插件。
安装⽅式:pip install pytest-ordering
import pytest
class Test_Api:
@pytest.mark.run(order=2)
def test_01_useradd(self):
print("case1:添加用户")
@pytest.mark.run(order=1)
def test_02_del(self):
print("case2:删除用户")
@pytest.mark.run(order=3)
def test_02_login(self):
print("case3:登陆用户")
pytest测试用例自定义标签
对测试用例自定义优先级,通过@pytest.mark.标签
@pytest.mark.标签
import pytest
class Test_Wx_Api:
@pytest.mark.L1
@pytest.mark.L2
@pytest.mark.L3
def test_useradd(self):
print("创建用户:admin")
@pytest.mark.L2
def test_user_login(self):
print("登陆用户:admin")
@pytest.mark.L3
def test_user_del(self):
print("删除用户:admin")
通过-m来指定标签运行:
$ pytest -m 'L3' #运行L3级别的测试用例
pytest测试用例的跳过
为神马要跳过部分case,在测试的过程中,会遇到部分的case阻塞,可能是环境问题,或者功能暂时未实现,而去略过。
这时候我们就需要对case进行跳过。
在pytest中我们通过skip、skipif
无条件跳过
@pytest.mark.skip(print("此功能下线,跳过此case"))
判断跳过
@pytest.mark.skipif(age <= 18, reason="青少年跳过")
import pytest
userdel = True
class Test_Api:
# @pytest.skip(print("跳过整个模块"))
@pytest.mark.skip(print("此功能为实现,先跳过"))
def test_01_useradd(self):
print("case1:添加用户")
@pytest.mark.skipif(userdel != True, reason = "userdel为true跳过")
def test_02_del(self):
print("case2:删除用户")
def test_02_login(self):
print("case3:登陆用户")
pytest的前后置
1、setUp()和tearDown()函数介绍
之前学过Unittest
测试框架,知道前置setup()
函数和后置teardown()
函数非常好用,在每次用例开始前和结束后都去执行一次。
当然还有更高级一点的setupClass()
函数和teardownClass()
函数,需配合classmethod
装饰器一起使用,在做Selenium自动化的时候,它的效率尤为突出,可以只启动一次浏览器执行多个用例。
2、setUp()和tearDown()函数作用
setup()
函数主要是进行测试前的初始化工作,比如:在接口测试前面做一些前置的参数赋值,数据库 *** 作等等。teardown()
函数是测试后的清除工作,比如:参数还原或销毁,数据库的还原恢复等。
总结:setup()
函数表示测试类中每个测试方法执行前都需要执行的 *** 作,teardown()
函数表示每个测试方法执行后都需要执行的 *** 作。
3、Pytest框架的setUp()和tearDown()
Pytest框架也有前置setup()
函数和后置teardown()
函数,并且还不止四个。
Pytest框架setUp()
函数和tearDown()
函数主要分为:模块级,类级,方法级,函数级。
说明每个级别的含义:
模块级:指的是一个`.py`文件。
类级:一个`.py`文件中可以写多个类。
(一般情况下只写一个类)
方法级:类中定义的方法叫方法。
函数级:类外定义的方法叫函数。
Pytest框架提供的setUp()
函数和tearDown()
函数如下:
模块级与函数级,不定义在测试类中。
- 模块级:
setup_module()/teardown_module()
:开始于模块始末,全局的。 - 函数级:
setup_function()/teardown_function()
:只对函数用例生效(不在类中)。
类级与方法级,定义在类中
- 类级:
setup_class()/teardown_class()
:只在类中前后运行一次(在类中)。 - 方法级:
setup_method()/teardown_method()
:开始于方法始末(在类中)。 - 自由的:
setup()/teardown()
:直接使用感觉和方法级前后置函数一样。
import pytest
userdel = True
import time
class Test_Api:
def setup_class(self):
print("类前置")
def teardown_class(self):
print("类后置")
@pytest.mark.skip(print("此功能为实现,先跳过"))
def test_01_useradd(self):
print("case1:添加用户")
@pytest.mark.skipif(userdel != True, reason="userdel为true跳过")
def test_02_del(self):
print("case2:删除用户")
def test_02_login(self):
print("case3:登陆用户")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)