码迷,mamicode.com
首页 > Web开发 > 详细

unitTest&HTMLTestRunner:初探

时间:2015-08-19 14:48:21      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

================背景======================


公司的web UI测试项目,现在用的是unitTest模块。输出结果可以用HtmlTestRunner来输出html格式的结果。
想知道这两者的有什么区别,于是翻出来源码粗粗的看了一下
 
=============2015-08-16 晚22:15====================
 
1、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
 
1、TestResult = unittest.TestResult
2、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)

unitTest&HTMLTestRunner:初探

标签:

原文地址:http://www.cnblogs.com/Small-simple/p/4742155.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!