背景
考虑这样一个测试弱密码的实例, 这个我们在 pytest 相关教程 http://www.testclass.net/pytest/fixture/ 中也有过描述.
我们需要判断用户的密码中包含简单密码, 规则是这样的, 密码必须至少 6 位, 满足 6 位的话判断用户的密码不是 password123 或者 password 之类的弱密码.
对于如下的测试数据, 我们要如何使用 unittest 来进行相关测试呢?
- [ {"name":"jack","password":"Iloverose"},
- {"name":"rose","password":"Ilovejack"},
- {"name":"tom","password":"password123"}
- ]
- Test fixture
前文我们也说过, text fixture 的主要功能是初始化测试数据或环境以及清理测试数据或环境.
考虑上面的例子, 对我们而已, 在用例执行之前初始化上面的测试数据是有必要的, 我们可以把上面的数据用 python 的数据结构来表示, 比较合适的数据结构是 python 的字典. 这样做有如下的好处
统一初始化一些需要在多个用例之间共享的数据
可以在初始化的时候做一些数据的处理工作, 比如过滤一些无效数据等
Test fixture 最简单的实现方式是通过自定义下面的 2 个方法:
TestCase.setUp 方法在每个测试方法运行之前都会运行一次, 适合为每个用例都初始化一遍数据
TestCase.tearDown 方法在每个测试方法运行之后都会运行一次, 适合为每个用例都清理一遍数据
代码
新建名为 test_password_1.py 的文本文件, 输入如下内容
- import unittest
- class PasswordTeseCase(unittest.TestCase):
- def setUp(self):
- print('set up')
- self.test_data = [
- dict(name='jack', password='Iloverose'),
- dict(name='rose', password='Ilovejack'),
- dict(name='tom', password='password123')
- ]
- def test_week_password(self):
- for data in self.test_data:
- passwd = data['password']
- self.assertTrue(len(passwd)>= 6)
- msg = "user %s has a weak password" %(data['name'])
- self.assertTrue(passwd != 'password', msg)
- self.assertTrue(passwd != 'password123', msg)
- def test_dummy(self):
- pass
- if __name__ == '__main__':
- unittest.main()
运行
在命令行里输入
python test_password_1.py
来运行用例, 结果如下
- $ python test_password_1.py
- set up
- .set up
- F
- ======================================================================
- FAIL: test_week_password (__main__.PasswordTeseCase)
- ----------------------------------------------------------------------
- Traceback (most recent call last):
- File "test_password_1.py", line 21, in test_week_password
- self.assertTrue(passwd != 'password123', msg)
- AssertionError: False is not true : user tom has a weak password
- ----------------------------------
- Ran 2 tests in 0.001s
- FAILED (failures=1)
解释一下
setUp 方法运行了 2 次, 所以打印出了 2 次'set up', 这是因为上面的用例中有 2 个测试方法 (2 个方法名以 test 开头的方法),setUp 会在每个测试方法执行之前执行 1 次
由于用户 tom 的密码是弱密码 password123, 所以上面的用例运行失败了, 打印出 1 个 "F", 有几个 F 就代表有几个测试用例失败
测试方法运行失败时测试结果里会打印出失败方法的方法名, 因此好的测试方法名可以方便我们快速找出失败用例
为了让错误信息更加容易理解, 我们经常会自定义断言出错提示消息, 比如
msg = "user %s has a weak password" %(data['name'])
. 一旦断言失败, 我们一眼就能看出是哪个用户的密码强度不够
亲自动手试一试
假设我们增加 1 条测试数据, 如下所示
- [
- {"name":"jack","password":"Iloverose"},
- {"name":"rose","password":"Ilovejack"},
- {"name":"tom","password":"password123"},
- {"name":"jerry","password":"password"}
- ]
再运行上面的用例, 观察一下测试结果是否会有不同? 如果没有不同, 那是为什么?
来源: http://www.bubuko.com/infodetail-2725906.html