python实验三函数的简单介绍( 六 )


...
.............................................................................................................
Ran 3 tests in 0.244s
OK
每次执行一个测试用例时,都会输出一个句点(因此上面的输出最前面有3个句点),之后是一行连接符,再之后是测试摘要(如果有任何一个测试失败,就会有更多的输出信息) 。
如果我们尝试将测试分离开(典型情况下是要测试的每个程序和模块都有一个测试用例),就不要再使用doctests,而是直接使用unittest模块的功能——尤其是我们习惯于使用JUnit方法进行测试时ounittest模块会将测试分离于代码——对大型项目(测试编写人员与开发人员可能不一致)而言,这种方法特别有用 。此外,unittest单元测试编写为独立的Python模块,因此,不会像在docstring内部编写测试用例时受到兼容性和明智性的限制 。
unittest模块定义了 4个关键概念 。测试夹具是一个用于描述创建测试(以及用完之后将其清理)所必需的代码的术语 , 典型实例是创建测试所用的一个输入文件 , 最后删除输入文件与结果输出文件 。测试套件是一组测试用例的组合 。测试用例是测试的基本单元—我们很快就会看到实例 。测试运行者是执行一个或多个测试套件的对象 。
典型情况下,测试套件是通过创建unittest.TestCase的子类实现的,其中每个名称 以“test”开头的方法都是一个测试用例 。如果我们需要完成任何创建操作,就可以在一个名为setUp()的方法中实现;类似地,对任何清理操作,也可以实现一个名为 tearDown()的方法 。在测试内部 , 有大量可供我们使用的unittest.TestCase方法,包括 assertTrue()、assertEqual()、assertAlmostEqual()(对于测试浮点数很有用)、assertRaises() 以及更多 , 还包括很多对应的逆方法,比如assertFalse()、assertNotEqual()、failIfEqual()、 failUnlessEqual ()等 。
unittest模块进行了很好的归档 , 并且提供了大量功能,但在这里我们只是通过一 个非常简单的测试套件来感受一下该模块的使用 。这里将要使用的实例,该练习要求创建一个Atomic模块,该模块可以用作一 个上下文管理器,以确保或者所有改变都应用于某个列表、集合或字典,或者所有改变都不应用 。作为解决方案提供的Atomic.py模块使用30行代码来实现Atomic类, 并提供了 100行左右的模块doctest 。这里,我们将创建test_Atomic.py模块,并使用 unittest测试替换doctest,以便可以删除doctest 。
在编写测试模块之前,我们需要思考都需要哪些测试 。我们需要测试3种不同的数据类型:列表、集合与字典 。对于列表,需要测试的是插入项、删除项或修改项的值 。对于集合,我们必须测试向其中添加或删除一个项 。对于字典,我们必须测试的是插入一个项、修改一个项的值、删除一个项 。此外,还必须要测试的是在失败的情况下,不会有任何改变实际生效 。
结构上看,测试不同数据类型实质上是一样的,因此 , 我们将只为测试列表编写测试用例,而将其他的留作练习 。test_Atomic.py模块必须导入unittest模块与要进行测试的Atomic模块 。
创建unittest文件时 , 我们通常创建的是模块而非程序 。在每个模块内部,我们定义一个或多个unittest.TestCase子类 。比如,test_Atomic.py模块中仅一个单独的 unittest-TestCase子类,也就是TestAtomic (稍后将对其进行讲解),并以如下两行结束:
if name == "__main__":
unittest.main()
这两行使得该模块可以单独运行 。当然,该模块也可以被导入并从其他测试程序中运行——如果这只是多个测试套件中的一个,这一点是有意义的 。

推荐阅读