python unintest单元测试框架提供了一整套内置的断言方法。
1、如果断言失败,则抛出一个AssertionError,并标识该测试为失败状态
2、如果异常,则当做错误来处理
注意:以上两种方式的区别
3、如果成功,则标识该测试为成功状态
在unittest框架中定义了哪几类断言方法:
1、基本的Boolean断言,即:要么True,要么False的验证
2、简单比较断言,例如比较a,b两个变量的值
3、复杂断言
基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。
断言方法 | 断言描述 | 备注 |
assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则fail | arg1 = arg2 |
assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则fail | arg1 != arg2 |
assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail | bool(expr) IS true |
assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail | bool(expr) IS false |
assertIs(arg1, arg2, msg=None) | 验证arg1、arg2是同一个对象,不是则fail | arg1 is arg2 |
assertIsNot(arg1, arg2, msg=None) | 验证arg1、arg2不是同一个对象,是则fail | arg1 not is arg2 |
assertIsNone(expr, msg=None) | 验证expr是None,不是则fail | expr is one |
assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail | expr not is one |
assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail | arg1 in arg2 |
assertNotIn(arg1, arg2, msg=None) | 验证arg1不是arg2的子串,是则fail | arg1 not in arg2 |
assertIsInstance(obj, cls, msg=None) | 验证obj是cls的实例,不是则fail | IsInstance(obj,cls) |
assertNotIsInstance(obj, cls, msg=None) | 验证obj不是cls的实例,是则fail | not IsInstance(obj,cls) |
assertGreater (first, second, msg = None) | 验证first > second,否则fail | |
assertGreaterEqual (first, second, msg = None) | 验证first ≥ second,否则fail | |
assertLess (first, second, msg = None) | 验证first < second,否则fail | |
assertLessEqual (first, second, msg = None) | 验证first ≤ second,否则fail | |
assertRegexpMatches (text, regexp, msg = None) | 验证正则表达式regexp搜索==匹配==的文本text regexp | 通常使用re.search() |
例1:
assertEqual(arg1, arg2, msg=None):断言第一个参数与第二个参数是否相等,如果不相等则测试失败。msg为可选参数,用于定义测试失败时打印的信息
import unittest
class InputTest(unittest.TestCase):
def setUp(self):
#用于测试用例执行前的初始化工作
number = input("请输入一个整数:")
self.number = int(number)#这个感觉跟__init__里面的变量差不多
def test_case_1(self):
self.assertEqual(self.number,10,msg="your input is not 10")
def tearDown(self):
pass
if __name__ == "__main__":
unittest.main()
"""
#输入正确时的输出:
请输入一个整数:10
Ran 1 test in 1.889s
OK
#输入错误时的输出
self.assertEqual(self.number,10,msg="your input is not 10")
Ran 1 test in 1.716s
FAILED (failures=1)
"""
注:
有上面的例子可以看出,当输入的数与预期的值不一致时,就会返回我们定义的msg信息
例2:判断一个数是否为质数
#判断一个数是否为质数(测试代码)
def is_prime(n):
list = []
if n <= 1:
return False
else:
for number in range(1,n+1):
if n%number == 0:
list.append(number)
else:
pass
if len(list) == 2:
return True
else:
return False
if __name__ == "__main__":
print(is_prime(99))
#求1-100内的质数
"""
list = []
for i in range(2,101):
for j in range(2,i):
if i%j ==0:
break
else:#注意这里的else与第二个for的缩进一致,都属于第一个for循环代码块
list.append(i)
print(list)
"""
例2_1:
from Module.Unittest_Module.is_prime import is_prime
import unittest
class Is_prime(unittest.TestCase):
def setUp(self):
print("测试开始")
def test_is_prime(self):
self.assertTrue(is_prime(97),msg="Is not prime")
def tearDown(self):
print("测试结束")
if __name__ == "__main__":
unittest.main()
"""
测试开始
测试结束
Ran 1 test in 0.001s
OK
"""
例2_2:
import unittest
class Is_In(unittest.TestCase):
def setUp(self):
print("测试开始")
def test_is_in_case(self):
a = "hello1"
b = "hello,world"
self.assertIn(a,b,msg="a is not in b")
def tearDown(self):
print("测试结束")
if __name__ == "__main__":
unittest.main()
"""
raise self.failureException(msg)
AssertionError: 'hello1' not found in 'hello,world' : a is not in b
"""
例2_3:
import requests
import unittest
class Response(unittest.TestCase):
def setUp(self):
print("测试开始")
def tearDown(self):
print("测试结束")
def test_response_case_1(self):
method = "get"
url = "http://www.baidu.com/"
response = requests.request(method=method,url=url)
response.encoding = "utf-8"
response_txt = response.text
self.assertIn("百度一下",response_txt,msg="百度主页打开错误")
if __name__=="__main__":
unittest.main()
注:
1、测试用例的名字必须以test开头,否则unittest框架会找不到测试用例
2、从上面的例子可以看出,unittest框架不仅可以调用其他函数进行断言测试,也可以直接在测试用例中进行断言验证(实际是一样的)