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()
这两行使得该模块可以单独运行 。当然,该模块也可以被导入并从其他测试程序中运行——如果这只是多个测试套件中的一个 , 这一点是有意义的 。
如果想要从其他测试程序中运行test_Atomic.py模块,那么可以编写一个与此类似的程序 。我们习惯于使用unittest模块执行doctests,比如:
import unittest
import test_Atomic
suite = unittest.TestLoader().loadTestsFromTestCase(test_Atomic.TestAtomic)
runner = unittest.TextTestRunner()
pnnt(runner.run(suite))
这里 , 我们已经创建了一个单独的套件,这是通过让unittest模块读取test_Atomic 模块实现的,并且使用其每一个test*()方法(本实例中是test_list_success()、test_list_fail() , 稍后很快就会看到)作为测试用例 。
我们现在将查看TestAtomic类的实现 。对通常的子类(不包括unittest.TestCase 子类) , 不怎么常见的是,没有必要实现初始化程序 。在这一案例中,我们将需要建立 一个方法,但不需要清理方法,并且我们将实现两个测试用例 。
def setUp(self):
self.original_list = list(range(10))
我们已经使用了 unittest.TestCase.setUp()方法来创建单独的测试数据片段 。
def test_list_succeed(self):
items = self.original_list[:]
with Atomic.Atomic(items) as atomic:
atomic.append(1999)
atomic.insert(2, -915)
del atomic[5]
atomic[4]= -782
atomic.insert(0, -9)
self.assertEqual(items,
[-9, 0, 1, -915, 2, -782, 5, 6, 7, 8, 9, 1999])
def test_list_fail(self):
items = self.original_list[:]
with self.assertRaises(AttributeError):
with Atomic.Atomic(items) as atomic:
atomic.append(1999)
atomic.insert(2, -915)
del atomic[5]
atomic[4] = -782
atomic.poop() # Typo
self.assertListEqual(items, self.original_list)
这里,我们直接在测试方法中编写了测试代码,而不需要一个内部函数,也不再使用unittest.TestCase.assertRaised()作为上下文管理器(期望代码产生AttributeError) 。最后我们也使用了 Python 3.1 的 unittest.TestCase.assertListEqual()方法 。
推荐阅读
- 虎牙直播录屏可以录多长,虎牙直播可以录制吗
- 网页怎么往u盘下载歌曲,怎么下载歌曲去u盘
- 有了源码怎么搭建网站,有源码后怎么建站
- jquery页面左右分割,jquery在前端分页
- python转灰度图函数 python灰度图转换成二值图像
- java成绩等级代码,java编写成绩等级
- python爬虫阿里翻译,阿里ai翻译
- asp.net4.5是什么,aspnet20
- go语言实现京东爬虫 go 语言 爬虫