如果想要从其他测试程序中运行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()方法 。
正如我们已经看到的,Python的测试模块易于使用,并且极为有用,在我们使用 TDD的情况下更是如此 。它们还有比这里展示的要多得多的大量功能与特征——比如,跳过测试的能力,这有助于理解平台差别——并且这些都有很好的文档支持 。缺失的一个功能——但nose与py.test提供了——是测试发现,尽管这一特征被期望在后续的Python版本(或许与Python 3.2—起)中出现 。
性能剖析(Profiling)
如果程序运行很慢,或者消耗了比预期内要多得多的内存,那么问题通常是选择的算法或数据结构不合适,或者是以低效的方式进行实现 。不管问题的原因是什么,最好的方法都是准确地找到问题发生的地方,而不只是检査代码并试图对其进行优化 。随机优化会导致引入bug,或者对程序中本来对程序整体性能并没有实际影响的部分进行提速,而这并非解释器耗费大部分时间的地方 。
在深入讨论profiling之前,注意一些易于学习和使用的Python程序设计习惯是有意义的,并且对提高程序性能不无裨益 。这些技术都不是特定于某个Python版本的,而是合理的Python程序设计风格 。第一,在需要只读序列时,最好使用元组而非列表; 第二,使用生成器,而不是创建大的元组和列表并在其上进行迭代处理;第三,尽量使用Python内置的数据结构 dicts、lists、tuples 而不实现自己的自定义结构,因为内置的数据结构都是经过了高度优化的;第四,从小字符串中产生大字符串时,不要对小字符串进行连接,而是在列表中累积,最后将字符串列表结合成为一个单独的字符串;第五,也是最后一点,如果某个对象(包括函数或方法)需要多次使用属性进行访问(比如访问模块中的某个函数),或从某个数据结构中进行访问,那么较好的做法是创建并使用一个局部变量来访问该对象 , 以便提供更快的访问速度 。
- mongodb入门教程 mongodb第三节怎么过
- mongodb分片集中的三种角色包含 mongodb切片是什么意思
- 如何理解三个代表重要思想的历史地位 如何理解mongodb
- mongodb最佳实践 mongodb基础实验
- mongodb使用案例 mongodb基础操作实验
- 办公室是三角形 mysql8从零开始学
- mongdb python pythonmongodb操作
- mysql三表连接查询sql语句 mysql内连接三个个表
- MySQL创建三个表只能出来一个 mysql创建三个表
- mysql第三章综合练习
