3.2 unittest的测试覆盖率分析
利用coverage工具可以分析单元测试的覆盖率,首先我们通过pip命令下载coverage。
pip install coverage
下载完毕,代开命令行编辑窗口,通过cd命令进入被测对象所在的目录,然后运行。
coverage run Calculatortest.py
这里Calculatortest.py为被测程序文件,测试程序被执行。最后运行如下命令,就可以看到测试覆盖报告了。
coverage report -m C:\python\unittest>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测试报告
星云测试
奇林软件
联合通测
顾翔凡言:
k=(p+m)t
其中:
k为常数。
p:团队人员质量水平,为单位小时内产生的有效质量,单位为/h;
m:团队方法质量水平,为单位小时内产生的有效质量,单位为/h;
t:为单位质量产品的交付时间,单位为h。
在团队方法质量水平不变,团队人员质量水平提高的情况下,交付时间变短;
在团队人员质量水平不变,团队方法质量水平提高的情况下,交付时间变短;
团队人员质量水平与方法质量水平乘积决定了软件的质量水平,如果这个值变小,则t变大;反之t变小。
例如,当k=4时:
当人员质量水平为1/小时、方法水平为1/小时时,交付时间为2小时。
当人员质量水平为2/小时、方法水平为1/小时时,交付时间为4/3小时。
当人员质量水平为1/小时、方法水平为2/小时时,交付时间为4/3小时。
当人员质量水平为0.5/小时、方法水平为0.5/小时时,交付时间为4小时。