unittest单元测试框架,使用该框架时,类需要继承unittest.TestCase ,在测试的类中,定义测试case.
方式一:unittest.main()执行测试用例,该方式在执行测试用例的时候只会执行以test开头的用例,执行的先后顺序是按照a-z的顺序
class TestStringMethods(unittest.TestCase):
"""docstring for TestStringMethods"""
def test_upper(self):
self.assertEqual('foo'.upper(),'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(),['hello','world'])
with self.assertRaises(TypeError):
s.split(2)
def ask_test(self):
print "-----ask_test----------"
if __name__ == '__main__':
unittest.main()
执行命令:python test.py 该命令执行的结果只会显示通过和不通过,不能够直接看到程序执行到哪一个测试用例了
在命令中加上一个 -v 在执行的时候就会显示正在执行的用例名称及结果python test.py -v
C:\Users\Administrator>python C:\Users\Administrator\Desktop\test.py -v
test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
方式二
测试套件的使用,使用测试套件的时候可以更清楚的展示整个用例的结构
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
print "---------setUp-------------"
def tearDown(self):
print "------tearDown-----------"
def test_default_size(self):
print "--------test_default_size-------------"
def test_resize(self):
print "----------test_resize--------------"
if __name__ == '__main__':
widgetTestSuite = unittest.TestSuite()
widgetTestSuite.addTest(WidgetTestCase('test_default_size'))
widgetTestSuite.addTest(WidgetTestCase('test_resize'))
unittest.TextTestRunner().run(widgetTestSuite)
setUp()和tearDown()这两个方法是做初始化和清理工作的,每执行一个case都会先执行setUp再执行case然后再执行tearDown 。将case添加到一个suite测试套件中,这样做的好处是,如果有多个不同的类测试用例,只需要将这些测试用例添加进去就可以全部执行,只添加需要执行的就可以了
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
print "---------setUp-------------"
def tearDown(self):
print "------tearDown-----------"
def test_default_size(self):
print "--------test_default_size-------------"
def test_resize(self):
print "----------test_resize--------------"
class Mtest_First(unittest.TestCase):
"""docstring for Mtest_First"""
def setUp(self):
print "-----Mtest_First----setUp------"
def tearDown(self):
print "-----Mtest_First----tearDown----------"
def M_teat(self):
print "-------Mtest_First------M_teat-------"
if __name__ == '__main__':
widgetTestSuite = unittest.TestSuite()
widgetTestSuite.addTest(WidgetTestCase('test_default_size'))
widgetTestSuite.addTest(WidgetTestCase('test_resize'))
widgetTestSuite.addTest(Mtest_First('M_teat'))
unittest.TextTestRunner().run(widgetTestSuite)
方式三
根据需求,可能在执行每个case的时候不需要初始化和清理,只需要在每个class的时候做初始化和清理,整理如下
#-*- coding:utf-8 -*-
import unittest
def setUpModule():
print "------setUpModule------"
def tearDownModel():
print "------tearDownModel-----"
class MyTest(unittest.TestCase):
"""docstring for MyTest"""
# 每个case执行一次setUp和tearDown
def setUp(self):
print "-----setUp------"
def tearDown(self):
print "--------tearDown------"
# 每个class执行一次setUp和tearDown
@classmethod
def setUpClass(cls):
print "----setUpClass"
@classmethod
def tearDownClass(cls):
print "-------tearDownClass---------"
def test_firat(self):
print "-----test_firat-------"
def teat_second(self):
print "------teat_second-------"