python的unittest

学习python也好,selenium自动化也好,对于测试来说unittest有着举足轻重的地位,unittest中最核心的四个概念是:test case, test suite, test runner, test fixture

1.TestCase就是测试用例,在python中以类的形式存在,包括setUp,run,tearDown,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证,一个class继承了unittest.TestCase,便是一个测试用例,但如果其中有多个以 test 开头的方法,那么每有一个这样的方法,在load的时候便会生成一个TestCase实例,如:一个class中有四个test_xxx方法,最后在load到suite中时也有四个测试用例。

2.也就是说,多个测试用例集合在一起就是TestSuite,而且TestSuite也可以嵌套TestSuite。

所以流程是:

写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。这里加个说明,在Runner执行时,默认将执行结果输出到控制台,我们可以设置其输出到文件,在文件中查看结果(你可能听说过HTMLTestRunner,是的,通过它可以将结果输出到HTML中,生成漂亮的报告,它跟TextTestRunner是一样的)。

需要注意的是:1.用例(class)中的测试方法名均以test开头,2.测试法的执行顺序和排列顺序无关,3.在unittest.main()中加 verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果;如果设为 2,则输出详细的执行结果

TestSuite可以控制测试方法的执行顺序,如果有多个测试文件也可以进行组织

 参考代码:

 

import unittest
from 测试文件名 import 测试用例class

if __name__ == '__main__':
    suite = unittest.TestSuite()

    tests = [用例class("方法1名"), 用例class("方法2名"), 用例class("方法3名")]
    suite.addTests(tests)

    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

 

测试完成后可以将结果输出到文件:

import unittest
from test_mathfunc import TestMathFunc

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMathFunc))

    with open('UnittestTextReport.txt', 'a') as f:
        runner = unittest.TextTestRunner(stream=f, verbosity=2)
        runner.run(suite)

注意:执行suite时应该在用例文件中关闭执行入口,否则无法执行

test fixture:

setUp()在每个测试方法执行之前执行一次,tearDown()在每个测试方法执行之后执行一次

setUpclass()在所有case执行之前执行一次,tearDownclass()在所有case执行之后执行一次

跳过某个case不执行:

使用skip装饰器,如在方法头上@unittest.skip()

skip装饰器一共有三个 unittest.skip(reason)unittest.skipIf(condition, reason)unittest.skipUnless(condition, reason),skip无条件跳过,skipIf当condition为True时跳过,skipUnless当condition为False时跳过。

TestCase.skipTest()方法,如直接在方法内加入self.skipTest()

以上内容大部分来自于csdn@灰蓝

HTMLTestRunner:

 也很简单,萌新直接用大神的原版(原版不适用与python3.x)或者修改过的版本,这里还是用的灰蓝大神的修改版

自己的代码:

import unittest
from loginCase import LoginCase
from HTMLTestRunner_PY3 import HTMLTestRunner
if __name__ == '__main__':
    suite = unittest.TestSuite()
    tests = [LoginCase("test_error_user"),LoginCase("test_login_success")]
    suite.addTests(tests)  
    with open('HTMLReport.html','wb+') as f:
        runner = HTMLTestRunner(stream=f,title='login test report',
                                description='generated by HTMLTestRunner.',
                                verbosity=2
                                )
        runner.run(suite)

HTMLReport结果:

代码这里有个坑!!!

因为之前照着大神的代码写是这样的:

 

with open('HTMLReport.html','w') as f:
这里参数w直接是写入模式,但是运行的时候报错了,提示TypeError: write() argument must be str, not bytes,萌新是一脸懵逼的,查了半天原来是存储方式默认是二进制,于是把w改为wb终于成功输出了报告!所以这里的文件读写这方面还得加强学习

 

posted @ 2017-10-12 18:16  heyeege  阅读(372)  评论(0编辑  收藏  举报