1.unitttest簡介
為什么要使用unittest?
前面我們已經寫代碼實現了注冊接口的處理調用,但是一個接口往往需要多條測試用例才能完整的覆蓋到每一種情況,針對於單接口多條測試用例需要執行的情況,我們該如何處理呢?
在unittest的測試類中定義多個測試方法來完成測試,這可能是大家最先想到的一個解決方法,當然也是能夠達到目的的,以下面的注冊接口為例,我們基於此思路來編碼實現接口的完整測試。
unittest特點
- python自帶的單元測試框架,無需安裝
- 用例執行互不干擾
- 提供不同范圍的setUp(測試准備)和tearDown(測試清理)方法
- 提供豐富的斷言方法
- 可以通過discover批量執行所有模塊的用例
- 可以通過TestSuite(測試集)靈活的組織用例
unittest幾大組成部分
- TestCase: 用例對象,編寫測試用例時要繼承該類,以具有TestCase的屬性和方法
- TestSuite: 測試集或測試套件,測試用例的集合,用來組織用例,支持嵌套
- TestLoader: 用例加載器,用於向TestSuite中添加用例
- TextTestRunner: 用例執行器(輸出文本結果),一般以TestSuite為單位執行用例
- TestResult: 測試結果
2.接口分析
通過接口的需求分析,我整理了注冊接口的三條測試用例:
1)正確的郵箱賬號注冊
2)輸入無效的郵箱賬號注冊
3)輸入已經存在的郵箱賬號注冊
3.用例編寫
根據上面的三條測試用例,把每條用例都轉化成unittest里面的測試用例。
編寫規則
- 新建一個test_開頭(必須)的.py文件,如
test_register.py
- 導入unittest
- 編寫一個Test開頭(必須)的類,並繼承unittest.TestCase,做為測試類
- 在類中編寫一個test_開頭(必須)的方法,作為用例。注意:用例執行順序並非按書寫順序執行,而是按用例名ascii碼先后順序執行
完整的接口測試用例包含:
1.數據准備:准備測試數據,可手工准備,也可使用代碼准備(通常會涉及數據庫的操作,比如發送驗證碼后)
2.發送請求:發送接口請求
3.響應斷言、數據庫斷言:這個根據需要,一般響應斷言后還需要進行數據庫斷言,以確保接口數據庫操作的正確性
5.數據清理:如果接口有更新數據庫操作,斷言結束后需要還原更改
4.用例斷言
unittest提供了豐富的斷言方法
5.Fixtures
Test Fixtures即setUp(用例准備)及tearDown(測試清理)方法,用於分別在測試前及測試后執行
按照不同的作用范圍分為:
- setUp()/tearDown(): 每個用例執行前/后執行一次
- setUpClass()/tearDownClass(): 每個測試類加載時/結束時執行一次
- setUpMoudle()/tearDownMoudle(): 每個測試模塊(一個py文件為一個模塊)加載/結束時執行一次
6.代碼實現
# 導入 import unittest import requests class TestRegister(unittest.TestCase): # 類必須以Test開頭,繼承TestCase def setUp(self): print("======開始執行測試用例======") self.url = 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister' def tearDown(self): print("======測試用例執行完畢======") # 測試用例 - 正常注冊 def test_register_normal(self): # 每一條測試用例以test_開頭 # 發送請求 params = {'LoginAccount': 'apitest08@emai.com', 'Password': '123456', 'Type': 'Pro'} res = requests.post(self.url,params) # 斷言:根據實際測試場景,可以查詢數據庫是否有新注冊的用戶、對比接口的返回信息、對比狀態碼等等 self.assertEqual(200, res.status_code) # 測試用例 - 重復注冊 def test_register_existing(self): # 發送請求 params = {'LoginAccount': 'apitest05@emai.com', 'Password': '123456', 'Type': 'Pro'} res = requests.post(self.url,params) # 斷言 print("執行結果:", res.json()['Message']) self.assertIn("The email has been registered", res.json()['Message']) # 測試用例 - 無效的郵箱格式去注冊 def test_register_invalid_email(self): # 發送請求 params = {'LoginAccount': 'testapi@emai', 'Password': '123456', 'Type': 'Pro'} res = requests.post(self.url,params) # 斷言 print("執行結果:", res.json()['Message']) self.assertIn("valid email", res.json()['Message']) if __name__ == '__main__': # 從當前模塊執行 unittest.main()
7.用例組織以及運行
TestSuite()加載測試用例,創建一個實例, TestSuit的父類是BaseTestSuite
生成Html測試報告
1.下載 HTMLTestRunnerNew.py文件 ,拷貝到項目目錄
2.在run.py中導入該模塊
3.運行腳本,會在指定的文件夾下生成測試報告.html ,用瀏覽器打開即可查看
import unittest import HTMLTestRunnerNew # 導入用於生成測試報告 from Common import project_path # 讀取文件路徑 from Common.test_register import TestRegister # 導入測試類 suite=unittest.TestSuite() # 1. 加載測試用例:把測試用例放到測試套件suite里面 suite.addTest(TestRegister('test_register_normal')) suite.addTest(TestRegister('test_register_existing')) suite.addTest(TestRegister('test_register_invalid_email')) # 2.運行測試集, 並生成Html測試報告 with open(project_path.report_path,'wb') as file: runner=HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2,title='ServiceX API Testing',description='ServiceX API Testing',tester='Jiali') runner.run(suite)
8.測試報告