測試影響分析的崛起
測試影響分析 (TIA) 是加速建置測試自動化階段的現代方式。它的運作方式是分析原始碼的呼叫圖,找出在變更生產程式碼後應該執行哪些測試。Microsoft 已針對此方法進行廣泛的研究,但開發團隊也可以相當低廉的成本實作一些有用的功能。
2017 年 8 月 22 日
現代軟體開發的一項詛咒是「太多」測試,導致在簽入前無法執行所有測試。當情況變成這樣時,開發人員會使用一種代價高昂的應對策略,即不在其本機開發工作站上執行任何測試。他們改為依賴稍後在整合伺服器上執行的測試。而且,即使是那些測試也常常失修,當 向右轉移 對開發團隊來說變得正常時,這是不可避免的。
當然,您在 整合前 測試的所有內容都應該在 持續整合 (CI) 基礎架構中立即在 整合後 進行測試。即使是運作最良好的開發團隊,也可能會因為提交在即時環境中著陸而導致故障。這些團隊中也可能有人有時想要「節省」約定的整合流程,而不執行測試。幸運的是,CI 伺服器和一系列適當的建置步驟是您快速掌握這些時機的方法。
有各種技術可以加快測試執行速度,包括在多部機器上並行執行測試,以及對緩慢的遠端服務使用測試替身。但本文將重點放在減少要執行的測試數量,方法是找出最有可能找出新加入錯誤的測試。透過測試金字塔結構,我們更頻繁地執行單元測試,因為它們通常執行得更快、較不易中斷,而且提供更具體的回饋。特別是,我們架構一組測試,作為 CI 的一部分來執行:整合前和整合後。然後,我們建立部署管線,稍後再執行較慢的測試。
重新陳述相同的問題:如果測試執行速度無限快,我們會一直執行所有測試,但事實並非如此,因此我們在執行測試時需要平衡成本與價值。
在本文中,我詳細說明了一個新興的測試相關電腦科學領域,由 Microsoft 領先,擁有長久測試自動化套件的公司應注意這個領域。如果您在 .NET 生態系統中,您可以立即受益於 Microsoft 在「測試影響分析」方面的進展。如果您沒有使用 .NET,您必須能夠自己以相當便宜的方式設計一些東西。我以前的一位雇主根據我以下分享的概念驗證工作,自己設計了一些東西。
縮短測試自動化的傳統策略
為了完整說明,我將回顧傳統的「執行測試子集」策略,這些策略在業界仍然佔主導地位。好吧,加上並行測試執行和服務虛擬化的更新現實。
建立套件和標籤

單元、服務和功能性 UI 的主要群組。在單元測試中,有意義的子群組標籤,包括一個「快速」標籤,用於抽樣其他標籤的子集。

在執行「購物車」測試後,所有測試都通過,只有一個除外。在此處。
這種方法適用於遞迴建置技術,例如 Ant、Maven、MSBuild、Rake 等。
過去,團隊會放棄讓他們的測試無限快,並使用套件或標籤一次針對測試的子集。透過建立套件和標籤,可以口頭描述測試的子集。例如「購物車的 UI 測試」。標籤或套件可以暗示應用程式的業務領域,或技術或分層群組。定義標籤和套件需要專家的人為設計創意。至少為了朝向最佳群組化邁進。這意味著它們也可能群組不足、不精確和不正確,這很常見,即使人類很難確定。一次執行太少或太多的測試,很有可能只執行一個套件,這會浪費運算資源和時間,也可能導致錯誤被忽略。團隊可能會選擇使用每個提交較小套件的 CI 工作,然後再使用執行所有測試的夜間建置工作。顯然,這會延遲壞消息,並破壞持續整合的目標。
然而,套件和標籤是大多數軟體開發界組織其測試程式碼庫的方式。
來源與測試的預先計算圖表

276 個測試及其名義上的「大小」標示。

針對特定提交執行的測試,導致兩個失敗。事實上,其中一些變小了,一些變中等,一些變大了。我僅描繪樹狀圖/分形圖,因為它有助於解釋概念(實際上並非如此)。
Google 傳奇的內部建置系統 Blaze 多年來已複製到一些開源技術中。最著名的是 Facebook 的 Buck 和 Google 的 Bazel。Twitter、Foursquare 和 Square 的 Pants。Google 內部的 Blaze 會在整個單一儲存庫中導覽單一的有向圖。Blaze 有一種機制,可將測試直接關聯到製作程式碼。該機制是製作來源和關聯測試來源的精細目錄樹。它透過 BUILD 檔案(也已簽入)具有明確的相依性宣告。開發人員可以維護和演進這些 BUILD 檔案,但也可以透過自動化工具驗證其正確性或不正確性。隨著時間推移,重複該程序有助於使有向圖正確且有效率。
重要的是,該工具可以指出關於相依性的重複宣告。因此,對於給定的目錄/套件/名稱空間,開發人員可以很輕鬆地啟動測試子集,但僅透過 BUILD 檔案中的有向圖可行的測試。對於開發人員 預先整合 和整合基礎架構來說,最終的省時方法是規模化的 CI 基礎架構「Forge」(後來的 TAP),它是根據此內建智慧自動化測試子集,以便針對每次提交執行。
在 Taming Google-Scale Continuous Testing 中有一堆令人驚嘆的統計資料。在我看來,這些東西讓 Google 花費了數千萬美元,但多年來卻讓他們賺進了數十億美元。或許遠遠超過了收益:工資比率。
測試影響分析
測試影響分析 (TIA) 是一種技術,有助於確定針對特定變更集的測試子集。

針對假設變更執行的測試的類似描繪。
這個想法的關鍵在於,並非所有測試都會執行每個製作來源檔案(或從該來源檔案製作的類別)。程式碼覆蓋率或儀器化(在測試執行期間)是收集該情報的機制(詳情如下)。該情報最終會成為製作來源和將執行它們的測試的對應,但一開始是測試將執行的製作來源對應。

一個測試(來自許多測試)會執行製作來源的子集。

一個製作來源會由測試的子集執行(無論是單元、整合或功能測試)。
因此,您會注意到已執行測試的樣式化圖表與上述有向圖形建置技術相同。它們實際上是相同的,因為隨著時間推移對 BUILD 檔案的策劃會導致與 TIA 大致相同的結果。
TIA 對應實際上只能用於變更相對於參考點。這可以像開發人員要提交或已提交的工作一樣簡單。它也可以是一堆提交。例如,今天提交的所有內容(夜間建置),或自上次發布以來提交的所有內容。
使用 TIA 方法的一個體悟是,您有太多測試涵蓋製作程式碼的相同區段。其中有直接重複的,那麼在分析測試以及它執行的製作程式碼路徑後刪除測試是一種可能性。不過,通常情況並非如此,找出如何將測試重點放在您想要測試的內容上,而不是完全放在程式碼中的傳遞依賴項上,這是一個不同的重點領域,不可避免地依賴於使用 測試替身 和最近的服務虛擬化(用於整合測試)的既定做法。
建立已變更內容清單的最低層級是「已變更的製作來源」,但理想情況是確定已變更的方法/函式,並進一步子集化到只會執行這些方法/函式的測試。不過,目前有一個微軟的現成技術在來源檔案層級運作,還有一個可重複使用的技術(由我提供)。請繼續閱讀。
Microsoft 的廣泛 TIA 工作
Microsoft 已投入最長期的協同努力,將測試影響分析概念商品化,並賦予該概念名稱及其縮寫。
截至目前,他們有一系列的部落格文章,時間橫跨 2017 年 3 月至 8 月:使用測試影響分析加速持續測試 - 第 1 部分、第 2 部分、第 3 部分,以及 第 4 部分。
他們較早關於這方面的文章可回溯至八年前
- Visual Studio 2010 中的測試影響分析 (2009)
- 使用測試影響分析簡化測試流程) (2010)
- 自上次建置以來,應該執行哪些測試? (2010)
- 如何:收集資料以檢查在程式碼變更後應該執行哪些測試 (2010)
- 測試影響分析 (2011)
Microsoft 的 Pratap Lakshman 詳細說明了他們的實作演進。關於其 TIA 技術的目前演進,Pratap 表示:[1]
當觸發建置時,會重新計算受影響測試與生產程式碼的對應。執行這項工作的作業會在 VSTS 建置定義中的 VSTest 任務中執行。
我們的 TIA 實作會在測試方法執行時收集每個測試方法的動態相依性。
以下是我們執行的概略步驟:當測試執行時,它會涵蓋各種方法,而這些方法所在的原始檔就是我們追蹤的動態相依性。
因此,我們會得到類似下列的對應
Testcasemethod1 <--> a.cs, b.cs. d.cs Testcasemethod2 <--> a.cs, k.cs, z.cs
依此類推…
現在,當提交進入 a.cs
時,我們會執行所有動態相依性為 a.cs
的 Testcasemethod(s)
。我們當然會處理新引進的測試(可能會作為提交的一部分進入),並繼續執行先前失敗的測試。
我們的 TIA 實作尚未執行測試優先順序排序(例如,最常中斷的測試優先)。這項功能已在我們的雷達上,如果社群有足夠的興趣,我們會考慮納入。
實際的 TIA 對應資料會儲存在 TFS 中的 SQLServer 資料庫中。當提交進入時,TIA 會使用 TFVC/Git API 開啟提交,並查看變更進入的檔案。TIA 在得知檔案後,會諮詢對應資料,以了解要執行哪些測試。
當然,此 TIA 技術的使用支援於拉取要求 (PR) 和一般 CI 工作流程,以及 預整合(在開發人員的工作站上)。
我們希望我們的使用者採納 左移,並將他們的許多測試移至管線的較早期。過去,我們看到客戶對此有點疑慮,因為這表示每次提交時都要執行更多測試,從而使 CI 建置花費更長的時間。透過 TIA,我們希望我們的使用者 左移,並讓 TIA 負責只執行相關的測試,從而處理效能層面。
關於 TIA 在 TFS 和 Visual Studio 的最初幾年,他說
當時的 TIA 技術在許多方面都相當不同
- 它只會識別受影響的測試。它會留給使用者明確執行它們。
- 它使用區塊層級程式碼覆蓋率作為產生測試 <--> 對應的途徑。在後續的建置中,它會對較早的建置執行 IL-diff,找出變更的區塊,然後使用對應來識別和列出受影響的測試。請注意,它不會為您執行它們。
- 上述途徑讓它變得緩慢(與目前的實作相比),而且需要更多儲存空間來儲存對應資訊(與目前的實作相比)
- 上述途徑也讓它比目前的實作不那麼安全(在某些情況下,它會遺漏識別受影響的測試)。
- 它不支援 VSTS 建置工作流程(它只在較舊的 XAML 建置系統中受支援)
透過傳統程式碼覆蓋率工具和腳本進行測試影響分析
我在 HedgeServ 工作時,有一個想法,要將現代的現成程式碼覆蓋率工具納入相同的影響分析。從這個想法中,我寫了兩篇概念驗證部落格文章(並在 Github 上提供相關程式碼):一篇是關於 Maven 和 Java[2],另一篇是關於 Python[3]。當然,就像一個 eejit,我認為自己有新穎的發明,但我當時不知道這個領域已經有很多先例(如上述的 Microsoft)。我展示的技術在您的工具鏈中開發成本低廉,即使在 CI 基礎架構中執行可能需要成本。
測試影響分析的想法的簡單實作要求您有一個事前的活動
- 執行單一測試並收集其程式碼覆蓋率
- 從測試觸及的生產來源檔案中,建立一個臨時的生產來源對應(鍵)到測試路徑/名稱(值)
- 更新包含主對應的來源檔案,取代該測試的所有先前項目
- 將變更的對應來源檔案提交到 VCS(只有相關的 CI 工作才有權限執行此動作)
- 清除覆蓋率資料(以免將每個測試的覆蓋率報告糾纏在一起)
- 回到 #1 進行下一個測試(最近變更的來源/測試優先?)
在一次執行所有測試後,您會有一個全面的對應,將生產程式碼連接到涵蓋它們的測試。
然後,當您稍後對某些產品程式碼進行變更時,您可以找出哪些測試執行該程式碼,因此在執行時可能會提供資訊。產生的任何測試失敗都可能證明是因變更而發生的唯一測試失敗。上述兩個概念驗證包含少量的 Python 程式碼,用於嘗試
- 計算 TIA 地圖以預先滿足需求
- 在預先整合情況下使用 TIA 地圖(稍加修改後,也可以用於 CI 作業)
HedgeServ 的測試基礎由常規快速單元測試組成,後跟整合測試,這些整合測試是 Microsoft Excel 試算表,而這些試算表又間接呼叫 Python。其中有 12,000 個。這些測試是數小時的廣泛且進階演算法測試,在沒有「執行較少測試」策略的情況下,不可能在 CI 基礎架構中逐次整合執行。他們的 DevOps 團隊將概念驗證操作化為「測試減少器」(我最初給予此技術的名稱),而最快的排列組合現在為十分鐘。這是一個極大的進步。開發人員和測試工程師可以在預先整合時執行這些測試,而 CI 基礎架構也可以執行相同的操作。HedgeServ 的軟體開發執行董事 Kevin Loo 告訴我:「開發人員依賴更快的測試執行,而由於信心增加,開發速度也因此提升。」
由於使用一般性的程式碼覆蓋率工具,因此 TIA 面向必須一次執行一個測試,這會產生前期成本。因此,分析產生的地圖會檢查到原始碼控制中並逐步更新。因此,它必須是文字,且具有順序性,以便差異可以簡潔且具有一些意義。將地圖檢查到原始碼控制中也有利於 CI 基礎架構和個別開發人員在整合(和程式碼檢閱)之前執行較少的測試。
此 TIA 設計因程式碼覆蓋率工具的性質而有其限制:一次只能執行一個測試,才能計算出準確的影響圖。為了使用對應資料,需要執行「git status」(或 git show >hash>),然後解析輸出,找出「已變更/已新增/已刪除」的製作程式碼來源。這些是影響對應的關鍵,會產生要執行的測試清單。只有資料收集 CI 工作有「一次一個測試」的限制,這也是你或多或少會認為它持續執行的緣故。
如你所見,測試技術可能與你用於製作程式碼的主要語言選擇完全不同。就 HedgeServ 的案例而言,他們的演算法測試在受原始碼控制的 Microsoft Excel 檔案中(甚至連 BA 都參與其中)。如果這樣可行,那麼 SmartBear 的 TestComplete、HP 的 Unified Functional Testing(UFT,前身為 QTP)以及 Selenium 當然也可以。唯一的需求是測試可以編寫成一次執行一個(在你建立 TIA 對應時)。在最初建立對應後,你還必須承諾定期更新對應,請使用你的 CI 基礎架構。
接著,你必須決定將對應資料儲存在哪裡。你可以選擇檔案分享、文件儲存或關聯式架構。我選擇(並建議)將文字檔案儲存在與製作來源本身位於相同儲存庫/分支的目錄中。至少這樣可以讓分支運作(無論你的分支模式為何),並讓不同的影響對應反映出程式碼不同的性質。
最近,我為一位客戶檢視一個專案,該專案使用 KDB 和 Q 作為其系統,並試著建議他們如何縮短測試時間。這些語言沒有程式碼覆蓋率技術,所以那次對話就到此結束。
VectorCAST/QA - 應用程式
Vector Software 製作了一項名為 VectorCAST/QA 的產品,這是一個一站式應用程式,以相同的方式利用程式碼覆蓋率來執行較少的受影響測試(甚至更多)。他們的技術主要銷售給嵌入 C、C++ 和 Ada 軟體的汽車(及相關)產業。VectorCAST 以這種操作模式運作的時間也早於我的「廚房水槽」實驗。我必須加強我的 Google 技能!
NCrunch for VisualStudio
NCrunch 於 2011 年在經過幾年的開發後,針對 .NET 團隊推出。這是一個 Visual Studio 的精緻外掛程式,可以根據演算法最佳化測試的執行順序,這些演算法會預測哪些測試最有可能因變更而中斷。2014 年新增了額外功能,讓它可以將測試子集化為僅受變更影響的測試。同樣在 2014 年,NCrunch 開始與 CI 用法相容。具體來說,它能夠在 VisualStudio UI 之外編排 MsBuild 的執行,並節省你所希望的相同經過時間。原始影響對應資料不會儲存在原始碼控制中,因為它是二進位的,但可以在網路分享上與開發人員和 CI 基礎架構之間分享。NCrunch 是商業軟體,但收取合理的每位開發人員(和每位測試工程師)授權費用。CI 節點是免費的,而 NCrunch 的創建者 Remco Mulder 同意,沒有人應該為某件事付兩次費用,或因為在 2017 年透過 Docker 等方式擴充他們的 CI 基礎架構而受到懲罰。
IDE 中的 TIA 支援
Microsoft 亦在 Visual Studio 中提供強大的 Live Unit Testing[4] 功能,若啟用此功能,即使在編輯程式碼時,也會自動執行受影響的單元測試。儘管與 TIA 相關,但這或許值得單獨分析。
上個月,我認為自己會向 JetBrains 提出功能要求,以在他們的 IDE 中建立等同於 TIA 的功能。在對我提出的問題進行分流期間,JetBrains 將其連結到2010 年提出的另一個相同主題,其中有人建議已實作此功能的一部分。不過,我嘗試使用時無法讓它運作 ☹️
定義
整合前和整合後
整合前活動是開發人員在其工作站上執行的活動,可能包括本機(希望是短期)功能分支、小提交(稍後可能會或可能不會壓縮成一個,以及在對問題故事卡宣告「完成」之前的編輯/建置週期。這肯定是在提交傳遞到程式碼檢閱等之前。
整合後是工作(一個或多個提交)已完成程式碼檢閱並返回主幹/主控/主線的階段。在那之後不久,所有團隊成員都將能夠將其拉到他們的工作站,而且可能應該這樣做。
向左和向右轉移
左移是採取軟體開發價值串流中某個步驟並將其向上移動時間軸的過程。例如,進行手動測試並以測試自動化取代。另一個例子是在將缺陷輸入到待辦事項清單(故事追蹤器)之前,在產品負責人的腦海中發現缺陷。在這種情況下,缺陷是一個產品構想,會在追蹤器中變成功能要求,最終會被判定為指定錯誤,而不是一個 bug。這可能是意外發生的,但如果你實施一個新的流程來執行此操作,這將會是左移議程的一部分。Barry Boehm 的「變更成本曲線」說明了更大的主題,也就是越早發現錯誤,修復成本就越低,而在生產中發現錯誤時,修復成本最高。事實上,「左移」是一個小產業原因。企業使用它來描述一種解釋更便宜、更快速尋求的替代方式。特別是與持續整合和敏捷、CD 等相同目標。
右移是指你執行非敏捷的事情,例如將單元測試執行移至「夜間」建置(或頻率較低),而不是在每次整合的 CI 建置中讓它們執行得更快。有時你已執行一些伴隨著風險的左移活動,而這只能透過額外的右移步驟來減輕風險。
此領域的歷史工作
Google-Testar(2006 年)
Mikhail「Misha」Dmitriev 在 2006 年於 Google 任職期間製作了 Testar。
Misha 的目標:不要執行所有測試,同時宣稱「我們可以憑經驗證明我們不必執行」。
Testar 使用位元組碼儀器記錄每個測試的程式碼覆蓋率,也就是每個測試執行的應用程式方法。此資訊連同類別和方法的檢查碼,會儲存在測試資料庫(TDB)中。在後續呼叫中,Testar 會找出開發人員已變更的類別和方法,然後只重新執行涵蓋已更新程式碼的那些測試。假設先前通過的其他測試將會再次通過,因為它們執行的程式碼並未變更。當然,如果任何測試先前未通過,或才剛新增,Testar 將無條件執行該測試。
Misha 回報平均 60..70% 的時間節省,因為沒有執行「不受影響」的測試。然而,這項技術並非沒有問題。首先,節省是不一致的:例如,如果開發人員重複變更大部分測試使用的某個方法,節省的幅度就會很小。其次,如果測試結果不僅取決於程式碼,還取決於某些外部輸入,例如資源檔案,使用者需要明確地將所有這些檔案指定給 Testar。該工具無法自動判斷哪些測試取決於給定的資源檔案,只能重新執行所有測試或使用者明確指定的那些測試。
Misha 在此的反思:[5]
當時,現成的位元組碼儀器化程式庫比較不精密,或者缺乏彈性。我發現,除非某些程式庫品質一流,否則事先撰寫更多自己的程式碼更有意義,然後在稍後擁有更大的自由度。
Misha 關於他在 Google 和其他公司的經驗
我最後得出結論,如果公司執行各種測試,並且擁有足夠的硬體資源,像 Testar 這樣的技術可能不是最佳選擇。在這種情況下,以高度並行化執行所有測試更為可靠。然而,Testar 所執行的細緻選擇性測試執行在特殊情況下可能仍然可行。例如,當個別測試花費極長時間,且無法透過並行化或其他技術加速時,或者當硬體資源有限,但測試的資源檔案和其他非程式碼輸入沒有問題時,等等。
在我看來,如果有人想要賦予 Testar 新生命,Testar 似乎可以重獲新生。此外,Testar 是我找到的第一個執行 TIA 的技術,但它是基於在某個會議中提出概念的論文。Misha 表示他現在找不到那篇論文。
ProTest:脆弱的測試應該提早失敗
2007 年,一些 Thoughtworks 同事 Kent Spillner、Dennis Byrne、Naresh Jain 等人公開原始碼 Protest,該程式碼旨在先執行最有可能中斷的測試。最有可能的測試是歷史中斷統計資料的組合,以及目前是否變更生產或測試原始碼。最近變更的生產原始碼檔案會影響測試,這些測試成為優先順序的候選者。變更的測試也會成為候選者。歷史上脆弱的測試和最近變更的測試的交集將會是自訂 JUnit 測試執行器首先執行的測試。相關的建置步驟總共會花費相同時間,但可以提早發布測試失敗訊息。這是因為 CI 技術不會等到建置步驟結束才傳達失敗訊息,因為它們會逐一測試監聽記錄事件,或擷取記錄輸出。整合到 IDE(Intellij 和 Eclipse)的執行器也是如此。
Naresh 回憶
我們建置了一個 AST,然後使用訪客模式瀏覽程式碼並收集有趣的統計資料。就 ProTest 所執行的步驟而言
- 在測試階段啟動時,ProTest 處理測試和 prod 類別的位元組碼,以建立 prod 類別與測試的對應
- 它根據原始檔時間戳記計算工作副本中的變更
- 從這些變更中,它找出必須執行的最小測試組,並優先執行它們
- 測試報告正常發布,並對該組進行後續的通過/失敗判斷
Dennis 補充
Kent 為任何可插入演算法寫了一個擴充點,讓你可以根據 康多塞投票策略 (每個投票者必須對所有候選人進行排名) 來使用。我寫了一堆引導演算法。其中一個使用 ASM 來建立依賴關係圖,然後根據測試與變更的接近程度來對測試進行排序。不過,我們從未達到 1.0 版 🤔
Kent 這樣看待 ProTest
對應不會在呼叫之間保留,因為沒有必要保留,計算應該執行的測試是一致且非常快速的。我見過最接近 ProTest 的東西是 Kent Beck 的 JUnit Max,但那可能是在 Dennis 提出 ProTest 構想幾年後。我希望我們能做更多事來完成 ProTest。直到今天,我經常發現自己仍然處於某些情況,我真的很需要像它那樣的東西。我知道 Naresh 後來招募了更多人繼續開發它,但那項工作也停滯了。也許有一天其他人會接手並繼續下去。這就是開源軟體的優點,對吧?
JTestMe:「只要測試我」
同樣在 2007 年,其他一些 Thoughtworks 同事 Josh Graham 和 Gianny Damour 開發了一種名為 JTestMe 的開源技術,它使用 AOP 來建立生產類別與會執行它們的測試的儲存庫。它與 ProTest 非常相似,因為它也希望優先執行更有可能失敗的測試。
Josh 回憶道
使用執行時期呼叫分析的理由是,儘管靜態分析對 Java 很有用,但它無法揭示具有反射功能且鼓勵使用其他語言(包括靜態分析不太直接的語言,例如當時的 JRuby 和現在的 Clojure)的平台上的所有內容。
概念驗證簡單且快速。它在測試組執行期間對所有 JUnit 測試方法(即測試案例)建立一個切入點。該切入點建議在呼叫任何非測試類別的非私有方法時。然後,該建議會記錄類別的原始檔名稱和當時執行的測試。
有了這個原始碼檔名對應測試案例的對應,任何時候原始碼檔發生變更,就會知道需要執行哪些測試案例。我稱這為「動態定義的 冒煙測試」。在 CI 伺服器上,會擷取修訂資訊並用於查詢對應,以確定哪些測試案例可以優先執行。在開發人員的本機電腦上,基於 inotify 的工具會在原始碼檔變更時通知,並且會在側邊程序中執行觸及該類別的測試案例。在 IDE 中,我使用出色的 Infinitest,並使用自訂清單(持續由對 JTestMe 的查詢更新)。對應本身是一個簡單的 Java 物件序列化到檔案。它可以提交到原始碼控制,因為它會繼續儲存 CI 在建置之間重新執行它的結果,這在基於代理的建置中可能會是個大問題。
我選擇在載入時編織,以便測試套件可以在有或沒有儀器的情況下執行(如果 AOP 工具以某種方式建立了錯誤的測試結果)。
這種方法明顯的缺點是,當建立新的測試案例(通常在 TDD 團隊中)時,在進行編織之前,它不會包含在煙霧測試候選項目中,因此在開發管線的幾個地方有一些簡單但繁瑣的命令列變更。更符合此類方法的標準工具將吸引更多團隊獲得好處。唉,精確的規格和驗證仍然是團隊中非常被低估的資產,而團隊卻充斥著貨運崇拜和追逐流行語。
順便一提,「Clover」團隊(不久後被 Atlassian 收購)對 ProTest 靜態分析方法做了類似的事情。
Wallaby.js:在您輸入時持續測試 JavaScript
Wallaby.js 是一種商業整合持續測試工具,用於 JavaScript,它會在您輸入時立即執行測試,並在您的 IDE/編輯器中顯示執行結果(包括程式碼覆蓋率、錯誤和主控台訊息)。它還提供一些即時更新的漂亮測試和程式碼覆蓋率報告。為了盡可能快速地執行測試,它結合了靜態/動態分析和許多啟發法,以及測試並行化。對於製作 Wallaby 的 Artem Govorov 來說,複雜之處在於測試架構和轉譯語言都需要分析和支援,才能保持所有內容的相容性。Wallaby 也只適用於 IDE/編輯器,並且優先考慮實際正在處理的程式碼。它不知道 Git 或任何控制基礎原始檔的 VCS,因此不會使用 TIA 對測試進行子集化。話雖如此,從未有人建立過一組純 JavaScript 測試,其中「全部執行」的速度還不夠快。
腳註
1: 這些摘錄是我與 Pratap 的電子郵件交流中的內容。
2: 先前的部落格文章:透過僅執行受影響的測試來減少測試時間 - 適用於 Maven 和 Java。
3: 先前的部落格文章:透過僅執行受影響的測試來減少測試時間 - Python 版本。
4: 文章:Visual Studio 2017 的即時單元測試,來自 Microsoft.com。
5: 這些評論和本附錄中的其他貢獻,來自與各個貢獻者的電子郵件。
重大修訂
2017 年 8 月 22 日:更新以納入 NCrunch 和 Wallaby.js
2017 年 8 月 7 日:首次發表