import unittest
class UTest(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
if __name__ == '__main__':
unittest.main()
注:
0. unnitest 是 python 自带的库,不须要额外的安装便可用
1. 测试用例 (testcase) 都是由 unittest.TestCase 类建立的,对应的 test 开头的 测试方法, 如上例的 test_upper
若是只要在全部的测试用例以前和以后只执行一次,则用 setUpClass() 和 tearDownClass()
若是全部的测试用例都须要执行的一些共同步骤能够放在setUp(), 若是作一次就对全部的测试用例生效的就放在setUpClass(),譬如登录(coolie对全部的测试用例均可以共享)
setupClass() 和 tearDownClass() 必需加上装饰器 @classmethod, 不然会出错。 setUp() 和
tearDown() 则不用。
3. unittest.main()提供了一个测试脚本的命令行接口。
4. 其余途径运行测试用例有:
suite = unittest.TestLoader().loadTestsFromTestCase(UTest)
unittest.TextTestRunner(verbosity=2).run(suite)
5. 命令行: python -m unittest test_module.TestClass 和 python -m unittest test_module.TestClass.test_method
如上面的例子:python -m unittest UTest.UTest
python -m unittest UTest.UTest.test_upper
还能够传一个 -v 标志 来获取 更详细的测试结果:python -m unittest -v test_module
如上例: D:\Python>python -m unittest -v UTest
结果: test_isupper (UTest.UTest) ... ok
test_upper (UTest.UTest) ... ok
6. 要运行一个class 里的 全部测试用例(全部test开头的方法),有如下几种方法:
A. unittest.main() 对应的命令行 是 ptyon module.py
B. suite = unittest.TestLoader().loadTestsFromTestCase(UTest)
unittest.TextTestRunner(verbosity=2).run(suite)
对应的命令行是 python -m unittest test_module.TestClass
C. 新建一个TestSuite 实例,而后一个一个的把全部的测试用例加到这个测试集,最后经过 TextTestRunner 这个对象的run方法运行测试集
如,此方法比较繁琐,加入有50个测试用例,须要手动的把50个用例一个一个的加到TestSuite 里
suite = unittest.TestSuite()
suite.addTest(UTest('test_isupper'))
suite.addTest(UTest('test_upper'))
runner = unittest.TextTestRunner()
runner.run(suite)
可是,若是是class 里只有一个测试方法,但测试时须要不一样的测试数据,C 的方法派上用场:html
a.首先,重写TestCase类的构造函数,把input 做为构造函数的参数(因为测试方法不能传参数,因此只能在构造函数里传入须要的input),如:
def __init__(self, marketcode, stockcode, stocktype,methodName):
super(Comparison, self).__init__(methodName)
self.marketcode = marketcode
self.stockcode = stockcode
self.stocktype = stocktype
b. 而后是测试用例方法对input的引用
def test_getPriceInfo(self):
stime = Utils.getTimestamp()
mkt_price = ParseResponse.getMarketLastPrice(self.marketcode,self.stockcode,self.stocktype)
position_price = ParseResponse.getPositionLastPrice(self.loginKey,self.loginCookie,self.stockcode,self.marketcode)
self.infoDir["timestamp"] = stime
self.infoDir["ticker"] = self.marketcode + self.stockcode
self.infoDir["postionprice"] = position_price
self.infoDir["marketprice"] = mkt_price
AlertRecorder.cmpMktPosition(self.infoDir)
print self.infoDir
c. 最后在class 外定义一个运行的方法,其中 Comparison(stockInfo[0],stockInfo[1],stockInfo[2], "test_getPriceInfo") 便是建立一个测试类示例,test_getPriceInfo为测试用例方法名,这个是 unittest.TestCase类须要的参数。python
def run():
suite = unittest.TestSuite()
stockInfoList = Scheduler.get_mktPostion_stocks()
for stockInfo in stockInfoList:
suite.addTest(Comparison(stockInfo[0],stockInfo[1],stockInfo[2], "test_getPriceInfo"))
runner = unittest.TextTestRunner()
runner.run(suite)
综上,封装起来为:
A. .main(verbosity=2), 其中verbosity=2 是使得结果输出时更详细
B.
def run():
suite = unittest.TestLoader().loadTestsFromTestCase(testCaseClassName)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
C.
def run():
suite = unittest.TestSuite()
suite.addTest(testCaseClassName('test_method'))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
注意:上述三个运行测试的方法,在IDE上的输出结果有点差异。A 和 C 输出的结果:
set up for class
test_isupper (__main__.UTest) ... ok
test_sum (__main__.UTest) ... ok
test_upper (__main__.UTest) ... ok
而B输出结果为:
test_sum (__main__.UTest) ... ok
test_upper (__main__.UTest) ... ok
set up for class
test_isupper (__main__.UTest) ... ok
优先仍是用 unittest.main() 和 unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(testCaseClassName))
7. 若是要跳过测试,则能够用到 装饰器 @unittest.skip("reason") 和 @unittest.skipIf(condition,'reason'). 若是是针对个别测试用例,则在 测试用例方法加装饰器。若是须要跳过全部的测试(譬如节假日)则在 setUpClass 上加装饰器。这种状况下得注意两个装饰器的前后顺序,先@classmethod 后 @unittest.skipIf()。如:
@classmethod
@unittest.skipIf(True, "To skip the test")
def setUpClass(cls):
print 'set up for class'
另外,setUp()也能够跳过全部的测试,不过和 setUpClass 有区别: setUpClass 是一次性跳过全部的测试,运行结果显示运行0个测试: Ran 0 tests in 0.000s OK (skipped=1)
但setUp 则是每一个测试用例都跳过运行,显示结果是跑了N 个,跳过N 个:
test_isupper (__main__.UTest) ... skipped '...reason...'
test_sum (__main__.UTest) ... skipped '...reason...'
test_upper (__main__.UTest) ... skipped '...reason...'
8. 若是要得到测试结果中运行的测试用例的总数以及成功和失败的总数,能够从unittest.TestResult 中得到 失败的个数和运行的总数
suite = unittest.TestLoader().loadTestsFromTestCase(UTest)
runner = unittest.TextTestRunner(verbosity=2)
result = runner.run(suite)
print result.testsRun #运行的测试用例的总数
print len(result.failures) #失败的测试用例的数目
关于 failures: A list containing 2-tuples of TestCase instances and strings holding formatted tracebacks. Each tuple represents a test where a failure was explicitly
signalled using the TestCase.assert*() methods.