分类: LINUX
2010-02-08 21:32:18
import unittest
import modelExample
import wx
class TestExample(unittest.TestCase): #1 声明一个TestCase
def setUp(self): #2 为每个测试所做的配置
self.app = wx.PySimpleApp()
self.frame = modelExample.ModelExample(parent=None, id=-1)
def tearDown(self): #3 测试之后的清除工作
self.frame.Destroy()
def testModel(self): #4 声明一个测试(Test)
self.frame.OnBarney(None)
self.assertEqual("Barney", self.frame.model.first,
msg="First is wrong") #5 对于可能的失败的断定
self.assertEqual("Rubble", self.frame.model.last)
def suite(): #6 创建一个TestSuite
suite = unittest.makeSuite(TestExample, 'test')
return suite
if __name__ == '__main__':
unittest.main(defaultTest='suite') #7 开始测试
#1:声明unittest.TestCase的一个子类。为了最好的使每个测试相互独立,测试执行器为每个测试创建该类的一个实例。
#2: setUp()方法在每个测试被执行前被调用。这使得你能够保证每个对你的应用程序的测试都处在相同的状态下。这里我们创建了一个用于测试的框架(frame)的实例。
#3 :tearDown()方法在每个测试执行完后被调用。这使得你能够做一些清理工作,以确保从一个测试转到另一个测试时系统状态保持一致。通常这里包括重置全局数据,关闭数据库连接等诸如此类的东东。这里我们对框架调用了Destroy(),以强制性地使wxWidgets退出,并且为下一个测试保持系统处在一个良好的状态。
#4 :测试方法通常以test作为前缀,尽管这处于你的控制之下(看#6)。测试方法不要参数。我们这里的测试方法中,通过调用OnBarney事件处理器方法来开始测试行为。
#5 :这行使用assertEqual()方法来测试模型对象的改变是否正确。assertEqual()要两个参数,如果这两个参数不相等,则测试失败。所有的PyUnit断定方法都有一个可选的参数msg,如果断定失败则显示msg(msg的默认值几乎够表达意思了)
#6: 这个方法通过简单有效的机制创建一组测试。makeSuite()方法要求一个Python的类的对象和一个字符串前缀作为参数,并返回一组测试(包含该类中所有前缀为参数“前缀”的方法)。还有其它的机制,它们使得可以更明确设置测试组中的内容,但是makeSuite()方法通过足够了。我们这里写的suite()方法是一个样板模板,它可被用在你的所有测试模块中。
#7 :这行调用了PyUnit的基于文本的执行器。参数是一个方法的名字(该方法返回一测试组)。然后suite被执行,并且结果被输出到控制台。如果你想使用GUI测试执行器,那么这行调用应使用unittest.TextTestRunner的方法而非unittest.main。
在控制台中PyUnit测试的结果如下:
.
Ran 1 test in 0.190s
OK
这是一个成功的测试。第一行的"."号表明测试成功。每个测试都得到一个字符并显示在这行。"."表明成功,"F"表明失败,"E"表明错误。然后是一个简单的列表,其中包含测试的数量、总的测试时间和OK,OK表明所有测试通过。
对于一个失败或错误的测试,你将得到一堆跟踪提示(显示了Python得到的错误处的情况)。比如,如果你将#5改为{{{self.assertEqual("Fife", self.frame.model.first)}}},我们将得到如下结果:
F
======================================================================
FAIL: testModel (__main__.TestExample)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\wxPyBook\book\1\Blueprint\testExample.py", line 18, in testModel
self.assertEqual("Fife", self.frame.model.last)
File "c:\python23\lib\unittest.py", line 302, in failUnlessEqual
raise self.failureException, \
AssertionError: 'Fife' != 'Rubble'
----------------------------------------------------------------------
Ran 1 test in 0.070s
FAILED (failures=1)
"F"表明了失败,“testModel”是产生失败的方法名,下面的跟踪显示出18号上的断定失败,以及失败的原因。你一般需要根据这些去找到产生失败的实际位置。