|
关于python下常见的测试框架,看过一些博客,也看过一些书籍,在ipad上写过总结,但一直没有写技术博
客的习惯,所以最近才开始往博客上面转。
unittest是python里最常用的单元测试模块(我习惯说成是模块,但很多人好像都说是框架),但其实它在
集成测试、冒烟测试和其他测试中都有应用。
使用unittest框架时,测试类必须从unittest.TestCase继承。测试类主要包括3个方法:setUp,tearDown,以及
以test开头的测试用例。你可以自己选择是否要setUp和tearDown。如果有setUp和tearDown,则每个测试
用例执行的时候setUp和tearDown都会执行一遍。所以其实setUp和tearDown是有多少测试用例就执行了多
少遍。
在写测试类以及测试用例时要规定一个命名习惯,一般测试类可以以Test开头,也可以以Test结尾。测试用
例一般是以test开头。
import unittest
class RomanNumeralConverterTest(unittest.TestCase):
def setUp(self):
def tearDown(self):
def test_(self):
让测试用例执行起来
if __name__ =="__main__":
unittest.main()
unittest的基本工作方式是通过TestLoader加载测试用例为testsuite,然后通过TextTestRunner来运行testsuite
(所有的这些工作都封装在testunit.main),因此以下代码也可以将测试用例执行起来。
if __name__ =="__main__":
suite = unittest.TestLoader().loadTestsFromTestCase(RomanNumeralConverterTest)
unittest.TextTestRunner(verbosity=2).run(suite)
默认是通过loadTestsFromTestCase把所有的以test开头的测试用例都加到testsuite里面去,你也可以根据你自
己的需要选择性的加一些测试用例到testsuite。最常用的办法是利用python的sys模块去解析输入参数。如下所示
- if __name__ == "__main__":
- import sys
- suite = unittest.TestSuite()
- if len(sys.argv) == 1:
- suite = unittest.TestLoader().loadTestsFromTestCase(\
- RomanNumeralConverterTest)
- else:
- for test_name in sys.argv[1:]:
- suite.addTest(\
- RomanNumeralConverterTest(test_name))
- unittest.TextTestRunner(verbosity=2).run(suite)
- 可以将多个testsuite合并
- if __name__ == "__main__":
- import unittest
- from recipe5 import *
- suite1 = unittest.TestLoader().loadTestsFromTestCase( \
- RomanNumeralConverterTest)
- suite2 = unittest.TestLoader().loadTestsFromTestCase( \
- RomanNumeralComboTest)
- suite = unittest.TestSuite([suite1, suite2])
- unittest.TextTestRunner(verbosity=2).run(suite)
复制代码
判断测试用例算法成功与失败的方式是通过比对期望结果与被测试类函数运行结果是否相同,如相同,则测
试通过,如不同,则测试失败。主要函数有以下几个:
- assertEquals(first,second[,msg])
- assertTrue(expression[,msg])
- assertFalse(expression[,msg])
- assertRaises(exception,callable,...)
- 使用规则:assertEquals is prefered over assertTrue and assertFalse
- 不同版本的python,assert函数可能不同,所以最好在使用前阅读当前使用python unittest模块API
- def test_parsing_decade(self):
- self.assertEquals(10, self.cvt.convert_to_decimal("X"))
复制代码
优点:可以把不同的测试用例写在不同的测试类里,如边界测试写一个测试类,反面测试写一个测试类等,
方便管理。
结构清晰,知道从哪儿开始或者哪些代码是与测试相关的,如测试用例,测试类,测试suite等。
缺点: 一个测试用例也得写成测试类包含测试用例的形式,其实有时候用assert就可以了。
测试类“显得”没有什么用,这个类也没有自己的方法函数(除了setUp,tearDown,测试用例)和数
据成员等。
|
|