Python+unittest相关的使用总结

摘要: 研读了python官方文档有关unittest相关的部分,在此做出笔记以及记录一下使用过程的问题以及步骤。

官方文档中介绍说,unittest是受JUnit(Java)启发而成的单元测试框架,与其他主流的单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码(这个地方不懂是什么)测试。支持将测试样例聚合到测试集中,并将测试和报告框架相独立。

概念

  1. test fixture:

    表示为了开展一项或者多项测试所需进行的准备工作,以及所有相关的清理操作。比如说可能是包含临时或者代理的数据库、目录,再或者是启动一个服务器进程。

  2. test case:

    一个测试用例是一个独立的测试单元。它检测输入特定的数据时的响应。unittest提供一个基类:TestCase,用于新建测试用例

  3. test suite

    test suite是一系列的测试用例,或测试套件,或者两者皆是。他用于归档需要一起执行的测试。

  4. test runner

    测试运行器是一个用于执行和输出测试结果的组件。这个运行器可以使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。

一些其他的测试框架/模块

  • doctest – 文档测试模块

    python中另一个风格不同的测试模块

  • pytest

    第三方单元测试框架,提供轻量化的语法来编写测试,例如assert func(100) == 10000。

  • Robot Framework

    Robot Framework 是一款基于 Python 的功能自动化测试框架。它具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。

基本实例

简短的代码进行测试三种字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import uniitest
class Test_string(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_upper(self):
self.assertTrue('foo'.upper(),'FOO') #使用断言进行判断内容是否相同

def test_isupper(self):
self.assertTrue('FOO'.isupper()) #使用断言判断内容是否为True
self.assertTrue('Foo'.isupper()) #使用断言判断内容是否为False

def test_split(self):
s = 'hello world'
self.assertEqual(s.split(),['hello','world'])
#下面令solit报错
with self.assertRaises(TypeError):
s.split(2)

继承 unittest.TestCase 就创建了一个测试样例。上述三个独立的测试是三个类的方法,这些方法的命名都以 test 开头。 这个命名约定告诉测试运行者类的哪些方法表示测试。

每个测试的关键是:调用 assertEqual() 来检查预期的输出; 调用 assertTrue() 或 assertFalse() 来验证一个条件;调用 assertRaises() 来验证抛出了一个特定的异常。使用这些方法而不是 assert 语句是为了让测试运行者能聚合所有的测试结果并产生结果报告。

通过 setUp() 和 tearDown() 方法,可以设置测试开始前与完成后需要执行的指令。 在 组织你的测试代码 中,对此有更为详细的描述。

运行方式:

1
2
3
4
5
1. 在py文件添加代码:
if __name__ == '__main__':
unittest.main()
2.命令行中运行文件:(后文详解)
python -m unittest xxx.py

上文的脚本生成如以下格式的输出:

1
2
3
4
5
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

在调用测试脚本时添加 -v 参数使 unittest.main() 显示更为详细的信息,生成如以下形式的输出:

1
2
3
4
5
6
7
8
test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

命令行界面

unittest 模块可以通过命令行运行模块(py文件)、类和独立测试方法的测试:

1
2
3
python -m unittest test_module
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method

可以传入模块名、类、方法名或者他们的任意组合。

在运行测试时,你可以通过添加 -v 参数获取更详细(更多的冗余)的信息。

1
python -m unittest -v test_module

当运行时不包含参数,开始探索性测试

1
python -m unittest

tips:一个新的 TestCase 实例作为一个test fixture,用于运行各个独立的测试方法。在运行每个测试时,setUp()tearDown()__init__() 会被调用一次。

------- 本文结束  感谢您的阅读 -------