python UnitTest

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)
posted @ 2020-09-12 15:53  左岸丶  阅读(137)  评论(0编辑  收藏  举报