單元測試工具(連載9)
- 2019 年 12 月 12 日
- 筆記
3.2 unittest的測試覆蓋率分析
利用coverage工具可以分析單元測試的覆蓋率,首先我們通過pip命令下載coverage。
pip install coverage
下載完畢,代開命令行編輯窗口,通過cd命令進入被測對象所在的目錄,然後運行。
coverage run Calculatortest.py
這裡Calculatortest.py為被測程式文件,測試程式被執行。最後運行如下命令,就可以看到測試覆蓋報告了。
coverage report -m
C:pythonunittest>coverage report -m
Name Stmts Miss Cover Missing
————————————————-
Calculator.py 17 0 100%
CalculatorTest.py 44 0 100%
————————————————-
TOTAL 61 0 100%
3.3 unittest的斷言
關於unittest的斷言,參見表4所示。
表4 unittest的斷言
斷言方法 |
斷言描述 |
---|---|
assertEqual(a, b[, msg=None]) |
判斷a==b,測試通過(用於數字) |
assertNotEqual(a, b[, msg=None]) |
判斷a!=b,測試通過 |
assertAlmostEqual(a, b[, places, …]) |
判斷a==b,測試通過(places為浮點數精度) |
assertTrue(x[, msg=None]) |
bool(x) 為真,測試通過 |
assertFalse(x[, msg=None]) |
bool(x) 為假,測試通過 |
assertIs(a, b[, msg=None]) |
a與bl相同,測試通過 |
assertIsNot(a, b[, msg=None]) |
a與b,測試通過 |
assertIsNone(x[, msg=None]) |
x 是空,測試通過 |
assertIsNotNone(x[, msg=None]) |
x 不是空,測試通過 |
assertIn(a, b[, msg=None]) |
a 包含b,測試通過 |
assertNotIn(a, b[, msg=None]) |
a 不包含 b,測試通過 |
assertIsInstance(a, b[, msg=None]) |
a是b的一個實例 ,測試通過 |
assertNotIsInstance(a,b[, msg=None]) |
a不是b的一個實例 ,測試通過 |
assertDictContainsSubset(a,b[,msg=none]) |
a字典中是否包含b |
assertDictEqual(a, b[,msg=none]) |
兩個字典是否相等 |
assertGreater(a, b[,msg=none]) |
a>b |
assertGreaterEqual(a, b[,msg=none]) |
a>=b |
assertItemsEqual(expected_seq,actual_seq[,msg=none]) |
一個無序的序列特異性的比較。 |
assertListEqual(list1,list2[,msg=none]) |
list1與list2是否相等. |
assertMultiLineEqual(first, second[,msg=none]) |
2個多行字元串是相等的 |
assertNotRegexpMatches(text,unexpected_regexp) |
如果文本匹配正則表達式,將失敗。 |
assertRaises(excClass[, callableObj]) |
除非excclass類拋出異常失敗 |
assertRaisesRegexp(expected_exceptn, …) |
認為在引發異常的情況下消息匹配一個正則表達式。 |
assertRegexpMatches(text,expected_regexp[,msg=none]) |
測試失敗,除非文本匹配正則表達式。 |
assertSequenceEqual(seq1,seq2[, msg,seq_type]) |
有序序列的相等斷言 (like lists and tuples) |
3.4 unittest批量運行及報告產生
同JUnit一樣,unittest也可以進行批量測試,並且可以在測試完畢形成一個HTML格式的測試報告。為了實現HTML格式的測試報告,可以先到http://tungwaiyip.info/software/HTMLTestRunner.html下載HTMLTestRunner.py文件放入到%PYTHON_HOME%Lib目錄下。如果使用的是Python X系列就不需要進行修改,Python 3.X系列請作如下修改。
94行import StringIO改為import io 539行self.outputBuffer = StringIO.StringIO()改為self.outputBuffer = io.StringIO() 631行print >>sys.stderr, 'nTime Elapsed: %s' % (self.stopTime-self.startTime)改為print (sys.stderr, 'nTime Elapsed: %s' % (self.stopTime-self.startTime)) 642行if not rmap.has_key(cls):改為if not cls in rmap: 766行 uo = o.decode('latin-1')改為uo = o 772行ue = e.decode('latin-1')改為ue = e |
---|
下面是unittest批量運行及報告產生的程式碼。
案例7:unittest批量運行及報告產生。
#!/usr/bin/env python
#coding:utf-8
import unittest
from HTMLTestRunner import HTMLTestRunner#導入HTMLTestRunner
test_dir='./'#測試的工作目錄
discover=unittest.defaultTestLoader.discover(test_dir,pattern="*Test.py")#"*Test.py"為測試的文件,支援正則表達式
if __name__=='__main__':
runner=unittest.TextTestRunner()#運行符合條件的測試文件
#以下用於生成測試報告
fp=open("result.html","wb")#result.html為測試報考名
runner=HTMLTestRunner(stream=fp,title='測試報告',description='測試用例執行報告')
runner.run(discover)
fp.close()
測試報告如圖30所示。

圖30 unittest測試報告
星雲測試
http://www.teststars.cc
奇林軟體
http://www.kylinpet.com
聯合通測
http://www.quicktesting.net