1. 程式人生 > >測試教程網.unittest教程.3. 實例: 測試弱密碼

測試教程網.unittest教程.3. 實例: 測試弱密碼

one 消息 打印 lur imp 一次 stc str traceback

From: http://www.testclass.net/pyunit/test_example_1/

背景

考慮這樣一個測試弱密碼的實例,這個我們在pytest相關教程中也有過描述。

我們需要判斷用戶的密碼中包含簡單密碼,規則是這樣的,密碼必須至少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"}
]

再運行上面的用例,觀察一下測試結果是否會有不同?如果沒有不同,那是為什麽?

測試教程網.unittest教程.3. 實例: 測試弱密碼