mit6.031 2023spring 軟件構造 筆記 Testing

當你編碼時,目標是使程序正常工作。 但作為測試設計者,你希望讓它失敗。 這是一個微妙但重要的區別。

為什么軟件測試很難?

  • 做不到十分詳盡:測試一個 32 位浮點乘法運算 。有 2^64 個測試用例!
  • 隨機或統計測試效果差:其他工程學科可以測試小的隨機樣本(例如制造的硬盤驅動器的 1%)并推斷整個生產批次的缺陷率。但是對于軟件來說并非如此。軟件行為在可能輸入的空間內不連續且離散地變化,系統可能在廣泛的輸入范圍內似乎工作正常,然后在單個邊界點突然失效,堆棧溢出、內存不足錯誤和數字溢出錯誤往往會突然發生。

Test-first programming

順序:

  1. Specification (規范):編寫函數簽名和注釋,明確其行為、輸入約束和輸出。
  2. Test (測試):根據規范編寫測試用例。
  3. Implementation (實現):編寫實現代碼,并通過已寫的測試。

測試優先編程的最大好處是防止錯誤。 不要將測試留到開發結束,因為此時有一大堆未經驗證的代碼。 將測試留到最后只會使調試時間更長、更痛苦,因為錯誤可能存在于代碼中的任何位置。

Systematic testing

我們希望進行系統測試,而不是詳盡、隨意或隨機的測試。系統測試意味著我們以有原則的方式選擇測試用例,目標是設計一個具有三個理想屬性的測試套件:

通過分區選擇測試用例

我們希望選擇一組足夠小的測試用例,以便于編寫和維護并快速運行,但又足夠徹底以發現程序中的錯誤。

為此,我們將程序的輸入空間劃分為多個子域,每個子域由一組輸入組成。我們只需要為每個集合測試一個代表。 這種方法通過選擇不同的測試用例,并強制測試探索隨意或隨機測試可能無法到達的輸入空間區域,從而充分利用了有限的測試資源。

例:

Math.abs()

測試用例:

  • a = 17 覆蓋子域 a > 0
  • a = 0 覆蓋子域 a = 0
  • a = -3 覆蓋子域 a < 0

Math.max()

測試用例:

  • (a,b) = (1, 2) 覆蓋 a < b
  • (a,b) = (10, -8) 覆蓋 a > b
  • (a,b) = (9, 9) 覆蓋 a = b

子域應具有三個理想的屬性:

  • 互斥
  • 完整
  • 非空

自動化單元測試

  • 單元測試 (Unit Test):測試單個模塊(如函數)的測試。
  • 自動化:使用測試框架(如Mocha for JS/TS)編寫測試代碼,自動運行并檢查結果(使用assert.strictEqual, assert.deepStrictEqual等斷言),輸出通過/失敗報告。
  • 文檔化測試策略 (Documenting Strategy):在測試代碼中以注釋形式記錄所采用的分區策略,并為每個測試用例命名其所覆蓋的子域(如it("covers a < b", ...)),這極大地增強了測試套件的可理解性。

黑盒 vs 玻璃盒測試

  • 黑盒測試僅根據規范選擇測試用例,不查看實現代碼。這是測試優先編程的天然方式。
  • 玻璃盒測試基于對實現代碼的了解選擇測試用例(例如,測試不同的算法分支、內部緩存機制等)。
  • 結合使用:先進行黑盒測試(定義分區),再通過玻璃盒測試和覆蓋率分析來補充測試用例,提高徹底性。

覆蓋率

衡量測試套件對代碼的覆蓋程度,常用指標:

  • Statement coverage (語句覆蓋):是否每條語句都被至少一個測試執行過?(常見目標)
  • Branch coverage (分支覆蓋):是否每個控制分支(如if/else的兩邊)都被至少一個測試執行過?
  • Path coverage (路徑覆蓋):是否所有可能的執行路徑都被覆蓋?使用工具(如Istanbul/nyc)測量覆蓋率,并補充測試用例以提高覆蓋率

單元測試 vs. 集成測試

  • 單元測試孤立地測試單個模塊。優點:錯誤更容易定位(就在被測試的模塊中)。
  • 集成測試:測試多個模塊的組合或整個系統。必要但錯誤可能出現在任何連接的模塊中。
  • 策略:首先依靠全面的單元測試建立對各個模塊的信心,然后使用集成測試來檢查模塊間的交互。盡量避免在單元測試中依賴其他可能出錯的模塊

自動化回歸測試

  • 回歸測試 (Regression Testing):在每次修改代碼后(修復bug、添加功能、優化性能)運行完整的測試套件,防止修改引入新的錯誤
  • 測試優先調試 發現bug時,立即編寫一個能重現該bug的測試用例,并將其加入測試套件。修復bug后,該測試用例就成為防止未來回歸的回歸測試
  • 自動化是回歸測試可行的關鍵。

迭代式測試優先編程

軟件開發不是線性的,應采用迭代方式:

  1. 編寫初步規范和測試。
  2. 編寫初步實現。
  3. 根據實現中發現的問題,迭代改進規范、測試和實現。
    迭代允許更快地獲得反饋,更有效地利用時間,特別是在解決復雜問題時。

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

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

相關文章

【Unity開發】Unity核心學習(三)

四、三維模型導入相關設置 1、Model模型頁簽&#xff08;1&#xff09;場景相關&#xff08;2&#xff09;網格相關&#xff08;3&#xff09;幾何體相關2、Rig操縱&#xff08;骨骼&#xff09;頁簽 &#xff08;1&#xff09;面板基礎信息&#xff08;i&#xff09;None&…

C#語言入門詳解(17)字段、屬性、索引器、常量

C#語言入門詳解&#xff08;17&#xff09;字段、屬性、索引器、常量前言一、字段 Field二、屬性三、索引器四、常量內容來自劉鐵猛C#語言入門詳解課程。 參考文檔&#xff1a;CSharp language specification 5.0 中文版 前言 類的成員是靜態成員 (static member) 或者實例成…

Total PDF Converter多功能 PDF 批量轉換工具,無水印 + 高效處理指南

在辦公場景中&#xff0c;PDF 格式的 “不可編輯性” 常成為效率瓶頸 —— 從提取文字到格式轉換&#xff0c;從批量處理到文檔加密&#xff0c;往往需要多款工具協同。Total PDF Converter 破解專業版作為一站式 PDF 解決方案&#xff0c;不僅支持 11 種主流格式轉換&#xff…

[Windows] WPS官宣 64位正式版(12.1.0.22525)全新發布!

[Windows] WPS官宣 64位正式版 鏈接&#xff1a;https://pan.xunlei.com/s/VOYepABmXVfXukzlPdp8SKruA1?pwdeqku# 自2024年5月&#xff0c;WPS 64位版本在WPS社區發布第一個內測體驗安裝包以來&#xff0c;在近一年多的時間里&#xff0c;經過超過3萬名WPS體驗者參與版本測試…

WinExec

函數原型&#xff1a; __drv_preferredFunction("CreateProcess","Deprecated. See MSDN for details") WINBASEAPI UINT WINAPI WinExec(__in LPCSTR lpCmdLine,__in UINT uCmdShow); preferred : 更好的 __drv_preferredFunction("CreateProcess…

基于GA遺傳優化的雙向LSTM融合多頭注意力(BiLSTM-MATT)時間序列預測算法matlab仿真

目錄 1.前言 2.算法運行效果圖預覽 3.算法運行軟件版本 4.部分核心程序 5.算法仿真參數 6.算法理論概述 7.參考文獻 8.算法完整程序工程 1.前言 時間序列預測是機器學習領域的重要任務&#xff0c;廣泛應用于氣象預報、金融走勢分析、工業設備故障預警等場景。傳統時間…

Multi-Head RAG: Solving Multi-Aspect Problems with LLMs

以下是對論文《Multi-Head RAG: Solving Multi-Aspect Problems with LLMs》的全面解析&#xff0c;從核心問題、方法創新到實驗驗證進行系統性闡述&#xff1a;??一、問題背景&#xff1a;傳統RAG的局限性??傳統檢索增強生成&#xff08;RAG&#xff09;在處理??多維度復…

Jenkins 全方位指南:安裝、配置、部署與實戰應用(含圖解)

一、Jenkins 安裝 1.1 系統要求 基礎環境&#xff1a;Java 8 或 Java 11&#xff08;推薦&#xff09;、至少 2GB 內存、10GB 以上磁盤空間 支持系統&#xff1a;Windows、Linux&#xff08;Ubuntu/CentOS&#xff09;、macOS 網絡端口&#xff1a;默認使用 8080 端口&…

以國產IoTDB為代表的主流時序數據庫架構與性能深度選型評測

> &#x1f4a1; 原創經驗總結&#xff0c;禁止AI洗稿&#xff01;轉載需授權 > 聲明&#xff1a;本文所有觀點均基于多個領域的真實項目落地經驗總結&#xff0c;數據說話&#xff0c;拒絕空談&#xff01; 目錄 引言&#xff1a;時序數據庫選型的“下半場” 一、維…

7.2elementplus的表單布局與模式

基礎表單<template><el-form ref"ruleFormRef" :model"form" :rules"rules" label-width"100px"><el-form-item label"用戶名" prop"username"><el-input v-model"form.username"…

PyTorch實戰(3)——PyTorch vs. TensorFlow詳解

PyTorch實戰&#xff08;3&#xff09;——PyTorch vs. TensorFlow詳解0. 前言1. 張量2. PyTorch 模塊2.1 torch.nn2.2 torch.optim2.3 torch.utils.data3. 使用 PyTorch 訓練神經網絡小結系列鏈接0. 前言 PyTorch 是一個基于 Torch 庫的 Python 機器學習庫&#xff0c;廣泛用…

在win服務器部署vue+springboot + Maven前端后端流程詳解,含ip端口講解

代碼打包與基本配置 首先配置一臺win系統服務器&#xff0c;開放你前端和后端運行的端口&#xff0c;如80和8080 前端打包 前端使用vue3&#xff0c;在打包前修改項目配置文件&#xff0c;我使用的是vite所以是vite.config.js。 import { defineConfig } from vite import …

Springcloud-----Nacos

一、Nacos的安裝 Nacos是阿里推出的一種注冊中心組件&#xff0c;并且已經開源&#xff0c;目前是國內最為流行的注冊中心組件。下面我們來了解一下如何安裝并啟動Nacos。 Nacos是一個獨立的項目&#xff0c;我們可以去GitHub上下載其壓縮包來使用&#xff0c;地址如下&#x…

騰訊云重保流程詳解:從預案到復盤的全周期安全防護

摘要 騰訊云針對國家級重大活動&#xff08;如進博會、冬奧會等&#xff09;提供的網絡安全保障服務&#xff08;重保&#xff09;是一套系統化的主動防御體系。本文從“事前準備”“事中響應”“事后復盤”三個核心階段出發&#xff0c;結合民生銀行等典型用戶的實戰案例&…

單表查詢-group by rollup優化

1、group by rollup基本用法 我們有時候在項目上看到group by rollup用法&#xff0c;其實就是對group by分組進行合計。 下面看一下例子 select count(1),c3 from t1 group by rollup(c3); 計劃從計劃中解讀亦是如此&#xff0c;另外可以從結果上進行分析第21行的count其實就是…

云網絡(參考自騰訊云計算工程師認證)

計算機網絡&#xff1a;OSI七層模型&#xff1a; 應用層&#xff1a;負責處理網絡應用程序之間的通信、 表示層&#xff1a;負責數據的格式化和加密、 會話層&#xff1a;負責建立、管理和終止會話、 傳輸層&#xff1a;負責端到端的可靠傳輸、 網絡層&#xff1a;負責數據的路…

【MLLM】多模態理解Ovis2.5模型和訓練流程(更新中)

note 模型架構&#xff1a;延續 Ovis 系列創新的結構化嵌入對齊設計。 Ovis2.5 由三大組件構成&#xff1a;動態分辨率 ViT 高效提取視覺特征&#xff0c;Ovis 視覺詞表模塊實現視覺與文本嵌入的結構對齊&#xff0c;最后由強大的 Qwen3 作為語言基座&#xff0c;處理多模態嵌…

mysql中的通用語法及分類

MySQL 是一種廣泛使用的關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;其語法設計遵循 SQL 標準&#xff0c;但也有一些特有的擴展。以下從??通用語法規范??和??SQL 語句分類??兩個維度系統梳理 MySQL 的核心語法體系。一、MySQL 通用語法規范通用語法…

Linux-搭建NFS服務器

Linux-搭建NFS服務器前言一、網絡配置二、在nfs服務器上安裝nfs-utils軟件包三、設置共享目錄四、掛載NFS共享目錄前言 NFS&#xff08;Network File System&#xff0c;網絡文件系統&#xff09; 是一種分布式文件系統協議&#xff0c;最初由 Sun Microsystems 于 1984 年開發…

eslasticsearch+ik分詞器+kibana

eslasticsearch 下載地址:https://www.elastic.co/cn/downloads/past-releases ik分詞器 下載地址&#xff1a;https://release.infinilabs.com/analysis-ik/stable/ kibana 下載地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 1、解壓安裝包 將下載的 zi…