Python接口自動化實戰(第二階段)- unittest框架


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里面的測試用例。

編寫規則

  1. 新建一個test_開頭(必須)的.py文件,如test_register.py
  2. 導入unittest
  3. 編寫一個Test開頭(必須)的類,並繼承unittest.TestCase,做為測試類
  4. 在類中編寫一個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.測試報告

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM