pytest入门
pytest简介
- pytest 参数化的本质是对列表中的对象进行循环,然后把循环的对象进行一一的赋值,它的应用场景主要是基于相同的业务场景,但是需要不同的测试数据来测试从而达到最大化的覆盖更多的业务场景和测试的覆盖率。理解了这样的一个思想之后,我们就以两个数想加作为案例,来演示Pytest测试框架的参数化实际应用,另外一点需要特别说的是在Pytest测试框架中参数化使用的方式是通过装饰器的方式来进行
通过官方网站介绍我们可以了解到,Pytest是一个非常成熟的全功能的python测试框架,主要有以下几个特点:
- 简单灵活易上手
- 支持参数化
- 支持简单的单元测试和复杂的功能测试,还可以用来做自动化测试
- 具有很多第三方插件,并且可以自定义扩展
- 测试用例的skip和xfail处理
- 可以很好的和Jenkins集成
- 支持运行由Nose、UnitTest编写的测试用例
Pytest安装
1、直接使用pip命令安装:
pip install -U pytest # -U是如果已安装会自动升级最新版本
2、检查安装版本
pytest --version # 展示当前安装版本
在pytest测试框架中,要遵循以下约束(默认测试用例规则)
- 测试文件名要符合test_.py或_test.py格式(例如test_min.py)(模块名必须以 test_开头 或者 _test 结尾)
- 测试类要以Test开头,且不能带有init方法(测试类必须以 Test 开头,且 测试类不能有 init 方法)
- 在单个测试类中,可以包含一个或多个test_开头的函数(测试方法必须以 test 开头)
Pytest测试执行
# test_demo.py 新建测试用例文件
def test_001(): # 函数以test_开头
print("test_01")
def test_002():
print("test_02")
# 函数执行
- 直接执行 pytest
寻找当前目录及子目录下所有符合测试用例规则的用例并执行测试
- 使用 if __name__ == '__main__'
import pytest # 导入pytest包
if __name__ == '__main__':
pytest.main(["-v","test_demo.py"]) # 调用pytest的main函数执行测试
- 直接执行 pytest
main() 参数
执行 pytest.main 测试
pytest.main()括号内可传入执行参数和插件参数,通过[]进行分割,[]内的多个参数通过‘逗号,’进行分割:
- 运行目录及子包下的所有用例 pytest.main(['目录名'])
- 运行指定模块所有用例 pytest.main(['test_demo.py'])
- 运行指定模块指定类指定用例 pytest.main(['test_demo.py::TestClass::test_method']) 冒号分割
-m=xxx: 运行打标签的用例
-v: 丰富信息模式, 输出更详细的用例执行信息(常用)
-s: 显示程序中的print/logging输出(常用)
-reruns=xxx:失败重新运行
-q: 安静模式, 不输出环境信息
--resultlog=./log.txt 生成log
--junitxml=./log.xml 生成xml报告
--html=./report/report.html 生成html报告
--maxfail=num 执行失败最大次数
常用命令详解
1.运行指定案例:
if __name__ == '__main__':
pytest.main(["-v","-s","test_1214.py"])
2、运行当前文件夹包括子文件夹所有用例:
if __name__ == '__main__':
pytest.main(["-v","-s","./"])
3、运行指定文件夹(code目录下所有用例):
if __name__ == '__main__':
pytest.main(["-v","-s","testcase/"])
4、运行模块中指定用例(运行模块中test_add用例):
if __name__ == '__main__':
pytest.main(["-v","-s","test_assert.py::test_add"])
5.执行失败的最大次数。
使用表达式 "--maxfail=num" 来实现(注意:表达式中间不能存在空格),表示用例失败总数等于num 时停止运行。
if __name__ == '__main__':
pytest.main(["-v","--maxfail=2","test_assert.py::test_add"])
6.错误信息在一行展示。
在实际项目中如果有很多用例执行失败,查看报错信息将会很麻烦。使用"--tb=line"命令,可以很好解决这个问题。
if __name__ == '__main__':
pytest.main(["-v","--tb=line","test_assert.py::test_add"])
通过python代码执行
python main.py
- 执行并生成测试报告
通过 --html='测试报告存放位置及报告名称',当文件夹 ./report 不存在时,自动创建
pytest.main(['--html=./report/report.html','test_demo.py'])
断言方法
pytest断言主要使用Python原生断言方法,主要有以下几种:
- == 内容和类型必须同时满足相等
- in 实际结果包含预期结果
- is 断言前后两个值相等
# test_assert.py
def add(x,y): # 定义以test_开头函数
return x + y
def test_add():
assert add(1,2) == 3 # 断言成功
str1 = "Python,Java,Ruby"
def test_in():
assert "PHP" in str1 # 断言失败
dict1 = {"username": "testuser", "id": 456}
def test_is_fail():
data = {"username": "testuser", "id": 456}
assert data is dict1 # 断言失败
def test_is_success():
data = {"username": "testuser", "id": 456}
assert data["username"] is dict1["username"] # 断言成功
# main.py
import pytest # 导入pytest包
if __name__ == '__main__':
pytest.main(["-v","test_assert.py"]) # 调用main函数执行测试
PS E:\自动化测试pytest\demo> python .\main.py
========================================================================================== test session starts ===========================================================================================
platform win32 -- Python 3.7.4, pytest-7.1.1, pluggy-0.13.1 -- D:\MyData\ex_kongdy\AppData\Local\Programs\Python\Python37\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.7.4', 'Platform': 'Windows-10-10.0.17763-SP0', 'Packages': {'pytest': '7.1.1', 'py': '1.11.0', 'pluggy': '0.13.1'}, 'Plugins': {'html': '2.1.1', 'metadata': '1.11.0'}, 'JAVA_HOME': 'C:\Program Files\Java\jdk1.8.0_281'}
rootdir: E:\自动化测试pytest\demo
plugins: html-2.1.1, metadata-1.11.0
collected 4 items
test_assert.py::test_add PASSED [ 25%]
test_assert.py::test_in FAILED [ 50%]
test_assert.py::test_is_fail FAILED [ 75%]
test_assert.py::test_is_success PASSED [100%]
================================================================================================ FAILURES ================================================================================================