第二篇上一節的內容,我們在進行註冊函數的邏輯測試時,寫了6個測試函數,我們發現所有測試函數中只有data和expect_result不一樣,其他內容都一樣,那我們就想想函數的作用是什麼?是實現一個功能,當不同參數函數的結果也不一樣時,那我們就可以將這些參數可以作爲函數參數傳入
如上一節內容,既然只有data和expect_result不一樣,那麼我們就可以
1. 將所有的測試數據存在一個變量中
testcase = [[['Luji', '1234567'], {'code': 2, 'msg': '用戶名長度須在6-15內'}],
[['1234567890123456', '1234567'], {'code': 2, 'msg': '用戶名長度須在6-15內'}],
[['Lujier', '1234567'], {'code': 1, 'msg': '該用戶名已被使用'}],
[['Lujier001', '12345'], {'code': 3, 'msg': '密碼長度須在6-20內'}],
[['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密碼長度須在6-20內'}],
[['Lujier001', '1234567'], {'code': 0, 'msg': '註冊成功'}]
]
2. 在定義測試函數時,則將data和expect_result作爲該函數參數(test_login.py)
class TestLogin(unittest.TestCase):
def setUp(self):
print("每一條用例執行開始")
def tearDown(self):
print("每一條用例執行開始")
def test_login(self, data, expect_result):
actual_result = register(*data) # 測試結果
try:
# 斷言處理
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("用例執行失敗,原因:{}!".format(msg))
raise msg
else:
print("用例執行成功")
3. 測試用例集文件run_suite.py如下內容:
import unittest
from CSDN.test_login import TestLogin
from HTMLTestRunnerNew import HTMLTestRunner
'''創建一個測試套件'''
suite = unittest.TestSuite()
# 用例測試數據,
testcases = [[['Luji', '1234567'], {'code': 2, 'msg': '用戶名長度須在6-15內'}],
[['1234567890123456', '1234567'], {'code': 2, 'msg': '用戶名長度須在6-15內'}],
[['Lujier', '1234567'], {'code': 1, 'msg': '該用戶名已被使用'}],
[['Lujier001', '12345'], {'code': 3, 'msg': '密碼長度須在6-20內'}],
[['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密碼長度須在6-20內'}],
[['Lujier001', '1234567'], {'code': 0, 'msg': '註冊成功'}]
]
for case in testcases:
suite.addTest(TestLogin('test_login', case[0], case[1]))
# 3. HTMLTestRunnerNew 測試報告
with open("test_report.html", "wb") as f:
runner = HTMLTestRunner(
stream=f,
verbosity=0,
title="test reports",
description="",
tester="Lujier")
runner.run(suite)
但是,存在一個問題那就是,我們一般進行測試時,會有很多的測試模塊,這樣就導致
1) run_suite.py文件可能內容過多;
2) 如果測試數據出錯,就需要進入run_suite中,找到問題模塊的數據,代碼較多情況下,不好定位
那麼如何解決呢?
在這裏,我們就要開始引入ddt了, 我們可以將測試數據放在對應的測試模塊中,測試模塊內容如下:
test_login.py
import unittest
from ddt import data,ddt
@ddt
class TestLogin(unittest.TestCase):
# 用例測試數據,
testcases = [[['Luji', '1234567'], {'code': 2, 'msg': '用戶名長度須在6-15內'}],
[['1234567890123456', '1234567'], {'code': 2, 'msg': '用戶名長度須在6-15內'}],
[['Lujier', '1234567'], {'code': 1, 'msg': '該用戶名已被使用'}],
[['Lujier001', '12345'], {'code': 3, 'msg': '密碼長度須在6-20內'}],
[['Lujier001', '123456789012345678901'], {'code': 3, 'msg': '密碼長度須在6-20內'}],
[['Lujier001', '1234567'], {'code': 0, 'msg': '註冊成功'}]
]
def setUp(self):
print("每一條用例執行開始")
def tearDown(self):
print("每一條用例執行開始")
@data(*testcases)
def test_login(self, testcase):
datacontent = testcase[0] # 測試數據
expect_result = testcase[1] # 預期結果
actual_result = register(*datacontent) # 測試結果
try:
# 斷言處理
self.assertEqual(actual_result, expect_result)
except Exception as msg:
print("用例測試失敗,原因:{}!".format(msg))
raise msg
else:
print("用例執行成功")
那自然的,run_suite文件內容就跟上一節的內容一樣嘍
import unittest
from CSDN.test_login import TestLogin
from HTMLTestRunnerNew import HTMLTestRunner
'''創建一個測試套件'''
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestLogin))
# 3. HTMLTestRunnerNew 測試報告
with open("test_report.html", "wb") as f:
runner = HTMLTestRunner(
stream=f,
verbosity=0,
title="test reports",
description="",
tester="Lujier")
runner.run(suite)
運行結果如下: