2009-06-22 61 views
6

我想爲我的Cocoa應用程序的GUI部分編寫單元測試。如何在Xcode中編寫GUI的自動單元測試?

在教科書單元測試中,有一個測試框架和測試用例可以調用被測單元。該單元下的所有代碼都被嘲笑。因此,輸入和輸出都受到控制和監控;只有被測單元中的代碼被測試。

我想在被測單元做我的GUI時做同樣的事情:
1)設置某種框架,我可以編寫代碼來操縱和檢查GUI控件。
2)連接我的GUI控件來模擬我的實際代碼,而不是真實的實例。
3)運行測試,該測試操縱控件,然後檢查模擬對象以查看是否使用正確的參數調用了正確的方法,並檢查GUI以查看來自模擬對象的響應是否導致小部件的正確更改。

任何人都這樣做?如果是這樣,怎麼樣?關於如何做到這一點的任何想法?

感謝,

帕特

(編輯),舉個很具體的例子,我想:
1)編寫一個測試情況下將選擇菜單項 'MyMenu菜單' - >「MyItem 」。在這個測試案例中,我想檢查一下,方法[AppDelegate doMyItem]被調用一次,並且AppDelegate中沒有其他方法被調用。
2)生成AppDelegate的模擬對象。 (我知道如何做到這一點)
3)以某種方式(handwaving這裏)鏈接我的應用程序,以便AppDelegate的模擬實例鏈接而不是真實的。
4)運行測試。注意它失敗,因爲1)我還沒有創建MyMenu。 2)我還沒有創建MyItem。 3)我還沒有完成IB工作來將MyItem連接到[AppDelegate doMyItem],或者4),因爲我還沒有編寫'doMyItem'方法。
5)解決上述四個問題(如果我那天感覺真的很迂腐,一次一個)。
6)再次運行測試並觀察成功。

這是否使問題清楚?

回答

1

下面是一些普遍採用這種方法的流行方法(應該使用大多數(如果不是所有的可可兼容語言))。

1 - 創建一個回調接口。創建GUI元素時的一個輸入是該接口的實現。當有用戶交互時,GUI元素在該接口上調用更新功能。有一個真正的實施和測試實施。

2 - 使用事件處理程序。用一個或多個事件處理程序註冊所有GUI元素,並讓GUI在用戶交互中生成事件。有兩個實現的事件處理程序接口,其中一個用於實際使用,另一個用於測試。

編輯:哎呦,錯過了要求#1。從來沒有用OSX特定的控件做過這件事,但通常有兩種方法。

1 - 創建一個生成類似用戶輸入的腳本或應用程序。具有不容易實際檢查GUI的缺點。你反而需要生成好的測試用例來確保應該存在的所有東西,而且沒有什麼額外的東西。

2 - 創建與測試實施,取代的渲染和界面層的界面。這是一個像SDL和DirectFB的和庫更容易使少用的東西像OSX API,WIN32 API等

編輯:應對問題進行編輯。

在您的例子的情況下,使用一個單獨的測試程序和事件處理程序下面是它想看看:

您的測試應用程序是一個簡單的應用程序或腳本,啓動你的圖形用戶界面,然後生成鼠標/鍵盤基於輸入文件的事件。正如我所說,從來沒有在OSX(只有QNX)做過。運氣好的話,您可以使用API​​生成鼠標和鍵盤事件,但是如果可能的話,您必須詢問其他人。

因此,爲您的測試案例創建一個輸入。測試應用程序將解析這個知道該怎麼做。它可能是這樣簡單的XML:

<testcase name="blah"><mouseevent x="120" y="175" type="click"/></testcase> 

或任何鼠標序列可能實際上。

當你的腳本執行該命令會點擊該按鈕鼠標。你的事件處理程序將會接受這個。但是現在您應該使用--test標誌或其他標誌來運行您的應用程序,以便它實際上使用測試事件處理程序。測試事件處理程序可以執行一些自定義操作,而不是執行通常的應用程序。例如,它可以執行一些正常的操作(您仍然需要GUI來響應),然後通過套接字,管道等任何方式將消息發送到測試應用程序。

測試應用將拿起此消息,並把它比作什麼希望看到的。所以,現在也許你的測試用例XML看起來是這樣的:

<testcase name="blah"> 
    <mouseevent x="120" y="175" type="click"/> 
    <response>doMyItem() called</response> 
</testcase> 

如果從事件處理程序生成的響應是不同的,那麼測試失敗。您可以打印出實際響應以幫助進行調試。

+0

Patros嗨, 關於你的第二#1,我不太明白這句話的意思是生成用戶輸入一樣「。你可以給我一個例子嗎? 謝謝, 帕特 – 2009-06-22 21:01:31

+0

它只是意味着產生你想看到的鍵盤和鼠標事件。您可以通過包裝本機UI類並劫持它們的事件,可能通過訪問API或編寫自定義驅動程序來實現此目的。 – patros 2009-06-22 21:29:23

3

兩個原則,兩個環節:

  • 使視圖一樣傻乎乎的可能,與passive view模式:這使GUI更容易測試
  • :信託可可執行按鈕,菜單,.. 。但請確認target and action連接正確,bindings正如預期。
1

你看着無障礙框架?它應該讓一個應用程序檢查另一個應用程序的UI並生成類似用戶的交互事件。

Accessibility Overview