公司的web UI測試項目,如今用的是unitTest模塊。輸出結果能夠用HtmlTestRunner來輸出html格式的結果。
想知道這二者的有什麼區別,因而翻出來源碼粗粗的看了一下
=============2015-08-16 晚22:15====================
一、unitTest的結構:
從上圖中能夠看到有多個模塊。包括測試結果,測試執行,測試套件,其它等等。
本次,我只大概看了runner,result,main這三個模塊。由於HtmlTestrunner中大概也就繼續了這三個模塊。
先說明一下這三個模塊的基本功能:
runner:測試用例的執行,其定義了TextTestRunner(object)類。
此類中定義了run方法,並調用了result模塊中result類用來存儲執行結果。同時,在執行的時候引用了signals中方法註冊result模塊。
result:測試結果輸出定義。TestResult類,定義了開始執行用例,結束執行用例。添加成功,失敗,異常。並格式化輸出測試結果。
main:"""Unittest main program""" 。導入了runner,loader模塊。應該全部的unitTest的執行,都今後處開始。沒看太多。
其它的模塊。。表示沒有看。signals裏面有調用signal模塊,有註冊機制,有時間再研究。
loader是加載測試用例模塊。。呵呵,也沒看,就掃了一眼。
suite從字面看就是測試套件相關的模塊。
==================HtmlTestRunner 作了什麼?===================
從官網下載下來了HtmlTestRunner.py文件。
它主要是改變了unitTest的最終的輸出樣式,使用HTML的樣式。
那麼修改了哪些模塊呢,或者繼承了哪些模塊並作了修改呢?
主要是兩個文件:
runner.py
result.py
main.py
一、TestResult = unittest.TestResult
二、unittest.TestProgram(來自main.py)
首先unittest是從main.py開始執行的,默認使用其本身的run方法,並默認使用text的樣式輸出。
那麼要改爲html的格式就必須:
1)有一個HTML模板,輸出均按這個模板來輸出;所以,提供了一個html模塊類。
2)定義一個result類,並繼承unittest的result類,重寫其中須要增長或者修改的方法;class _TestResult(TestResult):
3)定義HTMLTestRunner類,繼承了HTML模板類。在初始化函數中,提供了輸出參數,默認爲控制面板輸出。用戶可自定義輸出到文件。重寫了run方法,並使用2)中類輸出;
4)從新定義TestProgram類,並將其初始化中使用HTMLTestRunner
class TestProgram(unittest.TestProgram)
"""
A variation of the unittest.TestProgram. Please refer to the base
class for command line parameters.
"""
def runTests(self):
# Pick HTMLTestRunner as the default test runner.
# base class's testRunner parameter is not useful because it means
# we have to instantiate HTMLTestRunner before we know self.verbosity.
if self.testRunner is None:
self.testRunner = HTMLTestRunner(verbosity=self.verbosity)
unittest.TestProgram.runTests(self)
ps:仍然是用了unittest.TestProgram.runTests(),只是將本身傳進去,去初始化一些值。
麼看太明白!重寫了runTests方法,但最後又調用了TestProgram.runTests(self)。幾個意思?
==================咱們該如何使用HtmlTestRunner===================
既然它只是作了部分修改,那咱們必須即便用unitTest,也使用HtmlTestRunner
import unittest
if __name__ == "__main__":
if len(sys.argv) > 1:
argv = sys.argv
else:
argv=['test_HTMLTestRunner.py', 'Test_HTMLTestRunner']
unittest.main(argv=argv)
# Testing HTMLTestRunner with HTMLTestRunner would work. But instead
# we will use standard library's TextTestRunner to reduce the nesting
# that may confuse people.
#HTMLTestRunner.main(argv=argv)
看做者提供的例子,是調用HTMLTestRunner.main(argv=argv)方法開始
尚未看的太明白,但大概知道了個流程。。。要開始必須從HTMLTestRunner的main開始。輸出的結果纔是。。。html的格式。
用例仍是用unitTest寫。只在main的時候,調用HTMLTestRunner.main(argv=argv)。由於它的main走的仍是unitTest的runTest,只不過咱們修改了其某些參數。
runTest函數內容:
def runTests(self):
if self.catchbreak:
installHandler()
if self.testRunner is None:
self.testRunner = runner.TextTestRunner
if isinstance(self.testRunner, (type, types.ClassType)):
try:
testRunner = self.testRunner(verbosity=self.verbosity,
failfast=self.failfast,
buffer=self.buffer)
except TypeError:
# didn't accept the verbosity, buffer or failfast arguments
testRunner = self.testRunner()
else:
# it is assumed to be a TestRunner instance
testRunner = self.testRunner
self.result = testRunner.run(self.test)
if self.exit:
sys.exit(not self.result.wasSuccessful())
main = TestProgram
================2015-08-19 下午 14:10 =====================
今天在公司的項目上,使用了HTMLTestRunner類。
首先,在寫好testCase以後,直接調用了HTMLTestRunner.main()就能夠運行了。
可是,結果直接輸出在了eclipse的Console裏面。並且是html代碼,特別不方便讀取。
須要增長輸出到文件。
再次翻閱了一下源碼,增長了以下處理,於可將測試生成到指定文件了:
if __name__ == '__main__':
f = open("C:\\Users\\Administrator\\Desktop\\testLogin_result.html","w")
ht = HTMLTestRunner.HTMLTestRunner(f)
HTMLTestRunner.main(testRunner=ht)
f.close()
這樣處理的緣由:
在HTMLTestRunner.main()方法,並無從新定義初始化方法,而是沿用了unitTest的testProgram(即main)的初始化方法。
只是改寫了runTest()方法,將默認了的runner從runner.TextTestRunner修改爲了HTMLTestRunner.HTMLTestRunner。
源代碼以下:
class TestProgram(unittest.TestProgram):
def runTests(self):
# Pick HTMLTestRunner as the default test runner.
# base class's testRunner parameter is not useful because it means
# we have to instantiate HTMLTestRunner before we know self.verbosity.
if self.testRunner is None:
self.testRunner = HTMLTestRunner(verbosity=self.verbosity)
unittest.TestProgram.runTests(self)
main = TestProgram
可是,HTMLTestRunner.HTMLTestRunner的初始化方法,默認的輸出就是stream=sys.stdout。因此就直接輸出到了控制面板。
step2:將ht做爲參數傳入main函數中。理由:main(unittest.testProgram類)在初始化時,有設置testRunner.若是有值傳入,則使用傳入的testRunner,不然使用默認值。