unittest 框架

最近在看unittest框架,总结一下自己看到的东西

框架包括了几个内容:test case, test suite, test runner, test fixture

盗用一下网上烂大街但是还不错的图

  好吧,图片插不进来

最多废话一句,Python的unittest框架里都是用类来办事的(Python的其他框架应该也是,不过我现在没用到)

test case的类是unittest.TestCase ; test suite的类是unittest.TestSuit; test runner的类是unittest.TextTestRunner;test fixture也是unittest.TestCase类

1.首先最简单的,只用有test case就可以了

# coding:utf-8
import unittest

class TestCaseTry(unittest.TestCase):
    def test_add(self):
        self.assertEqual(3,1+2)

    def test_minus(self):
        self.assertNotEqual(4,6-4)


if __name__== "__main__" :
    unittest.main()

如上代码,创建一个类,继承于unittest.TestCase, 里面定义函数,函数一定要以test开头;然后运行unittest.main(),TestCaseTry里面的两个函数就会变成用例执行;即使类和unittest不在一个文件也没关系,只要import了测试类就行,Python就是这么灵活

2.test runner,首先我现在对testrunner的理解可能是肤浅的,以后如果深刻了我再来改;testrunner是为了testcase跑的更好 ,它可以加参数,比如说将test case结果记录到文件,(我现在也只是用到这个)

把刚刚那个文件保存为testcase.py ;然后新建一个testrun.py 

from testcase import TestCaseTry
import unittest

run=unittest.TextTestRunner()
run.run(TestCaseTry("test_add"))

跑一下,执行test_add这个测试函数,跟1没区别,下面区别来了

(一)

from testcase import TestCaseTry
import unittest

f=open("test_file.txt","w")
run=unittest.TextTestRunner(stream=f,verbosity=2)
run.run(TestCaseTry("test_add"))
f.close()

(二)

from testcase import TestCaseTry
import unittest

with open("test_file.txt",'w') as f:
    run=unittest.TextTestRunner(stream=f,verbosity=2)
    run.run(TestCaseTry("test_add"))

(一)和(二)效果一样,(一)是老方法,(二)是新方法,并且把异常处理都包含在with as里面了;效果就是创建了一个test_file.txt;把测试结果放进去了;verbosity是详细程度,注意

TextTestRunner(stream=f,verbosity=2)参数

文件内容

test_add (testcase.TestCaseTry) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

 

3.test suite,可以看到2中的例子,我只能执行一个测试用例,怎么执行多个,且让他们有序执行呢,test suite就是答案

 首先需要将测试用例加到suite中,这里要用到unittest.TestLoader类

loader=unittest.TestLoader()
namelist=loader.getTestCaseNames(TestCaseTry)

这里可以用getTestCaseNames函数也可以用类里的其他函数,如上就将类TestCaseTry里面的测试函数,都列到namelist列表中

然后将列表中的测试函数,加到suite中,下边就不分开写了,放个整的程序

import unittest
from testcase import TestCaseTry
#获取类中的测试用例
loader=unittest.TestLoader()
namelist=loader.getTestCaseNames(TestCaseTry)

#将类中的测试用例加到suite中
suite=unittest.TestSuite()
for name in namelist:
    suite.addTest(TestCaseTry(name))

#执行并写入文件
with open("test_file.txt",'w') as f:
    run=unittest.TextTestRunner(stream=f,verbosity=2)
    run.run(suite)

执行成功,log文件如下

test_add (testcase.TestCaseTry) ... ok
test_minus (testcase.TestCaseTry) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

4.最后说说test fixture,说实话这个我也是看来的,不是太清楚到底啥意思,大概就是在TestCase 类中有两个函数,一个是setup()一个是teardown().用来用例开始时设置内容,用例运行结束时清理环境,要加载TestCaseTry类里面

class TestCaseTry(unittest.TestCase):
    def setUp(self):
        self.a=3
    def test_add(self):
        self.assertEqual(self.a,1+2)

    def test_minus(self):
        self.assertNotEqual(3,self.a)

setUP大概这么用,tearDown还不知道怎么用

注意一点,Python里的类是这样写unittest.TestSuite,但是如果要创建一个类对象,一定要加括号这样写suite=unittest.TestSuite()

以上

 

posted @ 2018-04-26 14:28  mghhz816  阅读(216)  评论(0编辑  收藏  举报