一, 单元测试的含义
unittest 单元测试框架的设计灵感来源于 Junit(Java 语言的单元测试框架), 它与其他语言的单元测试框架风格相类似, 支持自动化测试, 为测试共享 setUp 和 shutDown, 它可以在将测试用例聚合到一起形成一个集合一起执行的同时在测试报告中展示独立的测试结果.
为了达到此目的, unittest 支持几个重要的面向对象式的概念:
1,test fixture
一个 test fixture 所做的事情是执行单个或多个测试用例时的准备工作和执行结束后的一些相关清理工作, 这包括: 创建临时或代理数据库, 目录或开始服务器进程.
2,test case
一个 test case 是一个独立的测试单元, 针对于一组特定的输入得到的特殊相应的验证, 通过继承 unittest 提供的基类 TestCase, 然后可以创建新的测试用例
3,test suite
一个 test suite 是一组测试用例的集合, 也可以是一组 test suite 的集合, 也可以两者混合的集合, test suite 就是用来聚合你想要一起执行的测试用例的
4,test runner
一个 test runner 是一个协调测试执行并向用户提供执行结果的组建, 它可以使用图形界面, 文本界面或返回一个特殊值标识测试执行的结果
二, 实例代码
下面我们看 Python 官方给的一个简单的小例子, 来测试三个字符串
- import unittest
- class TestStringMethods(unittest.TestCase): # 测试类继承了 unittest.TestCase 类, 因此在该类里可以创建新的测试用例
- def test_upper(self):
- self.assertEqual('foo'.upper(), 'FOO') # 'foo'是一个字符串, upper()方法会将这个字符串转成大写, assertEqual 是 unittest 提供的一个断言方法, 用来比较逗号前后两个值是否相等
- def test_isupper(self):
- self.assertTrue('FOO'.isupper()) # assertTrue 也是 unittest 提供的断言方法, 用来判断括号内的内容是真是假, 如果是真则断言成功, 否则为失败,'FOO'是个字符串并且是大写, 调用 isupper()方法, 返回结果
- self.assertFalse('Foo'.isupper()) # assertFalse 则正好相反, 如果括号内返回为假则断言成功, 否则为失败
- def test_split(self):
- s = 'hello world'
- self.assertEqual(s.split(), ['hello', 'world'])
- # check that s.split fails when the separator is not a string
- with self.assertRaises(TypeError):
- s.split(2)
- if __name__ == '__main__':
- unittest.main()
代码解析:
在第三个用例里, 定义了一个字符串, s='hello world', 然后进行了断言, 断言的条件里调用了一个 split()方法, 实际上初学者看到这会比较懵, s.split()到底返回的是什么, 它是否等于逗号后边['hello', 'world']?
学这个东西就是要多试试, 那么接下来我们进行一个尝试
启动命令行 CMD, 进入 python 环境
定义一个字符串 s = 'hello world', 然后 print(s)回车, 我们看一下结果应该是 hello world
那么如果我们 print(s.split())呢, 结果应该是 ['hello', 'world'], 到此我们就得到了答案, 第三条用例里的断言 self.assertEqual(s.split(), ['hello', 'world']) 是成功, 继续向 split()对字符串'hello world'做了什么?
如果我们 print(s.split(2)) 会是什么结果? 如果我们 print(s.split('o'))又会是什么结果?
最后的 unittest.main(), 有了它我们就有了一个简单的方式执行这个脚本, unittest.main()提供了命令行界面运行脚本的方式
假设我们上边的脚本保存在文件 testingunit.py 里, 然后我们启动命令行, 输入 python testingunit.py 看看是个什么结果?
如果我们执行 python testingunit.py -v 又是什么结果?
来源: https://www.cnblogs.com/davieyang/p/10159630.html