http://blog.csdn.net/hackerain/article/details/24095117
http://www.ibm.com/developerworks/cn/linux/l-pyunit/
https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertIsInstance
TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
TestSuite,TestSuite也可以嵌套TestSuite 个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
TextTestResult,测试的结果会保存到TextTestResult实例中包括运行了多少测试用例,成功了多少,失败了多少等信息。
test fixture 一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖TestCase的setUp()和tearDown()方法来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp()中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的TestCase留下一个干净的环境
unittest.main 整个过程集成在unittest.main模块中。
from widget import Widget
import unittest
#执行测试的类
classWidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def tearDown(self):
self.widget.dispose()
self.widget = None
def testSize(self):
self.assertEqual(self.widget.getSize(),(40, 40))
def testResize(self):
self.widget.resize(100, 100)
self.assertEqual(self.widget.getSize(),(100, 100))
#测试
if __name__ =="__main__":
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
suite.addTest(WidgetTestCase("testResize"))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
PyUnit模块中定义了一个名为main的全局方法,使用它可以很方便地将一个单元测试模块变成可以直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中的测试方法,并自动执行它们。如果Python程序员能够按照约定(以test开头)来命名所有的测试方法,那就只需要在测试模块的最后加入如下几行代码即可:
from widget import Widget
import unittest
#执行测试的类
classWidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def tearDown(self):
self.widget.dispose()
self.widget = None
def testSize(self):
self.assertEqual(self.widget.getSize(),(40, 40))
def testResize(self):
self.widget.resize(100, 100)
self.assertEqual(self.widget.getSize(),(100, 100))
#测试
if __name__ =="__main__":
unittest.main()
要执行该单元测试,可以使用如下命令:
python main_runner.py
测试类WidgetTestCase中的所有测试方法都将被自动执行,但如果只想执行testSize()方法,可以使用如下命令:
python main_runner.pyWidgetTestCase.testSize
access private method: object._className__methodName
mytest._ Test__ p_test()
access private value: object._className__attrName
mytest._ Test__ a
junit 测试私有方法或私有变量
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
method.invoke(targetObject, argObjects);
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
field.get(object)