一、unittest一些重要概念
TestCase
测试用例是测试的最小单位,它检查特定输入集合的特定响应,unittest提供一个基类TestCase,它可以用来创建测试用例。
TestSuite
测试套件是测试用例的集合,可以是一个或者多个,用来聚集需要一起执行的测试。
TestLoader
TestLoader是用来加载TestCase到TestSuite中的
TestRunner
测试用例的执行者,并提供结果给用户或返回值来指示测试执行结果。
setUp: 测试用例执行前初始化工作
tearDown 测试用例执行后清理工作
def suite():
#方法1
suite = unittest.TestSuite(unittest.makeSuite(UcenterApi,'test'))
suite = unittest.TestSuite((suite,)) #或者直接return suite
#方法2
# suite = unittest.TestSuite()
# suite.addTest(UcenterApi('test_auth'))
# suite.addTest(UcenterApi('test_query_by_id'))
#方法2拓展
# tests = ['test_auth','test_query_by_id']
# suite = unittest.TestSuite(map(UcenterApi,tests))
return suite
if __name__ == "__main__":
now = datetime.datetime.now().strftime("%Y-%m-%d_%H%M%S")
report_name = "api_result_%s.html" % now
report_path = "/tmp/Test_Report"
mysuite = suite()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(mysuite)
runner参数:
- verbosity:更精细的输出级别
- stream:运行结果输出到文件
- failfast:如果失败停止后面的测试
二、命令行界面
运行测试
可以用命令行运行指定的测试模块、类或指定的测试方法
python -m unittest -v ucenter_api ucenter_api2 #指定多个model
python -m unittest -v test_module.TestClass #指定类
python -m unittest -v ucenter_api.UcenterApi.test_auth #指定方法
支持的参数:
-v , --verbose #详细输出
-b,--buffer #标准输出
-f,--failfast #在第一个错误或故障时停止测试运行
测试发现
找到指定目录下所有测试模块,只有匹配到文件名才能被加载。
python -m unittest discover -s /Users/jinlong/Desktop/daling_test -p "*_api.py"
支持的参数:
-s , --start-directorydirectory #执行发现的起始目录(directory),默认是当前目录(.)
-p,--pattern pattern #匹配测试文件的模式(pattern),默认是test*.py
三、跳过测试&预期失败
unittest支持跳过单个测试甚至整个测试类。此外,它支持将测试标记为“预期失败”,这是一个被破坏并将失败的测试,但不应被视为失败 TestResult
跳过测试方法
@unittest.skip('test skipping')
@unittest.skipIf(float(requests.__version__[0:4]) == 2.2,'not supported in this lib version:2.2')
@unittest.skipUnless(sys.platform.startswith("Darwin"), "requires osX")
def test_auth(self):
pass
跳过测试类
@unittest.skip('class skipping')
class UcenterApi(unittest.TestCase):
预期失败
将测试标记为预期是失败的,如果测试失败则不计为失败。
@unittest.expectedFailure
def test_query_by_id(self):
pass
四、断言
方法 检查一下:
assertEqual(a, b) a == b
assertNotEqual(a, a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)
代码实例
# -*- coding: utf-8 -*-
import unittest
class AssertionTest(unittest.TestCase):
def setUp(self):
self.test_is = "assertIs"
self.test_none = None
def test_assertion(self):
self.assertEqual(1,1,u"参数不相等")
self.assertNotEqual(1,2)
self.assertTrue(True) or self.assertTrue(1==1)
self.assertFalse(False) or self.assertFalse(1==2)
self.assertIs(self.test_is,self.test_is)
self.assertIsNone(self.test_none)
self.assertIn("a","abc")
self.assertNotIn("ad", "abc")
self.assertIsInstance('str',str)
def tearDown(self):
pass
if __name__ == "__main__":
unittest.main()
五、关于测试报告
HTMLTestRunner:
HTMLTestRunner是Python标准库的unittest模块的扩展。它生成易于使用的HTML测试报告.
使用方法:将下载下来的饿HTMLTestRunner.py放到python环境的site-packages目录下,就可以引用使用了。
with open(filename,"wb") as fp:
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='LC_API_Result',description='LC_Report')
runner.run(mysuite)