檢視原始碼 使用 Common Test 進行大規模測試

概觀

大規模自動化測試需要並行執行多個獨立的測試會期。這可以透過在一個或多個主機上執行一些 Common Test 節點,測試不同的目標系統來實現。獨立配置、啟動和控制測試節點可能是一項繁瑣的操作。為了幫助這種自動化的大規模測試,Common Test 提供了一個主測試節點元件,即 Common Test Master,它在分散式 Common Test 節點系統中處理集中配置和控制。

Common Test Master 伺服器在一個專用的 Erlang 節點上運行,並使用分散式 Erlang 與任意數量的 Common Test 測試節點進行通信,每個節點都託管一個常規的 Common Test 伺服器。測試規格作為輸入,指定要在哪些測試節點上使用什麼配置來測試什麼。

Common Test Master 伺服器會將進度資訊寫入 HTML 記錄檔,與常規的 Common Test 伺服器類似。這些記錄檔包含測試統計數據,以及指向每個獨立 Common Test 伺服器所寫記錄檔的連結。

Common Test Master API 由模組 ct_master 匯出。

使用

Common Test Master 要求所有測試節點都在同一個網路上,並共享一個共同的檔案系統。Common Test Master 無法自動啟動測試節點。必須預先啟動節點,Common Test Master 才能在其上啟動測試會期。

測試透過呼叫 ct_master:run(TestSpecs)ct_master:run(TestSpecs, InclNodes, ExclNodes) 來啟動

TestSpecs 可以是測試規格檔案的名稱(字串)或測試規格的列表。如果是一個列表,規格會依序處理(並執行相應的測試)。TestSpecs 列表中的一個元素也可以是測試規格列表。在執行測試之前,此類列表中的規格會合併為一個組合規格。

範例

ct_master:run(["ts1","ts2",["ts3","ts4"]])

在這裡,先執行由 "ts1" 指定的測試,然後執行由 "ts2" 指定的測試,最後執行由 "ts3" 和 "ts4" 指定的測試。

run/3InclNodes 參數是一個節點名稱列表。函式 run/3 以與 run/1 相同的方式執行 TestSpecs 中的測試,但也會取得 TestSpecs 中任何沒有明確標記特定節點名稱的測試,並在 InclNodes 中列出的節點上執行。透過以這種方式使用 run/3,任何測試規格都可以用於大規模測試環境中,無論是否包含節點資訊。

ExclNodes 是要從測試中排除的節點列表。也就是說,如果在執行階段 ExclNodes 中列出了測試規格中指定在特定節點上執行的測試,則不會執行該測試。

如果 Common Test Master 最初無法連接到測試規格或 InclNodes 列表中指定的任何測試節點,則會提示操作員選擇重新開始(在手動檢查相關節點的狀態後)、在沒有遺失節點的情況下執行,或中止操作。

當測試開始時,Common Test Master 會向控制台顯示有關所涉及節點的資訊。Common Test Master 也會在測試完成時報告,無論成功或失敗。如果與節點的連線遺失,則該節點上的測試會被視為已完成。Common Test Master 不會嘗試重新建立與失敗節點的連線。

在任何時候,若要取得測試節點的目前狀態,請呼叫函式 ct_master:progress()

若要停止一個或多個測試,請使用函式 ct_master:abort()(停止所有測試)或 ct_master:abort(Nodes)

有關 Common Test Master API 的詳細資訊,請參閱模組 ct_master

測試規格

用作 Common Test Master 輸入的測試規格與用作常規 Common Test 伺服器輸入的規格完全相容。語法在執行測試和分析結果章節的 測試規格 一節中描述。

所有測試規格術語都可以有 NodeRefs 元素。此元素指定要在哪個或哪些節點上執行組態操作或測試。NodeRefs 的定義如下

NodeRefs = all_nodes | [NodeRef] | NodeRef

NodeRef = NodeAlias | node() | master

NodeAlias (atom/0) 在測試規格中用作節點名稱的參考(因此節點名稱只需要宣告一次,這也可以使用常數來實現)。別名使用 node 術語宣告如下

{node, NodeAlias, NodeName}

如果 NodeRefs 的值為 all_nodes,則操作或測試會在所有指定的測試節點上執行。(宣告沒有 NodeRefs 元素的術語具有相同的效果)。如果 NodeRefs 的值為 master,則操作僅在 Common Test Master 節點上執行(即設定記錄目錄或安裝事件處理常式)。

請考慮執行測試和分析結果章節的 測試規格 一節中的範例,現在擴展了節點資訊,並打算由 Common Test Master 執行

{define, 'Top', "/home/test"}.
{define, 'T1', "'Top'/t1"}.
{define, 'T2', "'Top'/t2"}.
{define, 'T3', "'Top'/t3"}.
{define, 'CfgFile', "config.cfg"}.
{define, 'Node', ct_node}.

{node, node1, 'Node@host_x'}.
{node, node2, 'Node@host_y'}.

{logdir, master, "'Top'/master_logs"}.
{logdir, "'Top'/logs"}.

{config, node1, "'T1'/'CfgFile'"}.
{config, node2, "'T2'/'CfgFile'"}.
{config, "'T3'/'CfgFile'"}.

{suites, node1, 'T1', all}.
{skip_suites, node1, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
{skip_cases, node1, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
{skip_cases, node1, 'T1', t1C_SUITE, [test1], "Ignore"}.

{suites, node2, 'T2', [t2B_SUITE,t2C_SUITE]}.
{cases, node2, 'T2', t2A_SUITE, [test4,test1,test7]}.

{skip_suites, 'T3', all, "Not implemented"}.

此範例指定與原始範例相同的測試。但是現在,如果使用呼叫 ct_master:run(TestSpecName) 來啟動,則測試 t1 會在節點 ct_node@host_x (node1) 上執行,測試 t2 會在 ct_node@host_y (node2) 上執行,測試 t3 會在 node1node2 上執行。組態檔案 t1 僅在 node1 上讀取,而組態檔案 t2 僅在 node2 上讀取,而組態檔案 t3 會在 node1node2 上讀取。兩個測試節點都會將記錄檔寫入同一個目錄。(但是,Common Test Master 節點使用與測試節點不同的記錄目錄。)

如果測試會期改為使用呼叫 ct_master:run(TestSpecName, [ct_node@host_z], [ct_node@host_x]) 來啟動,則結果是測試 t1 不會在 ct_node@host_x(或任何其他節點)上執行,而測試 t3 會在 ct_node@host_yct_node@host_z 上執行。

一個不錯的功能是,包含節點資訊的測試規格仍然可以用作常規 Common Test 伺服器的輸入(如 測試規格 一節中所述)。結果是,任何指定在與相關 Common Test 節點同名的節點上執行的測試(如果使用 ct_run 程式啟動,通常為 ct@somehost),都會執行。當然,沒有明確節點關聯的測試也會執行。

自動啟動測試目標節點

可以使用測試規格術語 init 在測試目標節點上自動啟動和執行初始動作。

支援兩個子術語:node_starteval

範例

{node, node1, node1@host1}.
{node, node2, node1@host2}.
{node, node3, node2@host2}.
{node, node4, node1@host3}.
{init, node1, [{node_start, [{callback_module, my_slave_callback}]}]}.
{init, [node2, node3], {node_start, [{username, "ct_user"}, {password, "ct_password"}]}}.
{init, node4, {eval, {module, function, []}}}.

此測試規格宣告要使用使用者回呼函式 callback_module:my_slave_callback/0 啟動 node1@host1,而要使用預設回呼模組 ct_slave 啟動節點 node1@host2node2@host2。指定的用戶名和密碼用於登入遠端主機 host2。此外,會在 node1@host3 上評估函式 module:function/0,並且此呼叫的結果會列印到記錄中。

預設的回呼模組 ct_slave 具有以下功能

  • 在本地或遠端主機上啟動 Erlang 目標節點(應用程式 SSH 用於通信)。
  • 能夠使用更多旗標啟動 Erlang 模擬器(支援 erl 支援的任何旗標)。
  • 使用內部回呼函式監督正在啟動的節點。用於防止節點掛起。(可設定。)
  • 從屬節點監視主節點。如果主節點終止,則可以停止從屬節點。(可設定。)
  • 在從屬節點啟動後執行使用者函式。函式可以指定為 {Module, Function, Arguments} 元組的列表。

注意

可以為節點指定 eval 術語,並且可以在 node_start 選項列表中指定 startup_functions。在這種情況下,會先啟動節點,然後執行 startup_functions,最後呼叫以 eval 指定的函式。