自動化框架的設計與實現

一、自動化測試框架

在大部分測試人員眼中只要沾上“框架”,就感覺非常神秘,非常遙遠。大家之所以覺得復雜,是因為落地運用起來很復雜;每個公司,每個業務及產品線的業務流程都不一樣,所以就導致了“自動化測試框架”去完成自動化測試的時候產生很多不穩定因素,這樣就很難定位成一個固定的框架。其實不然,真正的自動化測試框架不是一個模式,而是一種思想和方法的集合,通俗的講就是一個架構。

二、自動化測試框架思想

為了更好的了解自動化測試框架,我們先從自動化測試的發展歷程說起;一般測試工作限在3年以上且接觸過自動化測試的應該對以下幾種自動化測試框架思想有一定的認知:

  • 模塊化思想
  • 庫思想
  • 數據驅動思想
  • 關鍵字驅動思想

以上僅僅是代表了一種自動化測試的思想,并不能定義為框架。上面講到框架=思想+方法,于是演化了以下五種框架:

1、模塊化測試腳本框架

需要創建小而獨立的可以描述的模塊、片斷以及待測應用程序的腳本。這些樹狀結構的小腳本組合起來,就能組成能用于特定的測試用例的腳本。

2、測試庫框架

與模塊化測試腳本框架很類似,并且具有同樣的優點。不同的是測試庫框架把待測應用程序分解為過程和函數而不是腳本。這個框架需要創建描述模塊、片斷以及待測應用程序的功能庫文件。

3、關鍵字驅動或表驅動的測試框架

這個框架需要開發數據表和關鍵字。這些數據表和關鍵字獨立于執行它們的測試自動化工具,并可以用來“驅動"待測應用程序和數據的測試腳本代碼,關鍵宇驅動測試看上去與手工測試用例很類似。在一個關鍵字驅動測試中,把待測應用程序的功能和每個測試的執行步驟一起寫到一個表中。

這個測試框架可以通過很少的代碼來產生大量的測試用例。同樣的代碼在用數據表來產生各個測試用例的同時被復用。

4、數據驅動測試框架

在這里測試的輸入和輸出數據是從數據文件中讀取(數據池,ODBC源,CSV文件,EXCEL文件,Json文件,Yaml文件,ADO對象等)并且通過捕獲工具生成或者手工生成的代碼腳本被載入到變量中。在這個框架中,變量不僅被用來存放輸入值還被用來存放輸出的驗證值。整個程序中,測試腳本來讀取數值文件,記載測試狀態和信息。這類似于表驅動測試,在表驅動測 試中,它的測試用例是包含在數據文件而不是在腳本中,對于數據而言,腳本僅僅是一個“驅動器”,或者是一個傳送機構。然而,數據驅動測試不同于表驅動測試,盡管導航數據并不包含在表結構中。在數據驅動測試中,數據文件中只包含測試數據。

5、混合測試自動化框架

最普遍的執行框架是上面介紹的所有技術的一個結合,取其長處,彌補其不足。這個混合測試框架是由大部分框架隨著時間并經過若干項目演化而來的。

三、接口自動化測試框架策略
  1. 設計出來的框架是直接給測試人員,而且其他的測試人員只需要簡單的向里面不斷的補充測試用例即可;所以我們的框架設計必須三簡化即操作簡單,維護簡單,擴展簡單。
  2. 設計框架的同時一定要結合業務流程,而且不僅僅靠技術實現,其實技術實現不難,難點對業務流程的理解和把握。
  3. 設計框架時要將基礎的封裝成公用的,如:get請求、post請求和斷言封裝成同基礎通用類。
  4. 測試用例要與代碼分享,這樣便于用例管理,所以將我們選擇上面的數據驅動思想。
四、接口自動化測試框架設計
1、進行接口框架設計前,我們先看看當前的一些主流接口自動化工具框架

2、以上各工具特性

根據以上的特性可得我們優先考慮Python+Requests和HttpRunner;下面我們根據其兩個框架分別來分析下用例執行過程。

3、用例執行解析

Python的Requests庫針對所有的HTTP請求方法,采用的是統一的接口

requests.request(method, url, **kwargs)

其中,kwargs可以保護HTTP請求所有可能用到的信息,例如:headers、cookies、params、data、auth等。所以,只要遵循Requests的參數規范,在接口測試用例中復用Requests參數的概念即可。而HttpRunner處理邏輯很簡單,直接讀取測試用例中的各項參數,傳遞給Requests發起請求。

1)Requests接口請求示例

 
  1. def test_login(self):

  2. url = "www.xxx.com/api/users/login"

  3. data = {

  4. "name": "user1",

  5. "password": "123456"

  6. }

  7. resp = requests.post(url, json=data)

  8. self.assertEqual(200, resp.status_code)

  9. self.assertEqual(True, resp.json()["success"])

在該用例中,實現了HTTP POST請求,然后對響應結果進行判斷,檢查響應code等是否符合預期。

這樣的用例在實際項目中會存在兩個問題:

  • 用例模式基本固定,會存在大量相似或重復的用例,用例維護有很大問題
  • 用例與執行代碼不分離,參數數據也未分離,同樣不易維護

2)HttpRunner使用json/yaml格式處理測試用例,分離后的用例描述如下

 
  1. {

  2. "name": "test login",

  3. "request": {

  4. "url": "www.xxx.com/api/users/login",

  5. "method": "POST",

  6. "headers": {

  7. "content-type": "application/json"

  8. },

  9. "json": {

  10. "name": "user1",

  11. "password": "123456"

  12. }

  13. },

  14. "response": {

  15. "status_code": 200,

  16. "headers": {

  17. "Content-Type": "application/json"

  18. },

  19. "body": {

  20. "success": true,

  21. "msg": "user login successfully."

  22. }

  23. }

  24. }

3)HttpRunner用例執行引擎

 
  1. def run_testcase(testcase):

  2. req_kwargs = testcase['request']try:

  3. url = req_kwargs.pop('url')

  4. method = req_kwargs.pop('method')

  5. except KeyError:

  6. raise exception.ParamsError("Params Error")

  7. resp_obj = requests.request(url=url, method=method, **req_kwargs)

  8. diff_content = utils.diff_response(resp_obj, testcase['response'])

  9. success = False if diff_content else True

  10. return success, diff_content

4)從測試用例中獲取HTTP接口請求參數,testcase['request']

 
  1. {

  2. "url": "www.xxx.com/api/users/login",

  3. "method": "POST",

  4. "headers": {

  5. "content-type": "application/json"

  6. },

  7. "json": {

  8. "name": "user1",

  9. "password": "123456"

  10. }

  11. }

5)發起Http請求

requests.request(url=url, method=method, **req_kwargs)

6)檢測測試結果,即斷言

utils.diff_response(resp_obj, testcase['response'])
五、接口自動化測試框架落地

根據簡單易用易維護原則我們使用HttpRunner工具設計框架。

1、HttpRunner簡介

主要特性:

  • 集成了Requests的全部特性,滿足對http、https的各種測試需求
  • 測試用例與代碼分離,采用YAML/JSON的形式描述測試場景,保障測試用例具備可維護性
  • 測試用例支持參數化和數據驅動機制
  • 基于 HAR 實現接口錄制和用例生成功能
  • 結合 Locust 框架,無需額外的工作即可實現分布式性能測試
  • 執行方式采用 CLI 調用,可與 Jenkins 等持續集成工具完美結合
  • 測試結果統計報告簡潔清晰,附帶詳盡統計信息和日志記錄
  • 具有可擴展性,便于擴展實現 Web 平臺化

2、環境準備

安裝HomeBrew(MacOs軟件包管理工具,類似apt-get、yum)

  • 終端執行
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安裝pyenv并配置環境變量:python版本管理器,可同時管理多個Python版本(HttpRunner是基于Python開發,但是支持Python3.6.0以上)
 
  1. brew install pyenv

  2. echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile

  3. echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

  4. echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

  5. exec $SHELL -l

  • 安裝Python3.6
 
  1. pyenv install --list //查看可安裝的Python版本

  2. pyenv install 3.6.0 //安裝3.6.0版本

  3. pyenv rehash //更新pyenv

  4. pyenv versions //查看已經安裝的python版本,帶*號的是當前使用的版本

  • 選擇Pyhton
pyenv global 3.6.0 //設置全局版本,即當前系統使用的版本將切換為3.6.0
  • 安裝HttpRunner并校驗
 
  1. pip install httprunner

  2. //運行如下命令,若正常顯示版本號,則說明httprunner安裝成功:

  3. hrun -V

  4. 0.9.8

至此HttpRunner已搭建完成

3、用例管理

在HttpRunner中,測試用例引擎最大的特色就是支持Yaml/Json格式的用例描述形式;

采用YAML/JSON格式編寫維護測試用例,優勢還是很明顯的:

  • 相比于表格形式,具有更加強大的靈活性和更豐富的信息承載能力;
  • 相比于代碼形式,減少了不必要的編程語言語法重復,并最大化地統一了用例描述形式,提高了用例的可維護性。

Yaml格式

Json格式

以下以數瀾--數棲平臺2.X中的研發平臺為例(采取Json格式)

場景:項目空間后,需要快速支持創建Demo示例,即自動創建各種目錄和任務。

1)確定業務流程所使用到的接口并通過Postman或Jmeter調試通過及分好類

  • 查詢類(Get請求)接口:查詢任務目錄、查詢資源組、查詢工作流等
  • 新增類(Post請求)接口:新建目錄、新建任務等

2)根據業務流程確定接口順序

  • 如要在某個目錄下新建任務:則先要調用新建目錄接口再調用作建任務接口

3)向Json文件里按照規則填寫接口相關信息

  • 接口Base_Url
  • 接口路徑
  • 接口請求方式
  • 接口請求參數
  • 接口斷言
  • 接口返回參數(關聯接口時會用到上一接口返回的參數)

以下是部分用例示例

4)用例填寫完成后,執行用例文件,如Json文件為task.json

hrun task.json

5)查看運行結果

  • 在此目錄下會自動生成一個reports文件,進入該文件夾可看到生成帶時間的html(執行一次就會生成一個Html文件)

?打開此Html查看

全部通過

部分通過

  • 點擊Log,可查看具體請求信息和返回信息

?點擊trackback可查看定位錯誤信息

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75659.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75659.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75659.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot 3+ Lombok日志框架從logback改為Log4j2

r要將Spring Boot 3項目中的日志框架從Logback切換到Log4j2&#xff0c;并配置按日期滾動文件和控制臺輸出&#xff0c;請按照以下步驟操作&#xff1a; 步驟 1&#xff1a;排除Logback并添加Log4j2依賴 在pom.xml中修改依賴&#xff1a; <dependencies><!-- 排除默…

①、環境準備-主流技術(IPS/FW/主備-主主快速切換)

主流技術&(IPS/FW/主備-主主快速切換&#xff09; 一、RBM主備方案 RBM-FW-P 主配置內容介紹-注釋 remote-backup group 含義&#xff1a;定義了一個遠程備份組。這表明設備支持某種形式的遠程備份功能&#xff0c;用于在設備之間同步配置或數據。data-channel interface …

量化交通擁堵

指數&#xff1a; 基于嚴重擁堵里程比的指數和基于出行時間比的指數。 評價指標是飽和度&#xff08;VC比&#xff09;&#xff0c;它表示交通量與通行能力的比值。 飽和度可分為道路飽和度和路口飽和度。道路飽和度還會進一步分級&#xff0c;有四檔和六檔之分。 城市道路和…

PDF與Markdown的量子糾纏:一場由VLM導演的文檔界奇幻秀

緣起:當格式界的"泰坦尼克號"撞上"黑客帝國" 某個月黑風高的夜晚,在"二進制酒吧"的霓虹燈下: PDF(西裝革履地晃著威士忌): “我的每一頁都像瑞士手表般精密,連華爾街的禿鷲都為我傾倒!” Markdown(穿著帶洞的拖鞋): “得了吧老古董!…

【neo4j數據導出并在其他電腦導入】

停止服務 neo4j stop 導出 neo4j-admin database dump neo4j --to-path"C:\Users\12901\Downloads\test folder" 導入 將 .dump 文件放在一個目錄中 mkdir /root/dump-directory mv /root/neo4j.dump /root/dump-directory/ 使用包含 .dump 文件的目錄路徑作為 …

前端使用WPS WebOffice 做在線文檔預覽與編輯

先附上官網 WebOffice SDK 1、在下面這個地方找到jdk&#xff0c;然后下載 按照 2、只需要把jdk下載下來&#xff0c;放到項目中&#xff0c;然后引入到項目中就可以了&#xff0c;在wps 官網創建個應用&#xff0c;然后把appId放到代碼中就可以了&#xff0c;等待后端把回調…

跨語言微服務架構(Java、Python)——“API中臺”

文章目錄 一、引言二、系統架構概述2.1 統一單點登錄&#xff08;SSO&#xff09;與權限管理設計2.2 API中臺與數據中臺的融合2.3 跨語言適配器與 JWT 認證機制 三、技術細節與工具選型3.1 SSO 系統的選型與實現3.2 微服務架構與 API 中臺的實現3.3 跨語言適配器實現與技術難點…

DeepSeek V3-0324升級:開啟人機共創新紀元

一、技術平權&#xff1a;開源協議重構AI權力格局 DeepSeek V3選擇MIT協議開源6850億參數模型&#xff0c;本質上是一場針對技術壟斷的“數字起義”。這一決策的深層影響在于&#xff1a; 商業邏輯的重構 閉源AI公司依賴API收費的商業模式面臨根本性挑戰。當頂級模型能力可通過…

QOpenGLWidget視頻畫面上繪制矩形框

一、QPainter繪制 在QOpenGLWidget中可以繪制,并且和OpenGL的內容疊在一起。paintGL里面繪制完視頻后,解鎖資源,再用QPainter繪制矩形框。這種方式靈活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//繪制視頻數據// 解綁VAOg…

3.3 Taylor公式

1.定義 1.1 taylor公式 1.2 麥克勞林公式 1.3 推論 1.4 拉格朗日余項和皮亞諾型余項 2. 例題 3.幾種特殊函數的麥克勞林展開

CEF 給交互函數, 添加控制臺是否顯示交互參數log開關

CEF 控制臺添加一函數,枚舉 注冊的供前端使用的CPP交互函數有哪些 CEF 多進程模式時,注入函數,獲得交互信息-CSDN博客 這兩篇文章,介紹了注入函數,在控制臺中顯示 各自提供的交互函數信息。 有些場景下,我們還需要更詳細的信息,比如想知道 彼此傳遞的參數, 如果每次調…

QTcpSocket多線程連接慢問題

20250325記錄 環境&#xff1a;Qt5.14.2 64位 msvc編譯 在多線程環境下&#xff0c;使用QTcpSocket實現客戶端&#xff0c;發現在少部分電腦上&#xff0c;連接時間過長&#xff0c;定時器檢查套接字狀態時&#xff0c;發現連接處于QAbstractSocket::ConnectingState狀態。 …

IntelliJ IDEA創建Maven工程

1、創建空工程 1&#xff09;創建 2&#xff09;配置JDK和Maven 2、創建Maven工程 3、Maven工程結構簡介 1&#xff09;目錄 pom.xml 2&#xff09;窗口 4、參考 08.IDEA配置本地Maven軟件_嗶哩嗶哩_bilibili

(UI自動化測試web端)第二篇:元素定位的方法_css定位之class選擇器

看代碼里的【find_element_by_css_selector( )】( )里的表達式怎么寫&#xff1f; 文章介紹了第二種寫法class選擇器。你要根據網頁中的實際情況來判斷自己到底要用哪一種方法來進行元素定位。每種方法都要多練習&#xff0c;全都熟了之后你在工作當中使用起來元素定位時&#…

加新題了,MySQL 8.0 OCP 認證考試 題庫更新

MySQL 8.0 OCP 認證考試 題庫更新 MySQL 8.0 Database Administrator 考試科目&#xff1a;1Z0-908 近期發現&#xff0c;MySQL OCP認證考試題庫發生變化&#xff0c;出現了很多新題&#xff0c;對此&#xff0c;CUUG專門收集整理了最新版本的MySQL考試原題&#xff0c;并會給…

基于JavaWeb的圖書管理系統(SSM框架)

有需要請加文章底部Q哦 可遠程調試 基于JavaWeb的圖書管理系統(SSM框架) 一 介紹 此圖書管理系統基于Java(SSM框架)開發&#xff0c;數據庫mysql&#xff0c;前端bootstrap。系統角色分為用戶和管理員。 技術棧&#xff1a;Javaweb(SpringSpringMVCMyBatis)MavenMySQLIDEA 二…

Google Benchmark性能測試

Google Benchmark性能測試 Google Benchmark 是一個用于 C 的微基準測試框架&#xff0c;專為測量小塊代碼的性能而設計。它提供了一種簡單而強大的方式來編寫、運行和分析基準測試&#xff0c;幫助開發人員識別性能瓶頸并優化代碼。本教程將從安裝和基本用法開始&#xff0c;…

深度剖析:域名與DNS安全的全方位解讀

導語 在互聯網的龐大體系中,域名如同我們訪問網絡資源的“門牌號”,而DNS則像是將門牌號翻譯為具體地址的“翻譯官”。然而,這看似平常的域名與DNS系統,卻面臨著諸多安全風險。一旦遭受攻擊,可能導致網站無法訪問、用戶數據泄露等嚴重后果。了解域名與DNS安全知識,對保障…

CSS 的可繼承性

在面試中回答關于CSS可繼承性的問題時&#xff0c;建議采用結構化、清晰且簡潔的方式&#xff0c;展示你對這一概念的理解以及實際應用能力。以下是一個參考回答模板&#xff1a; 1. 定義和概念 “CSS的可繼承性是指某些CSS屬性可以被子元素自動繼承的特性。也就是說&#xf…

string 的接口

我們繼續來講解一些常用的string接口。 一.at接口 我們來看一個越界的問題。 我們運行之后發現這是一個斷言錯誤&#xff0c;直接就終止我們的程序了&#xff0c;不能作為異常被捕捉到&#xff0c;但是我們如果不想讓程序直接崩潰該怎么辦呢&#xff1f; 此時我們就要用到at關鍵…