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的状况下,进行截图功能了。
相关文章
相关标签/搜索