pytest

Posted minghong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest相关的知识,希望对你有一定的参考价值。

 1. Pytest介绍
基于unittest之上的单元测试框架
(1)、自动发现测试模块和测试方法
(2).断言使用assert达式可
(3).可以设置会话(从运行所有用例开始用例结束)级 ,模块( .py)级,类级(setupClass/teardownclass) ,函数(测试用例)级的fixtures,
数据佳备清理工作
(4)、有丰富的插件, 388+以上。==allure
(5)、测试用例不定要放在测试类当中。
        安装命令: pip install pytest
        安装htm1报告插件: pip install pytest-html
pytest插件地址: http://plugincompat . herokuapp. com/pytest
收集测试用例的规则:
(1)、默认从当前目录中收集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索;
(2). 控索规则
a.符合命名规则,test *.py或者* test.py的文件;b.以test.开头的函数名
C.以Test开头的测试类,(没有init_ 函数)当中,以test开头的函数
断言使用基本的assert即可;Pytest的特点:
1.简单灵活,容易上手,文档丰富;
2.支持参数化,可以细粒度地控制要测试的测试用例;
3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appniun等自动化测试
接口自动化测试( pytest+requests ) ; :
4、pytest具有很多第 三方插件,并且可以自定义展,比较好用的如pytest- selenium (集成selenium )、
pytest-html (完美htm1测试报告生成)、pytest-rerunfailures (失败case重复执行)、pytest-xdist (多CPU分发)等;5、测试用例的skip和xfail处理
6.可以很好的和CI工具结合,例jenkins

2. pytest之 mark功能
1、mark机制 4.6
1、先注册 pytest.ini [pytest] markers=标签名:说明
2、去给用例打标签
@pytest.mark.已注册的标签名

测试类和模块: 类下面设置类属性值,模块下面设置全局变量。
pytestmarker=pytest.mark.已注册的标签名
多个标签:pytestmarker=[pytest.mark.已注册的标签名,pytest.mark.已注册的标签名]
3. pytest之命令运行用例(pass)
4. pytestzfixture功能
1、定义fixture
1.1创建了一个conftest. py文件
1.2在conftest中,创建fixture
1.3定义函数,函数前面加上@pytest. fixture(scope=作用域)
函数内部: yield隔开前器后后置的代码,之前是前,之后是后置
yield返回值(后面跟上返回值用于调用,有多个返回值用元组)

2、 调用fixture
在测试用例测试类前面加上( @pytest . mark.usefixtures(" fixture对应的函数名称") )
fixture对应的函数名称=它的返回值
fixture对应的函数名称作为测试用例的参数,将返回值传给测试用例

3. fixture暂不支持与unittest同用 ,断言都用assert 
 fixure 在conftest.py当中,定义的时候,就已经决定了他的用例域,决定了它的命运。
 fixture可以有很多个。

无论在测试类、测试用例去主动调用fixture,都不能够改变它的命运。
 调用就是决定在哪儿去使用它。在哪个测试类?
 例子:宫廷剧:一等丫环,二等丫环,基层丫环
景仁宫、阿哥宫、净身房,慎刑司

pytest的用例执行顺序:
基本原则:按照搜索规则,先匹配到的先执行。
1、文件名称:按名称名称顺序去搜索。先找到的,先去内部找用例。
2、在py文件内部:按照代码顺序去找用例。先找到的先执行。
4.pytest之fixture参数化-多运行,pytest层级要盖测试用例与其同级或者在其子目录
5. fixture的scope参数scope参数有四种,分别是function‘, module , ‘class‘ , ‘session ,默认为function,
function:每个test都运行,默认是function的scope
class :每个class的所有test只运行一次
module :每个module的所有test只运行一次
session :每个session只运行一次
 2、fixture
定义 == 定命运。session:皇帝 modle:贵妃 class:公主/太子 function:官员
调用 == 你准备把它在哪儿用?
session:整个会话都有效。整个皇宫,圣旨。
module:模块内有效。XX宫,宫内有效。
class:类内有效。
function:测试用例内有效。
conftest.py文件。 === 定义多个fixture.
 
5. setup和teardown操作
setup ,在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等teardown ,在测试函数或类之后执行,
完成收尾工作,例如断开数据库链接、回收内存资源等注:也可以通过在f ixture函数中通过yield实现setup和teardown功能

6参数化 ddt 参数名 = 用例的参数名称
# @pytest.mark.parametrize("参数名",列表)
# @pytest.mark.parametrize("参数1,参数2",[(数1,数2),(数1,数2)])

# 排列组合。多个参数的值排列组合。在一个用例前面 ,使用多个@pytest.mark.parametrize
示例:用例有4个:0,2/0,3/1,2/1,3
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
pass


7、测试报告 = junitxml,html,allure
# allure测试报告
https://docs.qameta.io/allure/#_pytest
7.1、先装插件
7.2、命令行的参数:
--html=相对路径/report.html # 相对于pytest命令运行时,所在的根目录。
--alluredir=相对路径

7.3、安装allure命令行工具:下载,解压,配置环境变量
4、生成allure文件之后,用命令:allure serve alluredir

# os.system("") python调用命令行


# allure与jenkins的集成、重运行机制、pytest中的失败截图。








以上是关于pytest的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins集成Allure报告

Python+pytest知识点回顾

不能在Python Console中运行pytest

起飞!这份技术点拉满的 “测试自动化最佳Python框架 ” 技术进阶精编笔记!对你应该很有帮助