写在之前:
之所以写这篇文档,有两个原因:
1、为了更深入了解unittest,本来是打算看源码学习的,但发现,不是一天两天的事,所以就想先把官方文档理解透了再来看源码。
2、给不想读英文文档的小伙伴一点贡献吧。
3、本人英文水平有限,有理解错误或者解释有出入的地方,还望多多指教。
官方文档链接:https://docs.python.org/3/library/unittest.html
26.4.unittest— 单元测试框架
源码:Lib/unittest/__init__.py
(如果您已经熟悉了测试的基本概念,您可能会想跳到 断言方法列表)。
unittest单元测试框架的产生最开始是受JUnit启发的,和其他语言的单元测试框架一样,有着相同的特点。它支持测试自动化、测试中启动和结束代码的共享、测试报告框架的独立性。
为了实现这些功能,unittest有以下几个重要对象概念:
test fixture:
一个test fixture 表示执行一个或多个测试前的准备工作,以及执行完成后清理工作。例如:创建临时或代理数据库或目录,或者是一个启动服务器进程。
test case:
一个test case是一个独立的测试单元,它检查特定输入是否响应特定的输出,unittest提供了一个基本类——TestCase,这个类用于创建一个或多个test case
test suite:
一个test suite是test cases、或test suites、或者两者的一个集合,它用于把想执行tests放在一起。
test runner:
一个test runner 是由两部分成分:合理安排tests的执行、提供给user输出结果。runner可以用一个图形界面、文本、或者是一个特殊的值,代表tests执行的结果。
26.4.1 基本示例
对于构建和运行tests,unittest提供了非常多的工具。本小节示例只是工具中的一小部分使用,却能满足大部分使用者的需求。
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
这是由unittest.TestCase子类创建的testcase。三个不同的tests的名字,均是以“test”开头定义的。这种命名规定,是告诉test runner哪些方法才是要执行的tests。
每一个test的关键在于,是用assertEqual()来检查是否为预期的测试结果。assertTrue() 和 assertFalse() 是用来验证条件, assertRaises()用来验证是否抛出了特定的异常。这些特定的方法代替原生assert语句,是为了test runner可以收集test结果和生成报告。
(未完待续...)
网友评论