pytest 介绍及基本使用
阅读目录:
pytest 介绍
pytest 测试用例编写规则
安装pytest
pycharm 默认测试执行
第一个示例
主要命令参数
pytest介绍
官网:https://www.osgeo.cn/pytest/contents.html
pytest是python语言中的一种单元测试框架,与其python自带的unittest测试框架类似 (拓展: java语言下的单元测试框架是 junit 和testng)
pytest可结合requests 实现接口测试, 结合 selenium/playwright、appium实现自动化测试
pytest特点:
1、 具有unittest绝大部分功能,易上手,功能灵活,文档丰富,有很多实例可以参考
2、 具有强大灵活的fixture固件,支持简单的单元测试和复杂的功能测试
3、支持参数化(parametrize)、数据驱动
4、执行待测试过程中可以将某些测试用例跳过(skip),或对某些预期失败的case标记成失败(xfail)
5、支持重复执行(return)失败的case
6、支持运行nose、unittest编写的测试case
7、支持执行部分用例(如:根据标记、或feature、stories等。)
8、支持很多第三方插件(顺序控制pytest-ordering、 allure报告allure-pytest、多线程 pytest-xdist 等),并可自定义开发插件
9、可生辰html报告, 也可结合allure生成精美的测试报告
10、方便jenkins集成 实现持续交付
pytest和unittest区别:
不同点 | unittest | pytest |
---|---|---|
命名 | 测试方法以test开头 | 模块名必需以test_开头,或以_test结尾 |
框架结构 | 写case必需定义类,测试类要继承unittest.TestCase | 不需要继承,可以是函数也可以是类中方法 |
测试报告 | 使用HTMLTestRunner | 使用allure-pytest |
数据驱动 | 参数化使用第三方ddt | 参数化使用自带的parametrize |
断言 | 断言库丰富 | 采用python断言: 使用assert关键字 |
失败重试 | 不支持,可自定义类支持 | 支持 |
固件 | - | 灵活的fixture固件 |
扩展性 | - | 快速自定义插件开发 |
pytest测试用例编写规则
类型 | 规则 |
---|---|
模块 | 模块名必需以test_开头 -- test_*.py 或者以_test结尾 -- *testpy 建议: test+业务名称 |
类 | 测试类类名以Test开头 |
方法/函数 | 以test开头 |
包 | 包名无特殊要求, 包必需要有__init__.py文件 |
pytest安装
前提环境: 已经安装、配置好python环境
通过命令安装
安装命令: pip install pytest
如果安装不了, 请更换pip源,可考虑使用清华镜像源
(上图是已经安装完成的显示,补充: 升级到最新版本: pip install -U pyest)
通过pycharm安装
pycharm中安装需要的包,在settings中,选择Python Interpreter,然后点击“+”
搜索要安装的包,右下角可以选择需要的版本,最后左下角安装即可
验证安装是否成功:
pytest --version
pycharm默认测试执行器
settings中,进入Tools -> Python Intergrated Tools,Default test runner默认是自动发现的,可以直接选择pytest
pycharm运行
左侧有绿色执行按钮 点击绿色按钮,用的pytest解释器执行的,而不是python解释器
结果
一次执行模块中所有方法
1、可以非测试方法处点右键执行
2、可以使用main方法运行:调用pytest函数执行测试,需要import pytest
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# @Author: zzd
# @wx: M_Haynes
# @Blog: https://editor.mdnice.com/?outId=3922c88879f84d9d87275683f6153499
import pytest
def inc(x):
return x + 1
def test_a():
print("---test_a")
assert inc(0) == 1
class TestCase:
def test_b(self):
print("---test_b")
assert "zz" in "zzd"
if __name__ == "__main__":
pytest.main()
# 注解:pytest.main() 等价于 pytest.mian([",/]) 运行当前目录下的所有用例
点击main左侧绿色按钮: 结果 补充:
如果放到vscode中,会执行工程下所有用例,只运行当前模块的用例,需要增加参数 file, 表示当前文件
命令运行
注意: 这里需要将前面写的 main 方法进行注销
在Terminal 中 进入项目目录,执行pytest
test_a改为失败,一个成功一个失败,成功是.,失败是F
pytest等价于python -m pytest
注意: 如果没有main方法,执行 python case/test_zcs_example.py ,则不会有任何结果 如果有main方法:
1. 用pytest的解释器执行用例:
1、命令行中直接执行pytest
2、pycharm 中方法和类、直接点绿色执行按钮,运行; 模块和包,选中模块或者包,右键运行;或者非测试方法处点击右键执行(此时pycharm已设置默认测试执行器师pytest)
2. 用python的解释器执行用例:
1、命令中执行python -m pytest 调用pytest (jenkins持续集成可用到,可指定不同版本的python)
2、有main函数,命令中执行python xxx.py, 调用py文件中main函数中的pytest.main(); 说明: 直接执行这个模块,被执行的模块是main(可 print(_name_)查看结果),如果此模块被其他模块导入,这个模块就不是main了
主要命令参数
-h参数
pytest -h 的结果分类:
-
命令行参数 用于pytest运行时的参数,比如-k、-m等,有通用类、报告类、收集类、调试类、日志类等
通用类 报告类 告警
收集
调试 日志 2. 元数据 3.配置参数:pytest.ini中配置的参数 4.环境变量 5.重跑失败
-s参数
示例:上面示例发现,如果用例执行成功,print内容没显示,可以加-s参数捕获print函数的输出
本文由 mdnice 多平台发布