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()
以上