1. 程式人生 > >Python接口自動化實戰(第一階段)- unittest框架

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

.post ron tro 測試用例 TTT The 需求 path mon

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: [email protected], Password: 123456, Type: Pro}
        res = requests.post(self.url,params)
        # 斷言:根據實際測試場景,可以查詢數據庫是否有新註冊的用戶、對比接口的返回信息、對比狀態碼等等
        self.assertEqual(200, res.status_code)

    # 測試用例 - 重復註冊
    def test_register_existing(self):
        # 發送請求
        params = {LoginAccount: [email protected], 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.測試報告

技術分享圖片

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