UnitTest
单元测试框架,使用时需要导入unitest,所有测试类需要继承unittest.TestCase
import unittest
class Test_A(unitest.TestCase):
def test_01(self):
print('test_01')
if __name__ == "__main__":
unittest.main()
命令行执行
python -m unittest testFile.py
TestFixture
代表了执行一个或多个测试用例所需要的准备工作,以及所有相关的清除工作。比如创建临时的或者代理的数据库,文件夹或者启动服务器。
import unittest
class Test_A(unitest.TestCase):
def setUp(self):
print('setUp')
def tearDown(self):
print('tearDown')
def test_01(self):
print('test_01')
if __name__ == "__main__":
unittest.main()
TestCase
代表了一个单独的单元测试用例,会检查输入参数对应的反馈。unittest提供了一个基类TestCase用来创建测试用例。
case必须已test开头
import unittest
class Test_A(unitest.TestCase):
def test_01(self):
print('test_01')
if __name__ == "__main__":
unittest.main()
使用unitest.skip
装饰器族跳过test method
或者test class
@unittest.skip(reason) # 无条件跳过测试,reason描述为什么跳过测试
@unittest.skipif(conditition,reason) # condititon为true时跳过测试: 这里完全可以应用条件去控制用例是否执行了,很灵活
@unittest.skipunless(condition,reason) # condition不是true时跳过测试
基本断言方法
assertEqual(arg1, arg2, msg=None) # 验证arg1=arg2,不等则fail
assertNotEqual(arg1, arg2, msg=None) # 验证arg1 != arg2, 相等则fail
assertTrue(expr, msg=None) # 验证expr是true,如果为false,则fail
assertFalse(expr,msg=None) # 验证expr是false,如果为true,则fail
assertIs(arg1, arg2, msg=None) # 验证arg1、arg2是同一个对象,不是则fail
assertIsNot(arg1, arg2, msg=None) # 验证arg1、arg2不是同一个对象,是则fail
assertIsNone(expr, msg=None) # 验证expr是None,不是则fail
assertIsNotNone(expr, msg=None) # 验证expr不是None,是则fail
assertIn(arg1, arg2, msg=None) # 验证arg1是arg2的子串,不是则fail
assertNotIn(arg1, arg2, msg=None) # 验证arg1不是arg2的子串,是则fail
assertIsInstance(obj, cls, msg=None) # 验证obj是cls的实例,不是则fail
assertNotIsInstance(obj, cls, msg=None) # 验证obj不是cls的实例,是则fail
TestSuite
代表了测试用例及测试套件的集合,用来将测试用例聚合到一起去执行。
加载器加载
import unittest
suite = unittest.TestSuite()
loader = unittest.TestLoader()
runner = unittest.TextTestRunner()
suite.addTest(loader.loadTestsFromModule(模块名))
runner.run(suite)
----------
unittest.TestLoader().loadTestsFromMoudule(模块名) # 用的最广
unittest.TestLoader().loadTestsFromTestCase(类名)
unittest.TestLoader().loadTestsFromName(方法名)
unittest.TestLoader().loadTestsFromNames(方法名,复数形式)
自动识别加载测试用例的方法:discover
import unittest
discover = unittest.defaultTestLoader.discover(start_dir, pattern='test*.py', top_level_dir=None)
runner = unittest.TextTestRunner()
runner.run(discover)
TestRunner
import unittest
run = unittest.TextTestRunner()
run.run(suite)
TestReport
使用HTMLTestRunner生成测试报告,嫌不好看可以搜索美化版本
import unittest
import HTMLTestRunner
import datetime
if __name__ == '__main__':
# 定义测试报告的名称(日期+report.html)
now = datetime.datetime.now()
format_time = now.strftime('%Y-%m-%d %H:%M:%S')
report_name = format_time + ' ' + "Report.html"
# 构造测试套件,使用discover也行
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(模块名))
# discover = unittest.defaultTestLoader.discover(start_dir, pattern='test*.py', top_level_dir=None)
# 使用discover递归目录时,需要目录为包__init__.py
# 使用执行用例,生成报告
with open(report_name,'wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='自动化测试报告', description='详细测试用例结果', verbosity=0)
runner.run(suite)
# runner.run(discover)