【測試工程思考】測試自動化基礎能力建設

1 回顧

傳統軟件研發體系下定義的軟件測試是從用戶視角設計的。測試是試圖窮盡用戶行為的工程,從測試用例(use case)的英文定義就可見一般。測試的邏輯資產就是用自然語言去描述用戶的操作行為或路徑。

但隨著軟件工程向分布式架構和敏捷交付的變革。軟件設計變得比以前更加復雜,要驗證一個分布式部署的微服務架構應用,簡單的use case根本無法發掘應用的質量風險。一個無論是代碼上還是能力上都高度依賴其他組件/模塊的應用,都不允許測試還像對待黑盒一樣進行質量評估。測試需要有更細致,更全局,更系統的洞察力去識別潛在的質量風險。因此,“測試”這個工種在更多的團隊里被定義成概念更寬泛的QA。

2 測試自動化的語言學原理

被測對象是用編程語言構筑的,如果測試用例是自然語言編寫的,那從測試用例作用到被測對象,是需要多輪語義轉譯的。從單元測試中獲得靈感,如果我們的測試用例和被測對象用同樣的語言,這種語言上的同構會省掉語義轉譯的麻煩。讓我們的測試能夠像探針一樣,深入到代碼邏輯的縫隙,做更有針對性的觀測和假設驗證。

  • 微服務應用的驗證那就基于API/SDK定義的schema驅動測試。測試斷言可以精確到每個接口返回的字段(這是自然語言用例觀測不到的)
  • 應用可靠可用性的驗證就用打樁的方式改變一部分組件代碼的返回結果作為假設來觸發單點故障
  • 大規模背景數據模擬或者數據遷移的驗證就直接用腳本訪問數據庫,比通過接口請求更加快捷。

因此QA的能力要求在此基礎上變得更高,除了編程基礎,還需要更系統的分析和動手等綜合能力。因此越來越多的測試工程師職位轉變為“測試開發”。

3. 自動化代碼在測試工程中的重要性

3.1 代碼即生產力

自動化框架的設計結構將測試腳本的開發變成搭積木游戲或者是數據集驅動的盲盒游戲。一個驗證動作,手動執行永遠是重復最小粒度的操作,AW的靈活組合,可以快速生產出新的業務邏輯的測試腳本來。

對于較小的改動或粒度比較小的需求,高優先級的腳本用例和文本用例可以同時編寫,一些不明確的預期結果可以立馬呈現出結果。

對于一個即將生成50-100個大特性的需求來說,直接用自動化構筑驗證任務,比寫文本用例高效得多。

3.2 代碼即資產

測試代碼被納入版本管理工具,有系統性的組織和傳遞,除了要求測試代碼符合公司的自動化規范,還要小組內部達成一致:

  • 對齊頻繁調用的公共AW,查漏補缺,統一路徑,避免多個地方重復出現功能一致的AW
  • 對齊腳本組織結構和特性樹,測試腳本不是業務代碼,是為了提高測試效率的測試語言,要能有助于快速執行繼承和回歸測試
  • 對齊自動化實現的層級和事件節點,不同分級的用例不但表征用例的優先級,也可以作為用例自動化的優先級:優先級越高的用例,越早實現
  • 對齊AW封裝程度:AW封裝程度越高,測試腳本越簡潔直觀,但是會提高定位成本和學習成本,復雜的封裝關系蒙蔽了測試邏輯本身就適得其反了。

3.3 代碼即知識

敏捷開發實踐中,不斷的迭代導致還來不及寫文檔,特性細節就又變化了。一個變化的特性,在傳統既定的測試流程中設計大量文本的調整。一些部門組織中對測試用例文本的可信度的執念構筑著產品整體的質量信心,但在版本節奏催促下,測試人員最可能的反應是直接手動驗證,一個特性驗證完,相關的測試資產沒有完整記錄跟蹤,測試資產的可信度很難在高強度下得到保證。文檔沒有比肩代碼的版本控制系統。不可避免會對成員造成誤導。

3.4 代碼即溝通語言

業務交流時團隊定期內部傳遞能力的重要部分。以定期業務培訓和團隊知識庫管理兩種方式維護。

在組織團隊培訓時,往往是主講人輸出后,聽眾雅雀無聲。雙方對領域知識都有相同的了解程度,才能讓交流更加順暢。在架構龐大,調用鏈過長的系統中,測試代碼可以精準快速定位到具體的問題。從某一行代碼、某一個斷言觸發, 可以節省很多自然語言的描述。

在管理知識庫時,我們發現文檔偏描述性語言,優勢在于承載設計思路和邏輯架構,但無法傳遞具體的測試方法。一堆命令行和截圖的拼湊的文檔不如一個好的測試腳本:靜態代碼闡述測試步驟,動態執行體現實測結果。

在系統日漸復雜的產品測試團隊中,全員熟悉每個特性和業務細節、演進進度的學習成本和溝通成本巨大,但又不能完全各自為營不聞不問,測試腳本就是很好的溝通語言,它建立在懂代碼、懂測試框架這樣的基礎公共能之上,原則上具備這類公共能力的人員即可理解。如果不能,一種可能是腳本質量差,一種可能是測試對產品知識儲備少,無論那種可能,都指向一個更好的提升方向——代碼提交者優化測試腳本,代碼閱讀者補齊相關背景知識,而文檔形式的知識,不具備這種生命力。

4 特性測試責任人即腳本責任人

傳統測試自動化策略是基于在設計好的用例中,識別可自動化的用例,由相關開發或專門編寫測試腳本的人員完成。這種實踐方式帶來兩個問題:

  1. 新特性場景用例開發代價高,自動化交付不及時
  2. 繼承特性用例無效或無法再多種場景下重用

從對特性理解和產品整體把握上,專職的腳本開發人員沒有特性測試責任人理解深入,從測試文本到測試腳本的轉化,中間會產生很多認知溝通成本。
并且,從績效結果導向上看,特性直接測試責任人如果只對交付結果質量負責,缺少自動化的驅動力就會也缺少對整體測試腳本的掌控力,在后期,整個團隊的測試資產對齊維護和測試腳本有效性上都會付出更多的成本。

當要求測試團隊每個成員都具備腳本開發,甚至是測試框架的深度理解后,測試代碼的開發會從簡單的AW組裝變成更貼近產品形態結構的簡潔高效設計。

高效的自動化能力儲備需要前期積累的自動化能力基礎,并投入更多的精力去維護和提升自動化測試的效率:

  • 測試自動化是一個細水長流的過程,應該成為測試人員的習慣動作
  • 要將這個習慣培養成好的習慣,制定一定的團隊公約并自覺遵守讓更多成員獲益
  • 同時也要悉心呵護自動化資產,才能讓大家的好習慣不至于乏味

5 建設高可用自動化能力

CI/CD不只是代碼持續交付的優質生產力,測試執行也可以接入CI/CD流程中。用容器承載每個版本的測試代碼,規劃一部分核心用例作為轉測門禁來實現測試前移

用監控業務的方法,監控測試結果。云平臺的運維監控平臺不光可以監控基礎設施硬件,集群業務指標。將短平快的核心用例打包發布到現網(測試后移),將撥測結果視為為測試服務的業務指標,在監控運維平臺上對接測試結果,可以進一步提升測試發現問題的效率。

測試能力的遷移和后移,讓測試工程的精力更多得投入到更有價值工程創造上去。

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

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

相關文章

進階向:AI聊天機器人(NLP+DeepSeek API)

什么是AI聊天機器人? AI聊天機器人是一種通過自然語言處理(NLP)技術模擬人類對話的智能程序系統。其核心是建立在機器學習算法和大型語言模型基礎上的對話引擎,能夠理解用戶的自然語言輸入,分析語境和意圖,并生成符合上下文的相關回復。 這類機器人系統通常包含以下幾個…

一個C#的段子

猜猜按鈕的結果是啥。 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } public static bool flag true; privat…

使用 gptqmodel 量化 Qwen3-Coder-30B-A3B-Instruct

代碼部分 : quantize_qwen3_coder_30b_a3b_instruct_gptq.py import os########## 環境變量設置 ########## # 當前可用的 CUDA 編號 os.environ["CUDA_VISIBLE_DEVICES"] "1" # GPU 顯存資源片段優化 os.environ["PYTORCH_CUDA_ALLOC_CONF"] …

基于python、django的疫苗接種管理系統

基于python、django的疫苗接種管理系統

Go語言實戰案例:使用sync.Map構建線程安全map

在并發編程中,共享資源的訪問是一個繞不開的問題。Go 中的 map 在并發讀寫時是不安全的,直接使用可能導致程序 panic。因此,在多協程同時訪問 Map 的場景下,必須采取有效的同步措施。本篇將通過一個實戰案例,介紹 Go 的…

關于vue2中對接海康攝像頭以及直播流rtsp或rtmp,后臺ffmpeg轉碼后通過ws實現

最近項目中需要對接攝像頭監控,海康攝像頭為rtsp流格式有一個軟件VLC media player,可以在線進行rtsp或者rtmp流播放,可用來測試流地址是否可用功能實現思路為后臺通過fmpeg把rtsp流進行轉碼,然后通過ws方式進行一幀一幀推送。&am…

Docker容器強制刪除及文件系統修復完整指南

Docker容器強制刪除及文件系統修復完整指南 故障現象與原因分析 ?故障表現?: ERROR: for c9ca40be974d_OpIsosMD_OB unable to remove filesystem unlinkat /data/docker/storage/containers/c9ca40be974d...: structure needs cleaning?根本原因?:…

Matplotlib 知識點總結

1. 基礎繪圖(plot函數)基本語法:plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)功能特點:可繪制點、線和組合圖形自動生成x軸(0-N-1)當x未指定時示例:繪制兩點連線、多點不規則線等代碼…

高可用微服務架構實戰:Nacos集群+Nginx負載均衡,Spring Cloud無縫對接

"當你的注冊中心掛了,整個微服務就變成了無頭蒼蠅。" 這是我在生產環境踩坑后最痛的領悟。今天,我將分享如何用Nacos集群Nginx搭建堅如磐石的注冊中心,讓你的微服務永不迷路! 在 Windows 環境下配置 Nacos 集群&#x…

Spark大數據處理實戰指南

Spark 簡介 Apache Spark 是一個開源的分布式計算框架,專為大規模數據處理而設計。它通過內存計算和優化的執行引擎顯著提升了數據處理速度,適用于批處理、實時流處理、機器學習和圖計算等場景。 核心特性 高性能:利用內存計算(In-Memory Processing)減少磁盤 I/O,比傳…

瀏覽器緩存機制全解析:強緩存與協商緩存

瀏覽器緩存是瀏覽器為提升頁面加載速度、減少服務器壓力和節省網絡帶寬,在本地存儲資源(如 HTML、CSS、JS、圖片等)的機制。其核心分為強緩存和協商緩存,并涉及多種 HTTP 頭字段和存儲位置。以下是詳細解析:?? 一、緩…

知識隨記-----Qt 實用技巧:自定義倒計時按鈕防止用戶頻繁點擊

Qt 技巧:實現自定義倒計時按鈕防止用戶頻繁點擊注冊 項目場景 在一個基于 Qt 開發的聊天應用中,用戶注冊時需要獲取驗證碼。為防止用戶頻繁點擊獲取驗證碼按鈕,需要實現一個倒計時功能,用戶點擊后按鈕進入倒計時狀態,倒…

Linux與Windows應急響應

本人首先進行了linux的應急響應,windows之后再進行 Linux與Windows應急響應初體驗1 linux應急響應1.1 賬戶:1.1.1 使用cat /etc/passwd命令查看passwd文件2.1.2 使用cat /etc/shadow命令查找shadow文件,該文件為密碼文件的存儲項1.2 入侵排查…

計算機網絡1-4:計算機網絡的定義和分類

目錄 計算機網絡的定義 計算機網絡的分類 計算機網絡的定義 計算機網絡的分類 按交換技術分類:電路交換網絡、報文交換網絡、分組交換網絡 按使用者分類:公用網、專用網 按傳輸介質分類:有線網絡、無線網絡 按覆蓋范圍分類:…

在QT中動態添加/刪除控件,伸縮因子該怎么處理

開發中遇到的問題[TOC](開發中遇到的問題)處理方式在我們的界面開發過程中,通常需要開發一些可以動態添加or刪除控件的容器,類似Tab頁一樣,為了美觀的話,我們通常使用伸縮因子將容器中的控件往一個方向擠,類似下面的控…

【設計模式精解】什么是代理模式?徹底理解靜態代理和動態代理

目錄 靜態代理 動態代理 JDK動態代理 CGLIB代理 JDK動態代理和CGLIB代理的區別 總結 代理模式簡單來說就是 我們使用代理對象來代替對真實對象(real object)的訪問,這樣就可以在不修改原目標對象的前提下,擴展目標對象的功能。 代理模式有靜態代理…

MCU AI/ML - 彌合智能和嵌入式系統之間的差距

作者:芯科科技產品營銷高級經理Gopinath Krishniah 人工智能(AI)和機器學習(ML)是使系統能夠從數據中學習、進行推理并隨著時間的推移提高性能的關鍵技術。這些技術通常用于大型數據中心和功能強大的GPU,但…

Redis中的sdshdr的len和alloc那塊的知識點詳解

文章目錄核心比喻:一個可以伸縮的水瓶場景一:創建一個新字符串場景二:追加字符串(觸發“空間預分配”)場景三:再次追加字符串(利用空閑空間)場景四:縮短字符串&#xff0…

在Linux下訪問MS SQL Server數據庫

Linux作為一個免費的Unix類操作系統,以其開放性源代碼、多任務、X window等特點為眾多的用戶所采用,并有很多企業采用Linux來作為其內部網的全功能服務器(WWW,FTP,Email、DNS)。企業的內部網不僅要提供文本信息的訪問,…

計算機視覺-OpenCV

一下載第三方庫opencv-python3.4.18.65opencv-contrib-python3.4.18.65import cv2 # 讀取的格式是BGR numpy import numpy as np# 讀取圖片 a cv2.imread(generated_image.jpg) # 讀取圖片 print(a) # NumPy數組,其中存儲了讀取的圖像文件的像素值。cv2.imshow…