04-13pytest的基本使用方法
引言
有了unittest这个经典的测试框架做基础,那么学习其他任何的测试框架都变得有章法可循了。
pytest测试框架也是由unittest改编而来,所以许多地方都是一脉相承。
pytest的断言也变得更加易懂,简单来说是白话文中白话文。
正文:
1 断言
pytest直接使用 assert 关键字 进行断言
断言又有一般断言和异常断言等等,这里我们先来了解一般常用的断言
常用断言
-
常用断言举例
# 功能 用于计算 a 与 b 相加的和
def addnumber(a,b):
return a+b
# 功能 : 用户判断是否是素数
# 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
def is_primenumber(n):
if n<=1:
return False
for i in range(2,n):
if n % i ==0:
return False
return True
# 测试相等
def test_add_equal():
assert addnumber(3,4) == 7
# 测试不相等
def test_add_notequal():
assert addnumber(3,4) != 8
# 测试大于等于
def test_greadequal():
assert addnumber(3,4) >=7
# 测试 小于等于
def test_lessequal():
assert addnumber(3, 4) <= 7
# 测试包含
def test_in():
a = 'helloword'
b ='word'
assert b in a
# 测试不包含
def test_notin():
a ='helloword'
b ='bug'
assert b not in a
# 判断是否为True
def test_true():
a ='a'
b ='a'
assert a == b
def test_listtrue():
a =[1,2]
b =[1,2]
assert a==b
# 判断是True
def test_isprimenumber():
assert is_primenumber(3) is True
assert is_primenumber(5) is True
assert is_primenumber(13) is True
# 判断是否不为True
def test_isnottrue():
assert is_primenumber(2) is not True
# 判断是否为False
def test_false_a():
assert is_primenumber(8) is False
-
我们把脚本运行一下:
...> pytest Stage5\07pytest\test_operator.py -v #### -v 参数能把结果打印的更详细 #### -v, --verbose increase verbosity.
结果如下:
======================================================== test session starts ========================================================
platform win32 -- Python 3.7.1, pytest-5.2.2, py-1.8.0, pluggy-0.13.0 -- d:\python\virtualenvs\testops\scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\Coding\Project\testops
collected 10 items
Stage5/07pytest/test_operator.py::test_add_equal PASSED [ 10%]
Stage5/07pytest/test_operator.py::test_add_notequal PASSED [ 20%]
Stage5/07pytest/test_operator.py::test_greadequal PASSED [ 30%]
Stage5/07pytest/test_operator.py::test_lessequal PASSED [ 40%]
Stage5/07pytest/test_operator.py::test_in PASSED [ 50%]
Stage5/07pytest/test_operator.py::test_notin PASSED [ 60%]
Stage5/07pytest/test_operator.py::test_true PASSED [ 70%]
Stage5/07pytest/test_operator.py::test_isprimenumber PASSED [ 80%]
Stage5/07pytest/test_operator.py::test_isnottrue PASSED [ 90%]
Stage5/07pytest/test_operator.py::test_false_a PASSED [100%]
======================================================== 10 passed in 0.04s =========================================================
如果你的运行结果看不到详细的信息,那你需要加上 -v 参数。
断言异常
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError) as exzerodivisionerror:
1/0
## 断言 捕获的异常类型是否是 ZeroDivisionError
assert exzerodivisionerror.type == ZeroDivisionError ,"异常类型不是 ZeroDivisionError"
#
print("<type>",exzerodivisionerror.type,"<value>",exzerodivisionerror.value)
## 断言 division by zero 字符包含在 捕获的错误信息中
assert "division by zero" in str(exzerodivisionerror.value),"异常值不包含 division by zero"
断言异常的关键字也是assert ,一般是断言异常的type和具体异常信息是否包含某个值value
总结:
1 一般断言通常是运算符的扩展,例如 算术运算符 +,-身份运算符 is ,is not等等
2 断言异常的关键字也是assert ,一般是断言异常的type和具体异常信息是否包含某个值value
思考与延伸
1 pytest的assert 和 unittest的 self.assert 有什么区别?