Test 單元測試藝術 1 基礎知識

2022-02-12 11:11:27 字數 4100 閱讀 7377

單元測試不是軟體開發的新概念,在2023年就一直存在,屢屢被證明是最理想的方法之一。

本系列將分成3節:

單元測試基礎知識

打破依賴,使用模擬物件,樁物件,測試框架

建立優秀的單元測試

本節索引:

單元測試與整合測試

單元測試幾乎總是基於框架來寫的,因為框架可以為我們提供統一的api來管理測試。

常用的框架有unit test(ms test),nunit(開源)

定義單元測試是一段**呼叫另一段**,隨後檢驗一些假設的正確性。(單元指的是乙個方法或函式)

整合測試是指把2個或多個互相依賴的軟體模組作為一組進行測試。

優秀的單元測試準則

自動的,可重複

容易實現

持續可用

簡單快速

測試驅動(tdd)開發

對於tdd確切的含義,有很多不同的觀點,有人覺得就是測試優先的開發,有人覺得意味著大量的測試,有人覺得是一種設計方法。

tdd的流程:

寫測試 寫** 重構 寫下乙個測試

它顯示了tdd是增量性質的,每次一小步,最終完成高質量的軟體。(重構可以在完成每個測試後進行,也可以在完成幾個測試後進行。重構是非常有價值意義的。)

tdd的優點:

較高的**測試覆蓋率

測試是可信賴的

輔助設計,減少**複雜度

ms test和nunit

所有的測試框架都共享相同的核心特性:test declaration, test execution, and assertions.

在.net中一般使用特性標籤來新增額外的資訊,下面就是ms test和nunit在特性標籤上不同的地方。

ms test attribute

nunit attribute

用途[testclass]

[testfixture]

定義乙個測試類,裡面可以包含很多測試函式和初始化、銷毀函式(以下所有標籤和其他斷言)。

[testmethod]

[test]

定義乙個獨立的測試函式。

[classinitialize]

[testfixturesetup]

定義乙個測試類初始化函式,每當執行測試類中的乙個或多個測試函式時,這個函式將會在測試函式被呼叫前被呼叫一次(在第乙個測試函式執行前會被呼叫)。

[classcleanup]

[testfixtureteardown]

定義乙個測試類銷毀函式,每當測試類中的選中的測試函式全部執行結束後執行(在最後乙個測試函式執行結束後執行)。

[testinitialize]

[setup]

定義測試函式初始化函式,每個測試函式執行前都會被呼叫一次。

[testcleanup]

[teardown]

定義測試函式銷毀函式,每個測試函式執行完後都會被呼叫一次。

[assemblyinitialize]

--定義測試assembly初始化函式,每當這個assembly中的有測試函式被執行前,會被呼叫一次(在assembly中第乙個測試函式執行前會被呼叫)。

[assemblycleanup]

--定義測試assembly銷毀函式,當assembly中所有測試函式執行結束後,執行一次。(在assembly中所有測試函式執行結束後被呼叫)

[descriptionattribute]

[category]

定義標識分組。

第乙個單元測試

安裝

對於ms test,只要安裝vs則會自動安裝。在工具欄==測試==視窗==測試資源管理器開啟。

編碼

配置物件

操作物件

斷言結果

[testclass]

public

class

blogtests

//////

每個測試方法執行前都會執行

///[testinitialize]

public

void

init()

[testmethod]

public

void

testadd()

;//2 操作物件

db.add(blog);

//3 斷言結果

assert.istrue(blog.id > 0

); }

//////

每個測試方法執行後都會執行

///[testcleanup]

public

void

clean()

}

異常的測試有時候,測試裡面上需要丟擲異常,這是業務上的正確性。在單元測試裡,也有對應特性用來實現。如

[expectedexception(typeof(outofmemoryexception), allowderivedtypes = true

)]//預設異常的子類也會不通過測試的

[testmethod]

public

void

testadd()

;//2 操作物件

db.add(blog);

throw

newoutofmemoryexception();

//3 斷言結果

assert.istrue(blog.id > 0

); }

忽略的測試有時候,測試寫的有問題,**沒問題。我們可以暫時忽略該測試

[ignore]

[testmethod]

public

void

testadd()

;//2 操作物件

db.add(blog);

throw

newoutofmemoryexception();

//3 斷言結果

assert.istrue(blog.id > 0

); }

對測試分組當我們只想測試某一類測試的時候,也有對應的特性

[testcategory("

change db")]

[testmethod]

public

void

testadd()

;//2 操作物件

db.add(blog);

//3 斷言結果

assert.istrue(blog.id > 0

); }

[testcategory(

"no change")]

[testmethod]

public

void

testread()

執行選定的測試即可

測試

命名規範

sut kind

sut專案

新建乙個【被測專案】.tests的測試專案

類至少為每個被測試類新建乙個【被測類名】tests的類

方法至少為每個方法名新建乙個【方法名】【測試場景】【預期行為】的方法

或者使用test【方法名】的簡單命名

備註:sut("system under test")代表被測系統,有些人喜歡cut("code under test")。通常sut。

單元測試基礎知識

本人部落格文章 單元測試,用於驗證你的應用程式是否可以按照預期的方式正常執行.主要通過mock或者stub機制來隔絕與其他元件 服務之間的依賴,控制測試的邊界,從而針對乙個個單獨的類或方法進行 檢查與測試.因為每個單元 類或方法 都是整個系統的基石.當實施單元測試時,雖然短期來會對生產效率造成影響,...

單元測試基礎知識 筆記

致敬科比 今天科比退役 thank you 1.單元測試是開發者編寫的一小段 用於檢驗被測 的乙個很小的 很明確的功能是否正確 乙個單元測試是用於判斷某個特定條件 或者場景 下某個特定函式的行為 單元測試的核心內涵 這個簡單有效的技術就是為了令 變得更加完美 2.assertion 斷言 它是乙個簡...

單元測試(1)

為什麼引入單元測試 單元測試 對軟體設計的最小單元進行正確性檢測的測試,將可能存在的錯誤在最小範圍內發現解決 單元測試的目的 發現模組內部邏輯,語法,演算法,功能的錯誤 單元測試方法 級別測試和模組功能測試 級別測試 熟悉模組功能,內部邏輯與介面,編寫測試用例 1.介面測試 確保資料結構可用,例如資...