1、 html
Python 的單元測試中,通常一個測試程序文件負責測試 Python 的一個模塊,或者一個模塊中的一個代碼文件。它們常常以 test_somemodule.py 或 testSomeModule.py 的名字命名;通常保存在被測試模塊的一個子目錄 tests 中,也有就保存在該模塊的根目錄的。 python
若是要編寫一個測試程序,須要以 unittest.TestCase 爲基類派生,這樣 unittest 就能夠自動找到這些測試類了。這樣的一個測試類中,凡是以「test」開頭的方法,都是一個測試用例。 app
unittest 會自動統計測試用例的個數,並在最後的測試報告中指出測試成功了幾個,有那些失敗。TestCase 還有兩個頗有用的方法:在每一個測試用例執行以前,寫在 setUp 中的代碼都會被執行,用來初始化測試環境;而 tearDown 中的代碼則負責清除每一個測試用例遺留的垃圾,恢復現場。
curl
import unittest import commands class TSCache(object): def __init__(self): # suit initial print "case %s"%self def doRequest(self): comm = "curl -I -s -x localhost:8080 http://111111.cn/index.html" output = commands.getoutput(comm) rt = output.split("\r\n")[0] return rt class TestTSCache(unittest.TestCase): #run before every test method def setUp(self): print 'test before' def test_200Code(self): active = TSCache().doRequest() expect = 'HTTP/1.1 200 OK' self.assertEquals(expect,active) def test_not404(self): active = TSCache().doRequest() expect = 'HTTP/1.1 404 OK' self.assertNotEquals(expect,active) #run after every test mehtod def tearDown(self): print 'test after' if __name__ == '__main__': #print dir(TestTSCache) unittest.main()
2、運行 單元測試
python xxxx.py 測試
python xxxx.py -v ui
3、結果 url
OK spa
Fail code
Error
4、assert
類型 | 功能 |
assertEqual | |
assertEquals | |
assertNotEqual | |
assertNotEquals | |
assertAlmostEqual | |
assertAlmostEquals | |
assertNotAlmostEqual | |
assertNotAlmostEquals | |
assertTrue | |
assertFalse | |
assertRaises |
說明: #當assertEquals失敗時,會把第一個和第二個參數的值打印出來;#assertFalse和assertTrue不會打印值
3、testsuit
程序的開頭把當前目錄、上一級目錄和子目錄 tests 都放入系統搜尋路徑中。這是爲了 Python 程序 import 模塊代碼和測試代碼時更容易找到它們。緊接着,在當前目錄和子目錄 tests 中搜尋全部測試程序,把它們的列表加入到 modules_to_test 中。suite 方法根據前面定義的列表把全部測試用例都找出來。最後經過調用 unittest 的 testrunner 就能夠啓動咱們的全部測試了,咱們只要稍等一下子,它就會把最終的測試報告放到咱們面前
import unittest import sys import os import getopt """ path = "/home/wb-yinlu/Beryl/study/Module/Cache/123457_cachexample.py" path = "/home/wb-yinlu/Beryl/study/Module/Cache/*.py" path = "/home/wb-yinlu/Beryl/study/Module/Cache/" """ def getcase(path): testfiles = [] if os.path.isdir(path): # curdir and subdir insert to suite for root, dirs, files in os.walk(path): files = [f[:-3] for f in files if f.startswith('1') and f.endswith('.py')] if len(files): sys.path.append(root) testfiles = testfiles + files elif os.path.splitext(path)[1]==".py": root = os.path.dirname(path) sys.path.append(root) if path[-4:] == "*.py": # curdir and subdir insert to suite,not inculde subdir testfiles = testfiles + [f[:-3] for f in os.listdir(root) if f.startswith('1') and f.endswith('.py')] else: if os.path.isfile(path): # single py file insert to suite testfiles = testfiles+[os.path.basename(path)[:-3]] else: print "the python file is not exist" sys.exit(1) else: print "it is not a dir or a effective python file path" sys.exit(1) return testfiles def suite(path): print "path = %s"%path alltests = unittest.TestSuite() for module in map(__import__, getcase(path)): alltests.addTest(unittest.findTestCases(module)) return alltests def usage(): print "help help help" if __name__ == '__main__': path = os.curdir ver= 1 opts, args = getopt.getopt(sys.argv[1:], "p:hv",["path=","help"]) for op, value in opts: if op == '-p': path = value elif op == '-v': ver=value elif op == '-h': usage() sys.exit(1) else: pass #unittest.main(defaultTest='suite') runner = unittest.TextTestRunner(verbosity=ver) runner.run(suite(path))
4、
運行測試套
一、命令模式
python -m unittest test_module1 test_module2 python -m unittest test_module.TestClass python -m unittest test_module.TestClass.test_method二、main設置
# unittest.main() # 用這個是最簡單的,下面的用法能夠同時測試多個類 # unittest.TextTestRunner(verbosity=2).run(suite1) # 這個等價於上述但可設置verbosity=2,省去了運行時加-v suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions) suite2 = unittest.TestLoader().loadTestsFromTestCase(TestDictValueFormatFunctions) suite1 = module1.TheTestSuite() suite2 = module2.TheTestSuite() alltests = unittest.TestSuite([suite1, suite2]) unittest.TextTestRunner(verbosity=2).run(suite)