详解Django中的unittest及应用
本文深入解析Django项目中Python unittest单元测试框架的核心用法。详细阐述assert断言机制、TestCase类的setUp/tearDown生命周期管理,以及TextTestRunner的执行流程。通过unittest.main()和TestSuite两种启动方式,结合具体代码示例,展示如何高效构建和管理自动化测试用例。
unittest是Python标准库中内置的单元测试框架,用于编写和运行测试脚本。
关于断言
断言用于验证实际结果与预期结果是否一致。若结果符合预期,程序无额外输出;若不符合,则抛出AssertionError异常。若断言语句中指定了msg参数,则异常信息将返回该msg内容。
assert 2 == 2
assert 2 == 1 * 2
assert 2 + 0 == 1 * 2
# ----------------- 以上无任何返回效果
assert 1 > 3, 'wrong'
'''
Traceback (most recent call last):
File "D:/project_of_3期课程/day22/类.py", line 259, in <module>
assert 1 > 3, 'wrong'
AssertionError: wrong
'''
unittest模块属性说明
unittest的属性
unittest.main()函数可将单元测试模块转换为可直接运行的脚本。该函数利用TestLoader类自动查找模块内所有以“test”开头的测试方法并执行。执行顺序遵循ASCII码规则:数字(0-9)优先于大写字母(A-Z),大写字母优先于小写字母(a-z)。因此,以A开头的测试用例会优先于以a开头的用例执行。
unittest.TestSuite()类用于创建测试套件,以便将多个测试用例组合在一起运行。
unittest.TextTestRunner()类负责运行测试套件中组装的测试用例。通过调用其run()方法,并传入suite测试套件作为参数,即可执行测试。
TestCase类的属性
setUp()方法用于在测试用例执行前进行初始化工作。例如,若测试涉及数据库操作,可在此建立数据库连接并初始化数据;若测试涉及Web浏览器交互,可在此实例化浏览器对象。
tearDown()方法用于在测试用例执行后执行清理工作。例如,关闭数据库连接或关闭浏览器窗口。
assert*()系列断言方法用于判断测试通过与否。测试是否通过取决于实际结果与预期结果是否相等。
assertEqual(a, b, [msg='测试失败时打印的信息']): 断言a与b是否相等。若相等,测试用例通过。
assertNotEqual(a, b, [msg='测试失败时打印的信息']): 断言a与b是否不相等。若不相等,测试用例通过。
assertTrue(x, [msg='测试失败时打印的信息']): 断言x是否为True。若为True,测试用例通过。
assertFalse(x, [msg='测试失败时打印的信息']): 断言x是否为False。若为False,测试用例通过。
assertIs(a, b, [msg='测试失败时打印的信息']): 断言a是否指向对象b。若是,测试用例通过。
assertNotIs(a, b, [msg='测试失败时打印的信息']): 断言a是否不指向对象b。若不是,测试用例通过。
assertIsNone(x, [msg='测试失败时打印的信息']): 断言x是否为None。若是,测试用例通过。
assertIsNotNone(x, [msg='测试失败时打印的信息']): 断言x是否不为None。若不是,测试用例通过。
assertIn(a, b, [msg='测试失败时打印的信息']): 断言a是否在序列b中。若在,测试用例通过。
assertNotIn(a, b, [msg='测试失败时打印的信息']): 断言a是否不在序列b中。若不在,测试用例通过。
assertIsInstance(a, b, [msg='测试失败时打印的信息']): 断言a是否为类b的实例。若是,测试用例通过。
assertNotIsInstance(a, b, [msg='测试失败时打印的信息']): 断言a是否不是类b的实例。若不是,测试用例通过。
TextTestRunner的属性
run()方法用于运行测试套件中的测试用例,入参为suite测试套件。
unittest.TextTestRunner(verbosity=2).run(suite)
unittest框架使用
方式一:使用unittest.main()启动单元测试模块。
# coding=utf-8
import unittest
# 方式一:unittest.main()来启动单元测试模块
class MyTestCase(unittest.TestCase):
def setUp(self):
print('测试环境')
def test(self):
print('测试用例')
self.assertEquals(4, 2 * 2)
self.assertEqual(1, 3, 'something was wrong')
def tearDown(self):
print('环境销毁')
if __name__ == '__main__':
unittest.main()
方式二:将测试用例添加到TestSuite集合中,再加载所有被测试对象。
# coding=utf-8<br>import unittest<br><br>class TestCase(unittest.TestCase):
def test1(self):
print('one')
def test2(self):
print('two')
class TestCase1(unittest.TestCase):
def test1(self):
print('three')
def test2(self):
print('four')
if __name__ == '__main__':
un1 = unittest.TestLoader().loadTestsFromTestCase(TestCase)
un2 = unittest.TestLoader().loadTestsFromTestCase(TestCase1)
suite = unittest.TestSuite([un1, un2])
unittest.TextTestRunner(verbosity=2).run(suite)
至此,关于Django中unittest框架及其应用的介绍已完成。如需了解更多相关技术内容,建议查阅本站往期文章或继续浏览后续教程。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









