2013-03-20 26 views
7

我使用CoreGraphics中框架的圖形應用程序,單元測試定製的UIView

,而我對模型文件我似乎無法理解如何創建單元測試我自定義的UIView單元測試服,

我的目標是設置視圖的基本屬性並查看繪製函數的結果,儘管在我的調用者中我調用了: [self setNeedsDisplay]; 我的'drawRect'函數沒有從單元測試中調用,雖然它是從真實應用程序調用的

有沒有一種方法可以繪製單元測試項目? 什麼是測試ui項目的最佳實踐/工具?

感謝

回答

2

一個簡單的方法來測試圖紙是首先使圖紙看起來你想要的方式(所以沒有TDD)。然後進行測試,將繪圖渲染成PNG。使用#if條件在捕獲基準PNG和與PNG進行比較之間切換測試代碼。

在新的操作系統版本中,渲染可能會稍微改變。因此,堅持使用單一操作系統進行基線圖像測試。在需要時獲取新的基線。

通過這種測試,您可以重構您的繪圖代碼。如果它呈現相同的圖像,您的最新更改是好的。如果存在差異,則必須就是否接受更改做出眼球決定。 (如果你這樣做,捕獲一個新的基線。)

編輯:這些天,而不是手工完成,我會使用FBSnapshotTestCase。當出現測試失敗時,不僅僅是給出「出錯的結果」,而是保存圖像。這樣,您可以進行並排比較,而無需手動啓動應用程序並導航到有問題的視圖。它也模擬渲染到不同設備的不同方向,這對檢查自動佈局非常有用。

+0

偉大的解決方案喬恩!我自己用我的眼睛來測試自定義視圖的結果。由於我在視圖中改變了很多,我的推理是我應該看看它是否是錯誤的。儘管如此,我無法想象比較這樣的事情。也許我測試它:)也許這可能是你的下一個screencast *提示* :)的主題 – Pfitz 2013-03-20 04:38:10

+0

@Jon Reid,你可以提供更多的細節或如何實施這種方法的鏈接? – 2013-08-15 20:15:10

+0

我像你一樣渲染到PNG,但是然後測試PNG的CRC。這樣,您只需要一次驗證一次,如果測試失敗,則您知道CRC已更改並需要再次檢查。 – Nanki 2017-04-12 11:19:08

2

一般單元測試視圖不是正確的做法。單元測試是爲了驗證邏輯的離散原子,如果你正確地考慮了你的代碼,你的視圖中應該只有很少的邏輯。

更成功的方法可能是使用UIAutomation framework(或您選擇的自動化工具)。這使您可以在應用程序實際運行時(模擬器或設備上)自動模擬用戶交互。 UIAutomation具有各種功能(各種查看方法和captureRectWithName()),可讓您查找和截取特定視圖。然後,您可以將其掛接到例如ImageMagick's command line compare tool以驗證您是否繪製了正確的內容。

+0

也可以在OCUnit等單元測試框架中編寫某些驗收測試。這樣做的好處是可以驗證分立組件的繪圖,如特定的視圖。當然,您也可以抓取整個屏幕截圖,但這些更有可能發生變化。 – 2013-03-21 15:07:39

0

我個人認爲您應該使用XCUI測試來測試您使用視圖進行的任何渲染。但是,創建所述自定義渲染的任何業務邏輯或者添加的任何數學或邏輯都應該進行測試,並與任何其他類相隔離。

因此,您的UIAutomation測試將檢查您的視圖是否呈現,但您的單元測試將驗證可能存在的任何數學或業務邏輯。