目录
- 一,什么是unittest
- 二,unittest能干啥
- 三,unittest基本使用
-
- 实例
- 断言
-
- 常用断言方法:
- assertEqual(first, second, msg=None)
- assertNotEqual(first, second, msg=None)
- assertTrue(expr, msg=None)
- assertFalse(expr, msg=None)
- assertIs(first, second, msg=None)
- assertIsNot(first, second, msg=None)
- assertIsNone(expr, msg=None)
- assertIsNotNone(expr, msg=None)
- assertIn(first, second, msg=None)
- assertNotIn(first, second, msg=None)
- assertIsInstance(obj, cls, msg=None)
- assertNotIsInstance(obj, cls, msg=None)
- 四,unittest接口测试实例
- 五,变量赋值共享问题
- 六,这里重点说一下unttest中各组建执行关系与顺序
一,什么是unittest
Unittest是Python内部自带的一个单元测试的模块,它设计的灵感来源于Junit,具有和Junit类似的结构,有过Junit经验的朋友可以很快上手。
二,unittest能干啥
Unittest具备完整的测试结构,支持自动化测试的执行,对测试用例集进行组织,并且提供了丰富的断言方法,最后生成测试报告。
Unittest框架的初衷是用于单元测试,但也不限于此,在实际工作中,由于它强大的功能,提供的完整的测试流程,我们往往将其用于自动化测试的各个方面,例如在本书中会讲到的接口测试实例都会用到Unittest。
三,unittest基本使用
实例
unittest 模块提供了一系列创建和运行测试的工具。这一段落演示了这些工具的一小部分,但也足以满足大部分用户的需求。
这是一段简短的代码,来测试一个add方法是否正确:
import unittest
# 没啥意义演示需要
def add(a, b):
return a + b
# 继承 unittest.TestCase
class TestUnittestDemo(unittest.TestCase):
def setUp(self):
"""每个test运行前都会执行此方法"""
pass
def tearDown(self):
"""每个test运行后都会执行的方法"""
pass
def test_assertEqual(self):
"""1+2=3"""
# assertEqual(实际结果,预期结果) 检查实际结果是否等于预期结果
self.assertEqual(add(1, 2), 3)
def test_assertTrueFalse(self):
"""1+2=3,1+2!=2"""
# assertTrue(True)检查结果是否为真
self.assertTrue(add(1, 2) == 3)
# assertFalse(False)检查结果是否为假
self.assertFalse(add(1, 2) == 2)
def test_TypeError(self):
"""add(a,b)b的类型错误"""
a = 1
b = "2"
# 验证抛出特定异常:TypeError,如果没抛出异常则执行失败
with self.assertRaises(TypeError):
# 此句运行结果会抛出异常TypeError: unsupported operand type(s) for +: 'int' and 'str'
add(a, b)
if __name__ == '__main__':
unittest.main()
类继承 unittest.TestCase 就创建了一个测试样例。上述类中是三个独立的测试方法,这些方法的命名都以 test 开头。 这个命名约定是为了告诉unittest测试运行时,类中的哪些方法是要执行的测试用例。
每个测试用例设置的检查点:
assertEqual() 来检查预期的输出;
assertTrue() 或 assertFalse() 来验证一个条件;
assertRaises() 来验证抛出了一个特定的异常。
注:使用这些方法而不是 assert 语句是为了让测试运行者能聚合所有的测试结果并产生结果报告。
通过 setUp() 和 tearDown() 方法,可以设置测试开始前与完成后需要执行的指令。 后面对此有更为详细的描述。
最后的代码块中,演示了运行测试的简单方法。 unittest.main() 提供了一个运行测试脚本的命令行接口。
上面的代码运行输出:
...
Ran 3 tests in 0.005s
OK
断言
常用断言方法:
方法 | 检查 | 支持版本 |
---|---|---|
assertEqual(a, b) | a == b | |
assertNotEqual(a, b) | a != b | |
assertTrue(x) | bool(x) is True | |
assertFalse(x) | bool(x) is False | |
assertIs(a, b) | a is b | 3.1 |
assertIsNot(a, b) | a is not b | 3.1 |
assertIsNone(x) | x is None | 3.1 |
assertIsNotNone(x) | x is not None | 3.1 |
assertIn(a, b) | a in b | 3.1 |
assertNotIn(a, b) | a not in b | 3.1 |
assertIsInstance(a, b) | isinstance(a, b) | 3.2 |
assertNotIsInstance(a, b) | not isinstance(a, b) | 3.2 |
assertEqual(first, second, msg=None)
测试第一和第二是否相等。如果值比较不相等,则测试将失败。
另外,如果first和second是完全相同的类型,并且将调用list,tuple,dict,set,frozenset或str或子类addTypeEqualityFunc()向特定类型的相等函数注册的任何类型中的一个,以便生成更有用的默认错误消息(另请参见类型特定方法的列表)。
assertNotEqual(first, second, msg=None)
测试第一和第二个不相等。如果这些值确实比较相等,则测试将失败。
assertTrue(expr, msg=None)
assertFalse(expr, msg=None)
测试expr为true(或false)。
请注意,这等效于而不是等效(用于后者)。当有更多特定的方法可用时(例如代替),也应避免使用此方法 ,因为在发生故障的情况下它们可以提供更好的错误消息。bool(expr) is Trueexpr is TrueassertIs(expr, True)assertEqual(a, b)assertTrue(a == b)
assertIs(first, second, msg=None)
assertIsNot(first, second, msg=None)
测试第一和第二评估(或不评估)对同一个对象。
3.1 新版功能.
assertIsNone(expr, msg=None)
assertIsNotNone(expr, msg=None)
测试expr是(或不是)None。
3.1 新版功能.
assertIn(first, second, msg=None)
assertNotIn(first, second, msg=None)
测试第二个是(不是)第一个。
3.1 新版功能.
assertIsInstance(obj, cls, msg=None)
assertNotIsInstance(obj, cls, msg=None)
测试obj是(或不是)cls的实例(可以是类或类的元组,如所支持isinstance())。要检查确切的类型,请使用。assertIs(type(obj), cls)
3.2 新版功能.
四,unittest接口测试实例
实例分好几个版本,难度从低到高循序渐进;如果觉得自己对unittest有一定基础,建议直接跳过前几个版本
初级版
import requests
import unittest
class Test(unittest.TestCase):
"""
初级版:v1.0
"""
def test_01(self):
"""正常登陆测试"""
params = {
"username": "正确的用户名",
"password": "正确的密码",
}
api_url = "https://xxx/login"
headers = {
"Content-Type": "application/json;charset=UTF-8"}
r = requests.post(url=api_url, params=params, headers=headers)
self.assertEqual(r.status_code, 200)
self.assertEqual(r.json()['code'], 0)
self.assertEqual(r.json()['message'], "成功[OK]")
def test_02(self):
"""username 错误"""
params = {
"username": "错误的密码",
"password": "正确的密码",
}
api_url = "https://xxx/login"
headers = {
"Content-Type": "application/json;charset=UTF-8"}
r = requests.post(url=api_url, params=params, headers=headers)
self.assertEqual(r.status_code, 200