接口自动化框架
接口自動化框架講解
- 框架結構
接口測試框架的結構如下圖所示:
接口測試框架的結構說明:
- API用于封裝被測系統的接口(用requests模塊封裝的請求方法)
- TestCase將一個或多個接口封裝成測試用例,并使用UnitTest管理測試用例 TestCase可以
調用數據庫進行數據的校驗
- 為了方便維護測試數據,可以把測試腳本和測試數據分離開
- 通過UnitTest斷言接口返回的數據,并生成測試報告
- 框架目錄結構
- 封裝TPShop登錄接口案例
按照功能模塊定義封裝被測系統的接口,方便測試腳本的調用,并且能夠達到代碼的復用。對登錄功能的相關接口進行封裝,
示例代碼:
在login文件中寫入: class LoginApi(object): # 初始化 def __init__(self): self.verify_code_url = "xxxx" self.login_url = "yyyy" # 登錄過程 # 1.獲取驗證碼 # 2.填寫必要數據:用戶名,密碼,驗證碼 # 3.點擊登錄按鈕 def get_login_verify_code(self,session): return session.get(self.verify_code_url) def login(self,session,username,password,verify_code): data = { "username":username, "password":password, "verify_code":verify_code }
- 登錄測試用例
將api模塊中的一個或多個接口封裝成一個測試用例,并使用測試框架UnitTest管理測試用例。定義登錄功能的測試用例。示例代碼:
在logintestcase文件中寫入: import unittest from requests import Session from api.login import LoginApi class LoginTest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.login_api = LoginApi() def setUp(self) -> None: self.session = Session() def tearDown(self) -> None: self.session.close() def test_login_success(self): # 請求驗證碼 response = self.login_api.get_login_verify_code(self.session) self.assertIn("image",response.headers.get("Content-Type")) # 驗證碼識別:略,8888 # 調用登錄方法,發送請求,獲取響應數據 res = self.login_api.login(self.session,"13800000002","123456","8888") res = res.json() # 斷言 self.assertEqual(200,res.status_code) self.assertEqual(1,res.get("status"))
- 集成測試報告
使用HTMLTestRunner生成HTML格式的測試報告
注意:需要將HTMLTestRunner.py文件放置在lib中
在run_suite文件寫入: import unittest from scripts import logintestcase from lib.HTMLTestRunner import HTMLTestRunner suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(logintestcase.LoginTest)) f = open('D:/JySoft/P6/P6-Django/apiTestFramework/report/report.html','wb') runner = HTMLTestRunner(stream=f,title="asdadf",description="cdsbhucv")
運行run_suite,結果為
參數化處理
- 參數化分析
- 構建json文件存放測試數據
[ { "username": "15097142681", "password": "13579", "verify_code": "8888", "status": 0, "msg": "賬號或密碼錯誤" }, { "username": "", "password": "13579", "verify_code": "8888", "status": 0, "msg": "賬號或密碼錯誤" }, { "username": "15097142681", "password": "", "verify_code": "8888", "status": 0, "msg": "賬號或密碼錯誤" }
- 構建參數化數據
def build_data(): with open('../data/data.json','r',encoding='utf-8') as f: content = f.read() data = json.loads(content) d = [] for item in data: d.append((item["username"],item["password"],item["verify_code"],item["status"],item["msg"]))
- 測試用例實現參數化
# 導包 from parameterized import parameterized class LoginTest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.login_api = LoginApi() def setUp(self) -> None: self.session = Session() def tearDown(self) -> None: self.session.close() @parameterized.expand(build_data) def test_login_success(self,username,password,verify_code,status,msg): # 請求驗證碼 response = self.login_api.get_login_verify_code(self.session) self.assertIn("image",response.headers.get("Content-Type")) # 驗證碼識別:略,8888 # 調用登錄方法,發送請求,獲取響應數據 res = self.login_api.login(self.session,username,password,verify_code) res = res.json() # 斷言 self.assertEqual(200,res.status_code) self.assertEqual(status,res.get("status"))
db數據承載形式實現參數化
- 構建數據庫數據
執行SQL腳本,將數據寫入數據庫中
- 修改構建數據函數
def build_data(): # 獲取數據庫的數據 sql = "select * from t_login" db_data = DBUtil.exe_sql(sql) test_data = [] for case_data in db_data: username = case_data[2] password = case_data[3] verify_code = case_data[4] status_code = case_data[5] content_type = case_data[6] status = case_data[7] msg = case_data[8] test_data.append((username,password,verify_code,status_code,content_type,status,msg)) print(test_data)
總結
- 上一篇: 喜欢在计算机教室上课,第一次去计算机教室
- 下一篇: html5 字体位置,html5字体样式