1、Pytest特点
特点 1、非常容易上手,入门简单,文档丰富,文档中有很多参考实例 2、支持简单的单元测试和复杂的功能测试 3、支持参数化 4、执行测试用例过程中,支持跳过操作 5、支持重复执行失败的case 6、支持运行由Nose,unittest编写的测试case 7、具有很多第三方插件,并且可以自定义扩展 8、方便和持续集成工具集成
2、pytest介绍及安装
安装 pip3 install pytest 离线安装方式:下载pytest离线安装包,并解压,然后在dos下进入到解压的目录,然后执行python setup.py install 安装校验 命令行输入pytest --version会展示当前已安装的版本 pip show pytest
3、运行方式
pytest测试类的定义 类名必须以Test开头 方法名必须以test开头
3.1、Pycharm设置
3.2、命令行运行*
pytest -s -v 测试文件名.py -s:打印测试用例输出信息 -v:打印执行日志
3.3、代码运行
了解即可
if __name__ == '__main__':
pytest.main(["-s","测试文件名.py"])
2.3、pytest断言
pytest里面的断言方法只有一个
assert 表达式
assert result == expect //相等
assert result != expect //不相等
assert result //为Ture
assert False //为False
assert a in b //包含
assert a not in b //不包含
assert result is None //为空
assert result is not None //不为空
4、setup和teardown
应用场景 pytest在运行自动化脚本的前后会执行两个特殊的方法,分别是setup和teardown,在执行脚本之前会执行setup方法,在执行脚本之后会执行teardown方法。有了这两个方法,我们可以在setup中进行获取驱动对象的操作,在teardown中进行关闭驱动对象的操作。 总结 概念 两个特殊的函数,没有自动提示 分类 函数级别(有多少函数就执行多少次) setup 测试函数之前调用 teardown 测试函数之后调用 类级别(有多少个类就执行多少次) setup_class 类之前调用 teardown_class 类之后调用
5、配置文件
使用配置文件后可以快速的使用配置的想来选择执行那些测试模块。 使用方式 名称固定:只能是pytest.ini、tox.ini、setup.cfg 项目下新建script模块 将测试脚本文件放在script中 pytest的配置文件放在自动化项目根目录下 名称为pytest.ini 命令行运行时会使用该配置文件中的配置 第一行内容为[pytest] 示例
[pytest]
addopts = -s -v --html=report/report.html
testpaths = ./scripts
python_files = test_*.py
python_classes = Test*
python_functions = test_*
testpaths, python_files, python_classes, python_functions 表示 哪一个文件夹 下的 哪一个文件 下的 哪一个类 的 哪一个函数 表示执行scripts文件夹下的test开头的.py结尾的文件下的Test开头的类下的test_开头的函数
配置文件注意点 1、配置文件是否已经正确的加载? 通过控制台的inifile进行查看 2、关键windows中可能出现’gbk’错误 删除ini文件中的所有中文 3、在工作中这个文件需要复制粘贴? 是的,一个项目只会用一次,只需要理解当中的含义,能够修改即可 注意:添加完成配置文件之后,命令行中只需要输入pytest就可以执行了。
6、pytest常用插件
6.1、测试报告
安装命令:pip3 install pytest-html 在pytest配置文件的命令行参数中增加–html=用户路径/report.html 正常运行pytest 效果 会在项目目录下生成一个report文件夹,下面会有一个index.html即为报告
6.2、控制函数执行顺序
pytest正常境况下是根据测试方法从上到下的顺序来执行。 可以通过pytest-ordering插件来控制pytest测试方法执行的顺序。 使用 1、安装命令:pip3 install pytest-ordering 2、是使用装饰器的形式,在需要控制顺序的函数上增加这个装饰器即可 3、@pytest.mark.run(order=x) 4、优先级 0>较小的正数(1)>较大的正数(3)>没有写>较小的负数(-3)>较大的负数(-1)
6.3、失败重试
应用场景 自动化测试脚本可能会使用到网络,如果网络不好可能最终会是脚本不通过。想这种情况可能并不是脚本本身的问题,仅仅是因为网络的问题,那么我们可以使用失败重试的插件,当失败后,尝试再次运行。一般情况最终成功可以视为成功,但最好进行排查是不是脚本的问题。 使用 1、安装命令:pip3 install pytest-rerunfailures 2、在pytest配置文件的addopts参数中增加-reruns n n代表重试的次数,不包括首次 3、正常运行pytest即可 4、效果 R表示失败重试 会重试n次,如果最后还没有通过则视为F 中间如果成功,后面的就不会重复执行 5、应用 在工作中,建议直接写2或者3 防止像网络不好的这种意外情况 如果成功了,可以理解为成功,如果最后都是失败,则检查是不是脚本或产品的问题
7、pytest高级用法
7.1、跳过测试函数
1、在需要跳过的测试脚本上加上装饰器 2、@pytest.mark.skipif(condition=True,reason=“xxx(必须填且是String)”) condition是bool类型,如果为True表示跳过
7.2、预期失败
比如注册时要求用户名为6-10位,如果我们传入一个12位的用户名,此时可以使用预期失败。 @pytest.mark.xfail(condition=None,reason=“xxx”,raises=None,run=True,strict=False) condition:跳过的条件,必传参数 reason:标注原因,必传参数 使用方式 在需要标记与其失败的测试脚本之上加上装饰器 @pytest.mark.xfail(condition,reason=“xxx”) 1、在需要标记预期失败的测试脚本之上加上装饰器 2、pytest.mark.xfail(condition=None,reason=“xxx”) condition是布尔类型的,如果为True表示预期失败 3、报告观察的结论 红色的,表示BUG(预期和结果不一致) 带X的,表示预期失败 最后的单词,如果是pass就是通过,如果是fail就是失败 4、用处 反向测试的时候使用
7.3、数据参数化
在需要标记与其失败的测试脚本之上加上装饰器 @pytest.mark.parametrize(‘参数名’,[‘参数值1’,‘参数值2’])
@pytest.mark.parametrize(“argvanames”,“argvalues”)需要传入"argvanames"与"argvalues",第一个参数需要一个或者多个变量接收列表中的每组数据,第二个参数传递存储数据的列表。测试用例需要使用童明德字符串接收测试数据(与"argvanames"里面的名字一致),且列表有多少个元素就会生成并执行多少个测试用例。 什么时候用? 脚本相同,数据不同的时候,可以使用 怎么用? 总得来说,都是使用装饰器的形式 单个参数 @pytest.mark.parametrize(‘参数名’,[‘参数值1’,‘参数值2’]) 多个参数 @pytest.mark.parametrize((‘参数名1’,‘参数名2’),[(‘参数值1_1’,‘参数值2_1’),(‘参数值1_2’,‘参数值2_2’)])
8、fixture
应用场景 fixture修饰器来标记固定的工厂函数,在其他函数,类调用它时会被激活并有限执行,通常会被用于完成预置处理和重复操作。 使用方式 1、标记工厂函数 装饰器,@pytest.fixture() 2、使用 参数 直接在脚本的参数列表中,增加fixture的名字即可 函数(装饰器) 在脚本之上写一个装饰器@pytest.mark.usefixture(“before”)
8.1、自动运行
增加参数 @pytest.fixture(autose=True)
8.2、作用域
@pytest.mark.fixture(autose=True,scope=“class”) 优先级 class级别中 setup_class > fixture function级别中 fixture > setup
8.3、参数化
@pytest.fixture(params=[“1”,“2”,“3”]) 列表中有多少元素,脚本就会执行多少次。 如果想要获取列表中的内容 需要在fiture中增加一个request参数 通过request.param进行获取
8.4、返回值
再使用参数引用的时候,这个参数就是fixture函数的返回值。 如果想要使用之前提到的,参数化的内容,那么直接当成返回值即可。 扩展 如果使用fixture参数画的同时也使用脚本的参数化,可以达到两两结合的效果。比如,fixture的parmas里面有三个参数,脚本的参数化里面有4个参数,那么这个脚本会运行12次。
|