單元測試工具(連載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