这个写的比我写的好多了。别看我的了,看这个:https://huilansame.github.io/huilansame.github.io/archivers/python-unittest
官方文档(针对python2.7):https://docs.python.org/2/library/unittest.html
单元测试的概念和经验:https://www.zhihu.com/question/27313846
好的单元测试工具可以提高你的开发效率。由于项目是用python语言写的,因此我选择了python的unittest来进行单元测试工作。下面先简单介绍一下unittest的基本使用方法:
aim:了解unittest最基本的使用方法。让testcase跑起来。
第一步——引入unittest包
如果希望使用unittest进行单元测试,首先需要引入unittest(python默认包含unittest包)
import unittest
第二步——写一个类,继承unittest.TestCase
import unittest
class test_try(unittest.TestCase):
第三步——写testcase
注意:需要被自动执行的测试方法要以test_作为前缀,这样,testcase才能够正确识别
import unittest
class test_try(unittest.TestCase):
def test_try01(self):
print("test01")
第四步——调用我们的unittest,使其能够运行
import unittest
class test_try(unittest.TestCase):
def test_try01(self):
print("test01")
if __name__ == "__main__":
unittest.main()
执行一下:
第一关,闯关成功!
触发时间:
setUp方法——会在每个测试函数运行前运行
tearDown——每个测试函数运行完后执行
setUpClass——必须使用@classmethod 装饰器,所有test运行前运行一次
tearDownClass——必须使用@classmethod装饰器,所有test运行完后运行一次
作用:
setUp方法——可以在每个testcase执行之前实现一些初始化准备工作
tearDown——可以在每个testcase执行之后实现一些清理工作(比如把写到数据库中用于测试的数据清理掉)
例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*i-
import os
import unittest
class test_try(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("类执行之前的方法")
@classmethod
def tearDownClass(cls):
print("类执行之后的方法")
def setUp(self):
print("setUp")
def test_try01(self):
print("test01")
def test_try02(self):
print("test02")
def tearDown(self):
print("testDown")
第二关,闯关成功!
引入的方法有两种
方法一:
用于单元测试的py文件与被测试的模块处于同一目录。即
此时可以直接在单元测试的文件中引入待测试的模块
#testtt是类名
from imported_module import testtt
方法二:
如果嫌弃同一个目录下py文件太多了,可以使用包管理方式——即将py文件放入一个文件夹中,并将文件夹中添加空文件“_init_.py”。在文件夹中创建 _init_.py, 将文件夹变成一个包。
这样便于进行文件管理,否则会造成同一个文件夹里存放了许多的py文件,不方面管理。即:
引入模块的方式语句与方法一相同。
先展示一下待测试的模块(即imported_module.py文件中的内容)
#!/usr/bin/env python
# -*- coding: utf-8 -*i-
import os
class testtt():
def run(self):
a=5;
b=5;
return a/b
我们想验证一下函数run的运行结果是否是1.。于是,unittest_study.py中的内容如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*i-
import os
import unittest
from imported_module import testtt
class test_try(unittest.TestCase):
def test_try01(self):
#实例化testtt类
run = testtt()
self.assertEqual(run.run(), 1)
if __name__ == "__main__":
unittest.main()
运行一下:
测试成功了。运行的结果与预期一致。那么问题来了,assertEqual是什么?
assertEqual是unittest.TestCase中的一个函数,用于验证测试结果是否和预期相等。此时需要引入一个新朋友——断言
可以使用unitest.skip装饰器族跳过test method或者test class,这些装饰器包括:
在我们的例子中。可以在"test_"函数前面加上相应的装饰@unittest.skip('test_try02'),这样在运行的时候,会跳过该测试
class test_try(unittest.TestCase):
def test_try01(self):
print("test01")
#通过unittest.skip跳过test_try02方法,不去执行该方法
@unittest.skip('test_try02')
def test_try02(self):
print("test02")
运行结果中会显示出跳过了几个test函数。(即图中的skipped=1,说明跳过了一个test函数)
测试的各个testcase其实可以单独调用,想测哪个测哪个。
下面代码就分别测试了各个“test_”函数:
if __name__ == "__main__":
#unittest.main()
#另一种执行测试的方法。不走main方法
#创建一个容器
suite = unittest.TestSuite()
#向容器中添加待测试的case,添加的形式——类名('case名')
suite.addTest(test_try('test_try01'))
suite.addTest(test_try('test_try02'))
unittest.TextTestRunner().run(suite)
就先写到这里吧~
下一篇会介绍如何在项目中使用unittest来进行单元测试。