unittest是Python自帶的單元測試框架,在unittest庫中,它自己封裝 一些校驗返回的結果方法和一些用例執行前的初始化操作
接下來,我們需要了解下unittest的幾個概念:
1. TestCase 也就是測試用例
2. TestSuite 多個測試用例集合在一起,就是TestSuite
3. TestLoader是用來加載TestCase到TestSuite中的
4. TestRunner是來執行測試用例的,測試的結果會保存到TestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息
接下來,我們以一個簡單例子來說明,用戶註冊:
1. 用戶註冊函數的邏輯代碼在:register.py模塊中
"""
用戶註冊要求如下:
1. 不允許註冊相同用戶名的賬號,即:用戶名唯一
2. 用戶名長度在[6,15]之間,包含6和15
3. 密碼長度不能小於6,且不能超過20;
"""
userinfo = {'Lujier': '123456', 'Lujier02': '234567'}
def register(username, password):
if len(username) < 6 or len(username) > 15:
return {'code': 2, 'msg': '用戶名長度須在6-15內'}
elif len(password) < 6 or len(password) > 20:
return {'code': 3, 'msg': '密碼長度須在6-20內'}
elif username in userinfo.keys():
return {'code': 1, 'msg': '該用戶名已被使用'}
else:
userinfo[username] = password
return {'code': 0, 'msg': '註冊成功'}
2. 那我們開始設計測試用例:
1. 用戶名長度小於6:
測試數據:username = 'Luji' password='1234567'
預期結果: {'code': 2, 'msg': '用戶名長度須在6-15內'}
2. 用戶名長度大於15:
測試數據:username = '1234567890123456' password='1234567'
預期結果: {'code': 2, 'msg': '用戶名長度須在6-15內'}
3. 用戶名已被註冊:
測試數據:username = 'Lujier' password='1234567'
預期結果: {'code': 1, 'msg': '該用戶名已被使用'}
4. 密碼長度小於6:
測試數據: username = 'Lujier001' password='12345'
預期結果: {'code': 3, 'msg': '密碼長度須在6-20內'}
5. 密碼長度大於20:
測試數據: username = 'Lujier001' password='123456789012345678901'
預期結果: {'code': 3, 'msg': '密碼長度須在6-20內'}
6. 成功註冊:
測試數據: username = 'Lujier001' password='1234567'
預期結果: {'code': 3, 'msg': '密碼長度須在6-20內'}
3. 接下來,我們開始定義一個測試類:TestRegister
import unittest
from register import *
class TestRegister(unittest.TestCase):
def setUp(self):
# 每一條用例執行前都會進行該操作,一般用於做初始化處理
pass
def tearDown(self):
# 跟setUp()對應,每一條用例執行完成後都會進行該操作
pass
def test_register_001(self):
# 用戶名長度小於6
data = ['Luji', '1234567'] # 測試數據
expect_result = {'code': 2, 'msg': '用戶名長度須在6-15內'} # 預期結果
actual_result = register(*data) # 測試結果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_001測試失敗,原因:{}!".format(msg))
raise msg
else:
print("test_register_001用例執行成功")
def test_register_002(self):
# 用戶名長度大於15
data = ['1234567890123456', '1234567'] # 測試數據
expect_result = {'code': 2, 'msg': '用戶名長度須在6-15內'} # 預期結果
actual_result = register(*data) # 測試結果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_002測試失敗,原因:{}!".format(msg))
raise msg
else:
print("test_register_002用例執行成功")
def test_register_003(self):
# 用戶名已被註冊
data = ['Lujier', '1234567'] # 測試數據
expect_result = {'code': 1, 'msg': '該用戶名已被使用'} # 預期結果
actual_result = register(*data) # 測試結果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_003測試失敗,原因:{}!".format(msg))
raise msg
else:
print("test_register_003用例執行成功")
def test_register_004(self):
# 密碼長度小於6
data = ['Lujier001', '12345'] # 測試數據
expect_result = {'code': 3, 'msg': '密碼長度須在6-20內'} # 預期結果
actual_result = register(*data) # 測試結果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_004測試失敗,原因:{}!".format(msg))
raise msg
else:
print("test_register_004用例執行成功")
def test_register_005(self):
# 密碼長度大於20
data = ['Lujier001', '123456789012345678901'] # 測試數據
expect_result = {'code': 3, 'msg': '密碼長度須在6-20內'} # 預期結果
actual_result = register(*data) # 測試結果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_005測試失敗,原因:{}!".format(msg))
raise msg
else:
print("test_register_005用例執行成功")
def test_register_006(self):
# 成功註冊
data = ['Lujier001', '1234567'] # 測試數據
expect_result = {'code': 0, 'msg': '註冊成功'} # 預期結果
actual_result = register(*data) # 測試結果
try:
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("test_register_006測試失敗,原因:{}!".format(msg))
raise msg
else:
print("test_register_006用例執行成功")
4 . 用例寫好了,那麼就到該如何運行用例了
第一種:可以直接在測試用例文件中運行
if __name__ == "__main__":
unittest.main()
結果如下:
第二種:
將多個用例集合在一起,然後再進行運行
1) 新建一個py文件,用來做運行用例文件:run_suite.py
2) # 創建一個測試套件
suite = unittest.TestSuite()
# 加載測試用例, 共有4種方法
# 第一種,單個添加:接受的參數是測試用例對象
suite.addTest(TestRegister("test_register_001"))
suite.addTest(TestRegister("test_register_002"))
suite.addTest(TestRegister("test_register_003"))
suite.addTest(TestRegister("test_register_004"))
suite.addTest(TestRegister("test_register_005"))
suite.addTest(TestRegister("test_register_006"))
# 第二種,一次添加多條用例
suite.addTests([TestRegister("test_register_001"), TestRegister("test_register_002"),
TestRegister("test_register_003"), TestRegister("test_register_004"),
TestRegister("test_register_005"), TestRegister("test_register_006")])
# 第三種:一次添加一個測試類(類名不需要加引號)
# 創建一個加載測試測試用例對象
loader = unittest.TestLoader()
# 加載整個測試用例類
suite.addTest(loader.loadTestsFromTestCase(TestRegister))
# 第四種,模塊添加
# 加載測試用例所在模塊
suite.addTest(loader.loadTestsFromModule(test_register))
3) 用例加載完成之後,就是執行用例了:
先創建一個runner對象: runnerr =unittest.TextTestRunner()
運行: runner.run(suite)
# 運行測試集合
runner = unittest.TextTestRunner() # 創建一個runner對象
runner.run(suite)
運行結果如下:
以上,就是最基本的單元測試的過程,後續還會繼續優化單元測試相關信息