2016-07-14 81 views
0

我想學習使用元編程的自動化測試。我使用Google搜索找不到任何東西。任何人都可以提供一些資源,我可以從哪裏獲得有關「如何使用元編程使測試自動化變得簡單「?使用MetaProgramming的測試自動化

回答

0

由於元編程的「黑暗角落」,這是一個廣泛的主題,並沒有寫出太多內容。

你是什麼意思的「元編程」?

作爲背景,我認爲元編程是一種使用工具(我們稱之爲「元編程工具」)來檢查或修改應用軟件以實現某些效果的任何活動。

許多人認爲「反射」是一種元編程;其他考慮(C++風格)模板是元編程;有些人提出面向方面的編程。

我有點同意,但認爲這些是你想要的弱版本,因爲它們對源代碼可以看到或做什麼有嚴格的限制。你真正想要的是一個元編程工具,它可以在源程序中訪問的所有東西(是的,註釋也是!)這樣的工具叫做Program Transformation Systems (PTS);他們通過解析源代碼並對解析後的程序表示進行操作。 (我碰巧建立其中一個,看我的生物)。 PTS然後可以準確地分析代碼,和/或使可靠的改變到代碼並且利用改變重新生成有效的源。 PS:PTS可以將所有其他元編程技術實現爲特例,因此它更加通用。

哪裏可以使用元編程進行測試?

至少有2個區域中,元編程可能會起到一定的作用:

1)從測試 2)代的測試 3)測試

避免收集信息的收集。

測試結果的收集取決於測試的性質。許多測試都關注「這個白色/黑色方塊是否正常工作」?假設測試以某種方式寫入,他們必須能夠訪問被測試的盒子, 能夠以現實的方式調用該盒子,確定結果是否正確,並且經常將結果列表到測試後的質量評估可以被製造。

訪問是第一個問題。被測試的黑盒子可能不易被測試框架訪問:由UI事件驅動,在非公開的例程中,深埋在另一個難以獲取的功能內部。 您可能需要元編程來「暫時」修改程序,以提供對需要測試的框的訪問(例如,將Private方法更改爲Public,以便可以從外部調用)。這種變化僅在測試項目期間存在;你拋出修改的程序,因爲除了測試結果之外,沒有人需要它。是的,您必須確保應用代碼轉換以使事物可見不會改變程序功能。

第二個問題是在現實環境中鍛鍊目標黑匣子。每個代碼模塊都運行在一個假定數據和環境都「正確」配置的環境中。測試程序可以通過調用大量程序元素或使用自己的自定義代碼來明確設置該世界;這通常是測試例程的主體,而且這些代碼很難寫和脆弱(被測試的應用程序不斷變化,所以對它的假設也是如此)。有人可能會使用元編程來將應用程序安裝到收集測試可能需要運行的環境,從而避免編寫所有設置代碼的問題。

最後,人們可能想要記錄的不僅僅是「測試失敗/通過」。通常確切地知道哪些代碼得到了測試(「測試覆蓋率」)是有用的。人們可以通過應用程序來收集執行得到的數據;以下是如何使用PTS的代碼塊:http://www.semdesigns.com/Company/Publications/TestCoverage.pdf。更復雜的儀器可能被用來捕獲有關哪個路徑通過代碼已被執行的信息。未發現的代碼和/或未發現的路徑,顯示哪些測試尚未應用,並且您對於該程序的功能毫無疑問不知情,更不用說是否以簡單的方式進行測試。測試

有人/東西有產生測試

代;我們已經討論過如何生成環境設置部分。那功能部分呢?假設程序已被調試(例如,已經被手動測試並且是固定的),可以使用元編程來對代碼進行測試以捕獲執行黑匣子的結果(例如,實例執行後置條件) 。通過鍛鍊程序,人們就可以產生(根據定義)「正確地產生」可以轉化爲測試的結果。通過這種方式,可以爲現有程序構建大量的迴歸測試;這些對驗證程序的進一步增強不會破壞其大部分功能而言都是有價值的。

通常,函數在不同輸入範圍上具有不同的性質(例如,對於產生x + 1的x < 10,否則產生x * x)。理想情況下,人們希望爲每個不同的結果提供一個測試(例如,x < 10,x> = 10),這意味着要分割輸入範圍。通過枚舉模塊中的所有(部分)路徑,並提供控制每個路徑的謂詞,Metaprogrammning也可以在此幫助。 每個單獨的謂詞代表感興趣的輸入空間分區。測試

一個

避免只測試代碼的一個不信任(當然你是不是測試JDK?)用一種可靠的方法consructed任何代碼不需要測試(JDK的是以這種方式構建,或者至少甲骨文很樂意讓你相信它)。

元器件編程可用於自動地以可靠的方式自動生成代碼或從規範或DSL中生成代碼。這種生成的代碼是正確的 - 通過構建(我們可以爭論什麼程度的嚴謹),並且不需要測試。您可能需要測試DSL表達式是否達到所需的功能,但您不必擔心生成的代碼是否正確。

+0

謝謝艾拉,這真的很有幫助! – jaspal