unitTest&HTMLTestRunner:初探

================背景======================html


公司的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。因此就直接輸出到了控制面板。
那麼我要作的事情就是:
 
step1:本身初始化一個HTMLTestRunner,並傳入一個文件流。
因此就有了:
f = open("C:\\Users\\Administrator\\Desktop\\testLogin_result.html","w")
ht = HTMLTestRunner.HTMLTestRunner(f)  #此處請注意:f必定要是一個具備write方法的文件流。
 
step2:將ht做爲參數傳入main函數中。理由:main(unittest.testProgram類)在初始化時,有設置testRunner.若是有值傳入,則使用傳入的testRunner,不然使用默認值。
 
  HTMLTestRunner.main(testRunner=ht)
 
ps:接下來就是,在fail或者error的狀況下,進行截圖功能了。
相關文章
相關標籤/搜索