unittest框架是Python内置的单元测试框架,可以用来做单元测试,接口测试,UI自动化测试。
简单示例
import requests
import unittest
class MyTestCase(unittest.TestCase):
'''
类名可以自定义
但必须继承 unittest.TestCase
'''
def runTest(self):
response = requests.get(url='http://ip:80/product/getSku?id=1')
print(response.json())
if response.json()['message'] == "success":
print('用例通过')
else:
print('用例执行失败')
if __name__ == '__main__':
unittest.main()
- 针对于上面的示例来说,方法名必须叫
runTest
,因为在父类(unittest.TestCase)中的初始化方法的methodName
参数,来控制我们测试用例的名称:
class TestCase(object):
def __init__(self, methodName='runTest'):
"""Create an instance of the class that will use the named test
method when executed. Raises a ValueError if the instance does
not have a method with the specified name.
"""
self._testMethodName = methodName
self._outcome = None
self._testMethodDoc = 'No test'
当然你也可以手动指定参数
if __name__ == '__main__':
case_obj = MyTestCase(methodName='mytest')
case_obj.run()
setup和teardown
有些时候,我们需要在用例执行前后做一些操作,那就:
- 用例执行之前:
setup
- 用例执行之后:
teardown
它们的执行顺序:
-
setup
,做一些初始化的操作 - 测试用例执行
-
teardown
执行,收尾
注意,上述的执行顺序于它们在类中的位置无关,并且这两个方法名是固定的写法。如果,我们测试用例时,没有初始化和收尾的工作,setUp
和tearDown
方法可以省略不写
import requests
import unittest
class MyTestCase(unittest.TestCase):
'''
类名可以自定义
但必须继承 unittest.TestCase
在测试用例执行之前
要做一些事情或者进行一些初始化的操作
在测试用例执行之后,做一些收尾的操作
'''
def setUp(self):
""" 在测试用例执行之前执行的方法 """
self.response = requests.get(url='http://ip:80/product/getSku?id=1')
print("在测试用例执行之前触发我执行", self.response.json())
def tearDown(self):
""" 在测试用例执行之后执行的方法 """
print("在测试用例执行之后触发我执行")
del self.response
def mytest(self):
""" mytest就是测试用例 """
if self.response.json()['message'] == "success":
print('用例通过')
else:
print('用例执行失败')
if __name__ == '__main__':
case_obj = MyTestCase(methodName='mytest')
case_obj.run()
setupClass和teardownClass
场景:
在测试类中,有多个测试用例,在每一个测试用例执行前后,要做一些操作。
另外,还有在测试类中,所有用例执行之前要做一些初始化的操作,在所有用例执行之后,要做一的收尾的操作。
import unittest
class MyTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('在所有用例执行之前做的操作')
@classmethod
def tearDownClass(cls):
print('在所有的用例执行之后做的操作')
def setUp(self):
print('在用例执行之前做的操作')
def tearDown(self):
print('在用例执行之后做的操作')
def test_case_01(self):
self.assertTrue('FOO'.isupper()) # 'FOO'.isupper() --> True
def test_case_02(self):
self.assertTrue('FOO'.isupper())
def test_case_03(self):
self.assertTrue('bar'.islower())
if __name__ == '__main__':
suite = unittest.makeSuite(testCaseClass=MyTestCase)
unittest.TextTestRunner(verbosity=2).run(suite)
断言
断言:执行结果是否符合预期,符合则说明断言成功,如果符合预期,说明断言失败
unittest框架提供了丰富的断言方法供我们使用。
下表列出了最常用的方法:
Method | Checks that | description | New in |
---|---|---|---|
assertEqual(a, b, msg) | a == b | 如果a不等于b,断言失败 | |
assertNotEqual(a, b, msg) | a != b | 如果a等于b,断言失败 | |
assertTrue(x, msg) | bool(x) is True | 如果表达式x不为True,断言失败 | |
assertFalse(x, msg) | bool(x) is False | 如果表达式x不为False,断言失败 | |
assertIs(a, b, msg) | a is b | 如果a is not 2,断言失败 | 3.1 |
assertIsNot(a, b, msg) | a is not b | 如果a is b,断言失败 | 3.1 |
assertIsNone(x, msg) | x is not None | 如果x不是None,断言失败 | 3.1 |
assertIn(a, b, msg) | a in b | 如果a not in b,断言失败 | 3.1 |
assertNotIn(a, b, msg) | a not in b | 如果a in b,断言失败 | 3.1 |
assertIsInstance(a, b, msg) | isinstance(a, b) | 如果a不是b类型,断言失败 | 3.2 |
assertNotIsInstance(a, b, msg) | not isinstance(a, b) | 如果a是b类型,断言失败 | 3.2 |
示例
import requests
import unittest
class MyTestCase(unittest.TestCase):
'''
类名可以自定义
但必须继承 unittest.TestCase
在测试用例执行之前
要做一些事情或者进行一些初始化的操作
在测试用例执行之后,做一些收尾的操作
'''
def setUp(self):
""" 在测试用例执行之前执行的方法 """
self.response = requests.get(url='http://ip:port/getSku?id=1')
print("在测试用例执行之前触发我执行", self.response.json())
def tearDown(self):
""" 在测试用例执行之后执行的方法 """
print("在测试用例执行之后触发我执行")
del self.response
def runTest(self):
self.assertEqual('success1', self.response.json()['message'])
if __name__ == '__main__':
unittest.main()
执行结果
在测试用例执行之前触发我执行 {'code': '0', 'message': 'success', 'data': {'skuId': 1, 'skuName': 'ptest-1', 'price': '807', 'stock': 117, 'brand': 'testfan'}
}
在测试用例执行之后触发我执行
F
======================================================================
FAIL: runTest (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "4.断言.py", line 59, in runTest
self.assertEqual('success1', self.response.json()['message'])
AssertionError: 'success1' != 'success'
- success1
? -
+ success
----------------------------------------------------------------------
Ran 1 test in 0.401s
FAILED (failures=1)
注:
-
用例执行通过,用
.
表示 -
执行失败用
F
表示,并且输入失败的描述信息 -
一般的
self.assertEqual(a, b, msg)
:- a:表示预期值
- b:实际执行结果
- 如果
a!=b
,则断言失败 -
msg
(可选参数)如果你想自定义断言信息,使用msg参数,msg="自定义断言信息"
网友评论