pytest简介:
pytest 是 python 的第三方单元测试框架,比自带的 unittest 更简洁和高
效,同时兼容 unittest 框架。它还有如下优点:
1、简单灵活,容易上手,文档丰富;
2、支持参数化,可以细粒度地控制要测试的测试用例;
3、能够支持简单的单元测试和复杂的功能测试,还可以用来做
selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytestselenium(
集成selenium)、pytest-html(完美html测试报告生成)、
pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
5、测试用例的skip和xfail处理;
6、可以很好的和CI工具结合,例如jenkins。
pytest是python的一个第三方类库,可以直接使用pip install pytest 在线
安装,或者下载离线包安装。
pytest测试用例编写规则:
1、测试文件以test_开头(以_test结尾也可以)
2、测试类以Test开头,并且不能带有 init 方法
3、测试函数以test_开头
4、断言必须使用 assert
fixture方法详解:
fixture(callable_or_scope=None,*args,scope="function",params=None,aut
ouse=False,ids=None,name=None):
scope: 作用范围,设置范围后,会根据设置的范围去触发执行。范围可选值:
function:每个方法(函数)都会执行一次。(默认)
class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。
module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。
package/session:多个文件调用一次,可以跨 .py 文件。
params:传入参数,接收一个列表,列表中每个数据都作为用例的输入
autouse:在一个session内所有的test都会自动调用当前的fixture,默认为false
ids:测试字符串id的列表,每个测试字符串id对应于params,默认为参数值
name:fixture的名称,默认为装饰函数的名称
fixture方法实战之autouse、ids、name应用:
import pytest @pytest.fixture(ids=['01','02','03'],params=[100,200,300],scope='class') def set_up(request): # 装饰函数的名称 return request.param class Test01: def testadd(self,set_up): print('exec TestDemo01 testadd') assert 100+100 <= set_up if __name__=='__main__': pytest.main(['-v','-s']) # -s 为了查看 print信息 -v 显示用例详情
conftest.py文件应用:
pytest中的fixture是pytest用于将测试前后进行预备,清理工作的代码分离
出核心测试逻辑的一种机制。但是我们更加希望的是在一个测试套件中,能够共
享fixture的机制,这样一个测试套件里面的所有测试点都能够共同使用。
在pytest中可以通过conftest.py来共享fixture,如果希望多个测试文件共同
使用一个fixture时候,可以在该目录下创建conftest.py文件。有如下代码结构:
使用conftest.py:
1、该文件所在目录必须存在__init__.py文件
2、该文件不能被其他文件导入,会自动被调用
3、所有同目录测试文件运行前都会执行该文件
4、该文件名字是固定的,不可以做任何修改
- 外层的conftest.py文件针对当前层和下层的模块都可以生效引用
- 内层的测试模块可以同时自定义配置调用fixure
pytest中的mark:
mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记
名),实现测试分组功能,并能和其它插件配合设置测试方法执行顺序等。
设置步骤如下:
1、注册标签名,通过pytest.ini配置文件注册;
2、在测试用例的前面加上:@pytest.mark.已注册标签名
3、运行时,根据用例标签过滤(-m 标签名)
mark应用实战之测试用例分组执行:
1、pytest.ini配置文件编写:
[pytest] markers = smoketest:冒烟测试 systemtest:系统测试
2、测试用例分组,也可以使用 -m not smoketest 执行组外的方法,代码示例:
import pytest class TestDemo1: @pytest.mark.smoketest def testadd001(self): print('TestDemo1》testadd001!') assert 1 +1 > 1 if __name__ == '__main__': pytest.main(['-s','-m smoketest'])
设置测试用例执行顺序:
默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文
件),再根据名称按ascii码值的顺序升序执行。
如果想自定义pytest测试用例的执行顺序,可以通过多种方式实现,常用的
方法有:
1、利用pytest_ordering插件,通过装饰器@pytest.mark.run(order=1)来进行
控制,数字越小,越前执行。需要提前使用pip install pytest_ordering安装插
件
2、在测试方法上加装饰器 @pytest.mark.last 表示最后一个执行(目前新版本
会报警告)
import pytest class TestDemo2: @pytest.mark.systemtest def testadd002(self): print('TestDemo2》testadd001!') assert 1+1 > 1 @pytest.mark.run(order=1) def testadd003(self): print('TestDemo2》testadd002!') assert 1+1 > 1 @pytest.mark.last def testadd004(self): print('TestDemo2》testadd003!') assert 1+1 > 1 @pytest.mark.run(order=2) def testadd005(self): print('TestDemo2》testadd004!') assert 1+1 > 1 if __name__=='__main__': pytest.main(['-s'])
测试用例跳过(忽略)设置:
在实际工作中,经常需要跳过过某个测试用例,比如现阶段某个功能还没有
开发完毕,但是先把测试用例写到了pytest中,因此需要先把这个测试用例给跳
过。可以使用如下方式跳过用例:
1、使用 @pytest.mark.skip(self,reason=None):在要跳过的测试用例前加入
该标签,并可以选择传入一个非必须参数reason表示原因
2、使用@pytest.mark.skipif(self,condition, reason=None):在要跳过的测试
用例前加入该标签,根据condition条件判断是否进行跳过
3、使用skip()方法:在测试用例中调用pytest.skip()方法来实现跳过,可以选择
传入msg参数来说明跳过原因;如果想要通过判断是否跳过,可以写在if判断里
4、使用pytestmark=pytest.mark.skip()方法:可以跳过整个模块,注意
pytestmark为关键字,必须用此名称
import pytest #该设置可以跳过整个模块的用例 pytestmark=pytest.mark.skip() class Testskip: @pytest.mark.skip(reason=None) def testadd002(self): print('TestDemo2》testadd001!') assert 1+1 > 1 @pytest.mark.skip(reason='该用例开发未完成,暂不执行') def testadd003(self): print('TestDemo2》testadd002!') assert 1+1 > 1 def testadd004(self): pytest.skip('想跳过就跳过!') print('TestDemo2》testadd003!') assert 1+1 > 1 @pytest.mark.skipif(condition='True', reason='如果条件为True就跳过!') def testadd005(self): print('TestDemo2》testadd005!') assert 1+1 > 1 @pytest.mark.skipif(3>2, reason='如果条件为True就跳过!') def testadd005(self): print('TestDemo2》testadd005!') assert 1 + 1 > 1 def testadd006(self): print('TestDemo2》testadd006!') assert 1 + 1 > 1 if __name__=='__main__': pytest.main(['-s'])
Pytest生成测试报告
1、生成JunitXML文件:
在命令模式下中切换到pytest测试用例路径下,执行命令:py.test 测试文件
--junitxml=./log.xml
2、生成HTML测试报告:
使用命令pip install pytest-html 安装html报告插件,在命令模式下切换到
pytest测试用例路径下,执行命令:py.test 测试文件 --html=./report.html
3. allture测试报告配置(推荐):
allure是一款开源的,专门用来展示测试结果的一个工具,allure可以与很多
的测试框架做集成,比如:java的Junit、TestNG,python的pytest等
allure会将测试用例的执行数据保存到xml文件中去,再利用allure的命令行
将文件转换成HTML形式呈现出来。
allture搭建步骤如下:
1、使用命令pip install allure-pytest安装allure插件
2、安装allure命令行工具:
2.1 安装jdk,并配置好环境变量,allure命令行工具由java开发;
2.2 通过地址:https://github.com/allure-framework/allure2/releases
下载最新版本的allure命令行工具并解压
2.3 配置环境变量:
新增 ALLURE_HOME:allure命令行工具解压路径
在path最后追加 ;%ALLURE_HOME%in
allture测试报告配置:
allture使用步骤如下(推荐):
1、在命令模式下中切换到pytest测试用例路径下,执行命令:py.test 测试文件
--alluredir=报告路径,生成xml报告
2、 在命令模式下执行命令:allure generate xml报告路径 -o html报告路径,
生成网页版的测试报告
3、在html报告路径中,打开index.html文件即可展示报告
备注:生成测试报告也可以通过pytest.main()增加参数来完成。如:
pytest.main(["--resultlog=./log.txt"])
pytest.main(["--junitxml=./log.xml"])
pytest.main(["--html=./report.html"])
pytest.main(["--alluredir=./report/"])