檢視原始碼 通用測試基礎
概述
Common Test
框架是一個工具,支援實作和自動執行任何類型目標系統的測試案例。Common Test
是 Erlang/OTP 系統開發和維護中所有測試和驗證活動所使用的主要工具。
測試案例可以個別執行或批次執行。Common Test
還具有分散式測試模式,具有集中控制和日誌記錄。透過此功能,可以在一個通用會期中獨立測試多個系統。例如,在執行自動化大規模回歸測試時,此功能非常有用。
受測系統 (SUT) 可以由一個或多個目標節點組成。Common Test
包含一個通用測試伺服器,該伺服器與其他測試實用程式一起使用,以執行測試案例。測試可以從 GUI、OS shell 或 Erlang shell 啟動。測試套件 是檔案(Erlang 模組),其中包含要執行的測試案例(Erlang 函式)。支援模組提供測試案例用來執行測試的函式。
在黑箱測試情境中,基於 Common Test
的測試程式會透過標準 O&M 和 CLI 協定連線到目標系統。Common Test
提供其中一些協定的實作和包裝函式介面(其中大多數以獨立元件和應用程式的形式存在於 OTP 中)。這些包裝函式簡化了設定並增加了日誌記錄的詳細程度。Common Test
不斷擴充有用的支援模組。但是,請注意,將任何 Erlang/OTP 元件用於 Common Test
的測試目的,而無需 Common Test
的包裝函式,是一項簡單的任務。它就像呼叫 Erlang 函式一樣簡單。Common Test
中支援許多獨立於目標的介面,例如通用 Telnet 和 FTP。這些介面可以客製化或直接用於控制儀器、流量負載產生器等等。
Common Test
對於白箱測試 Erlang 程式碼(例如,模組測試)也是一個非常有用的工具,因為測試程式可以直接呼叫匯出的 Erlang 函式。實作基本測試套件和執行簡單測試所需的額外負荷非常少。對於黑箱測試 Erlang 軟體,可以使用 Erlang RPC 和標準 O&M 介面。
一個測試案例可以並行處理與一個或多個目標系統、儀器和流量產生器的多個連線,以執行測試所需的動作。並行處理多個連線是 Common Test
的主要優勢之一,這歸功於 Erlang 執行階段系統中對並行的有效支援,Common Test
使用者可以充分利用這一點。
測試套件組織
測試套件組織在測試目錄中,每個測試套件可以有單獨的資料目錄。通常,這些檔案和目錄會像其他形式的原始碼一樣進行版本控制(可能透過像 GIT 或 Subversion 這樣的版本控制系統)。但是,Common Test
本身不對可能的檔案和目錄版本設定任何要求(或沒有任何意識)。
支援函式庫
支援函式庫包含對所有測試套件,或特定功能區域或子系統中的測試套件有用的函式。除了 Common Test
框架提供的通用支援函式庫,以及 Erlang/OTP 提供的各種函式庫和應用程式之外,可能還需要客製化(使用者特定)的支援函式庫。
套件和測試案例
測試是透過執行測試套件(一組測試案例)或個別測試案例來執行的。測試套件實作為名為 <suite_name>_SUITE.erl
的 Erlang 模組,其中包含許多測試案例。測試案例是一個 Erlang 函式,用於測試一件事或多件事。測試案例是 Common Test
測試伺服器處理的最小單元。
也可以定義稱為測試案例群組的測試案例集。測試案例群組可以具有與之關聯的執行屬性。執行屬性指定是否以隨機順序、並行或依序執行群組中的測試案例,以及是否重複執行群組。測試案例群組也可以巢狀(也就是說,一個群組除了測試案例外,還可以包含子群組)。
除了測試案例和群組之外,測試套件還可以包含設定函式。這些函式旨在用於在 SUT(和/或 Common Test
主機節點)中設定(和驗證)環境和狀態,以確保測試正確執行。操作範例包括:開啟與 SUT 的連線、初始化資料庫、執行安裝指令碼等等。可以按套件、按測試案例群組以及按個別測試案例執行設定。
測試套件模組必須符合 Common Test
測試伺服器指定的回呼介面。如需詳細資訊,請參閱撰寫測試套件章節。
如果測試案例返回呼叫者,無論傳回的值為何,都被視為成功。但是,以下一些傳回值具有特殊意義:
{skip,Reason}
表示跳過測試案例。{comment,Comment}
在測試案例的日誌中列印註解。{save_config,Config}
使Common Test
測試伺服器將Config
傳遞給下一個測試案例。
測試案例失敗指定為執行階段錯誤(當機),無論終止的原因為何。如果您有效使用 Erlang 模式比對,您可以利用此屬性。結果是簡潔且可讀的測試案例函式,看起來更像指令碼,而不是實際的程式。一個簡單的範例:
session(_Config) ->
{started,ServerId} = my_server:start(),
{clients,[]} = my_server:get_clients(ServerId),
MyId = self(),
connected = my_server:connect(ServerId, MyId),
{clients,[MyId]} = my_server:get_clients(ServerId),
disconnected = my_server:disconnect(ServerId, MyId),
{clients,[]} = my_server:get_clients(ServerId),
stopped = my_server:stop(ServerId).
當測試套件執行時,所有資訊(包括輸出到 stdout
)都會記錄在許多不同的日誌檔案中。使用者主控台中會顯示最少量的資訊(只有開始和停止資訊,加上每個失敗測試案例的註記)。
每個測試案例的結果都記錄在專門為特定測試執行建立的 HTML 日誌檔案中。概述頁面會顯示每個以表格列表示的測試案例,顯示總執行時間、案例是否成功、失敗或跳過,以及可選的使用者註解。對於失敗的測試案例,終止原因也會列印在註解欄位中。概述頁面具有指向每個測試案例日誌檔案的連結,可透過任何標準 HTML 瀏覽器輕鬆瀏覽。
注意
在顯示總計的最後一列中,此處顯示的時間是上方各列的總和(不考慮並行測試案例)。另一方面,「經過時間」是執行測試案例所花費的時鐘時間。
外部介面
Common Test
測試伺服器要求測試套件定義和匯出以下必要或選用的回呼函式:
all()
- 傳回套件中所有測試案例和群組的清單。(必要)suite()
- 用於傳回套件屬性的資訊函式。(選用)groups()
- 用於宣告測試案例群組。(選用)init_per_suite(Config)
- 套件層級設定函式,在第一個測試案例之前執行。(選用)end_per_suite(Config)
- 套件層級設定函式,在最後一個測試案例之後執行。(選用)group(GroupName)
- 用於傳回測試案例群組屬性的資訊函式。(選用)init_per_group(GroupName, Config)
- 群組的設定函式,在第一個測試案例之前執行。(選用)end_per_group(GroupName, Config)
- 群組的設定函式,在最後一個測試案例之後執行。(選用)init_per_testcase(TestCase, Config)
- 測試案例的設定函式,在每個測試案例之前執行。(選用)end_per_testcase(TestCase, Config)
- 測試案例的設定函式,在每個測試案例之後執行。(選用)
對於每個測試案例,Common Test
測試伺服器會預期有以下函式:
測試案例名稱() - 傳回測試案例屬性清單的資訊函式。(選用)
測試案例名稱(Config) - 測試案例函式。