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 有什么区别?