公司的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。所以就直接输出到了控制面板。
step2:将ht作为参数传入main函数中。理由:main(unittest.testProgram类)在初始化时,有设置testRunner.如果有值传入,则使用传入的testRunner,否则使用默认值。