断言
概念:
让程序代替人为判断测试程序执行结果是否符合预期结果的过程
常用的UnitTest断言方法
序号 | 断言方法 | 断言描述 |
1 | assertTrue(expr, msg=None) | 验证expr是true, 如果为false, 则fail |
2 | assertFalse(expr, msg=None) | 验证expr是false, 如果为true, 则fail |
3 | assertEqual(expected, actual, msg=None) |
验证expected==actual, 不等则fail 【掌 握】 |
4 | assertNotEqual(first, second, msg=None) |
验证first != second, 相等则fail |
5 | assertIsNone(obj, msg=None) | 验证obj是None, 不是则fail |
6 | assertIsNotNone(obj, msg=None) | 验证obj不是None, 是则fail |
7 | assertIn(member, container, msg=None) |
验证是否member in container【掌握】 |
8 | assertNotIn(member, container, msg=None) |
验证是否member not in container |
使用方式
断言方法已经在unittest.TestCase类中定义好了, 而且我们自定义的测试类已经继承了
TestCase, 所以在测试方法中直接调用即可。
import unittest
def add(x, y):
return x + y
class TestAssert(unittest.TestCase):
def test01(self):
num = add(1, 2)
self.assertEqual(3, num)
def test02(self):
num = add(1, 2)
is_ok = num == 3
self.assertTrue(is_ok)
python自带断言:
""
目标断言扩展:
两种实现方式:
1. 使用unittest框架中的断言
2. 使用python自带断言
"""
# 使用python自带断言 判断两个字符串是否相等
# assert "hello" == "hello"
# 不相等
# assert "hello" == "hello1" "出错啦啦啦!!!这俩不相等"
# 第二个字符串是否包含第一个字符串
# assert "h" in "hello"
# assert "ha" in "hello"
# 判断是否为True
# assert True
# assert False
# 0 为False ; 1为True
# assert 0
# assert 1
UnitTest断言方法(全)
序号 | 断言方法 | 断言描述 |
1 | assertEqual(arg1, arg2, msg=None) |
验证arg1=arg2, 不等则fail 【常用】 |
2 | assertNotEqual(arg1, arg2, msg=None) |
验证arg1 != arg2, 相等则fail |
3 | assertTrue(expr, msg=None) | 验证expr是true, 如果为false, 则fail 【常用】 |
4 | assertFalse(expr,msg=None) | 验证expr是false, 如果为true, 则fail 【常用】 |
5 | assertIs(arg1, arg2, msg=None) |
验证arg1、 arg2是同一个对象, 不是则fail |
6 | assertIsNot(arg1, arg2, msg=None) |
验证arg1、 arg2不是同一个对象, 是则fail .c |
7 | assertIsNone(expr, msg=None) |
验证expr是None, 不是则fail as |
8 | assertIsNotNone(expr, msg=None) |
验证expr不是None, 是则fail it |
9 | assertIn(arg1, arg2, msg=None) |
验证arg1是arg2的子串, 不是则fail w |
10 | assertNotIn(arg1, arg2, msg=None) |
验证arg1不是arg2的子串, 是则fail |
11 | assertIsInstance(obj, cls, msg=None) |
验证obj是cls的实例, 不是则fail |
12 | assertNotIsInstance(obj, cls, msg=None) |
验证obj不是cls的实例, 是则fail |
13 | assertAlmostEqual (first, second, places = 7, msg = None, delta = None) 智 |
验证first约等于second。 palces: 指定精确到小数点 后多少位, 默认为7 |
14 | assertNotAlmostEqual (first, second, places, msg, delta) 传 |
验证first不约等于second。 palces: 指定精确到小数 点后多少位, 默认为7 注: 在上述的两个函数中, 如果delta指定了值, 则first和second之间的差值必须 ≤delta |
15 | assertGreater (first, second, msg = None) |
验证first > second, 否则fail |
16 | assertGreaterEqual (first, second, msg = None) |
验证first ≥ second, 否则fail |
17 | assertLess (first, second, msg = None) |
验证first < second, 否则fail |
18 | assertLessEqual (first, second, msg = None) |
验证first ≤ second, 否则fail |
19 | assertRegexpMatches (text, regexp, msg = None) |
验证正则表达式regexp搜索匹配的文本text。 regexp: 通常使用re.search() |
20 | assertNotRegexpMatches (text, regexp, msg = None) |
验证正则表达式regexp搜索不匹配的文本text。 regexp: 通常使用re.search() 说明: 两个参数进行 比较(>、 ≥、 <、 ≤、 约等、 不约等) |
21 | assertListEqual(list1, list2, msg = None) |
验证列表list1、 list2相等, 不等则fail, 同时报错信息 返回具体的不同的地方 |
22 | assertTupleEqual (tuple1, tuple2, msg = None) |
验证元组tuple1、 tuple2相等, 不等则fail, 同时报错 信息返回具体的不同的地方 |
23 | assertSetEqual (set1, set2, msg = None) |
验证集合set1、 set2相等, 不等则fail, 同时报错信息 返回具体的不同的地方 |
24 | assertDictEqual (expected, actual, msg = None |
验证字典expected、 actual相等, 不等则fail, 同时报 错信息返回具体的不同的地方 |
参数化
通过参数的方式来传递数据, 从而实现数据和脚本分离。 并且可以实现用例的重复执行。
unittest测试框架,本身不支持参数化, 但是可以通过安装unittest扩展插件parameterized来实现。
安装
pip install parameterized
使用方式
导包: from parameterized import parameterized
使用@parameterized.expand(列表)装饰器可以为测试函数的参数进行参数化
import unittest
from parameterized import parameterized
"""
目标:parameterized 插件应用
步骤:
1. 导包 from parameterized import parameterized
2. 修饰测试函数 @parmeterized.expand(列表类型数据)
3. 在测试函数中使用变量接收,传递过来的值。
语法:
1. 单个参数:值为列表
2. 多个参数:值为列表嵌套元组 如:[(1,2,3),(2,3,4)]
"""
# 定义测试类 并 继承
class Test01(unittest.TestCase):
# 单个参数使用方法
# @parameterized.expand(["1", "2", "3"])
# def test_add_one(self, num):
# print("num:", num)
# 多个参数使用方法 写法1
# @parameterized.expand([(1, 2, 3), (3, 0, 3), (2, 1, 3)])
# def test_add_more(self, a, b, result):
# print("{}+{}={}:".format(a, b, result))
# data = [(1, 2, 3), (3, 0, 3), (2, 1, 3)]
# 写法2
# @parameterized.expand(data)
# def test_add_more(self, a, b, result):
# print("{}+{}={}:".format(a, b, result))
# 写法 3 推荐
def get_data(self):
return [(1, 2, 3), (3, 0, 3), (2, 1, 3)]
@parameterized.expand(get_data())
def test_add_more(self, a, b, result):
print("{}+{}={}:".format(a, b, result))
跳过
对于一些未完成的或者不满足测试条件的测试函数和测试类, 可以跳过执行
使用方式
# 直接将测试函数、类标记成跳过
@unittest.skip(reason)--一般用于未实现功能# 根据条件判断测试函数、类是否跳过
@unittest.skipIf(condition, reason)--条件满足就不执行
""
目标:unittest skip 与 skipif功能
语法:
@unittest.skip("原因")
@unittest.skipIf(条件,原因)
"""
# 导包
import unittest
version = 30
# 新建测试类
# @unittest.skip("Test01方法功能暂未实现")
@unittest.skipIf(version > 25, "版本大于25了,跳过此用例!")
class Test01(unittest.TestCase):
# 新建测试方法 1
# @unittest.skip("test01方法功能暂未实现")
def test01(self):
# print("test01")
"""此方法功能暂未完T成"""
pass
# 新建测试方法 2
# @unittest.skipIf(version > 25, "版本大于25了,跳过此用例!")
def test02(self):
print("test02")