2009-11-06 59 views
17

我試圖單元測試實例化字體一些iPhone的代碼。我已經收窄,以下崩潰的單元測試:爲什麼實例在iphone單元測試UIFont導致崩潰?

#import "test.h" 
#import <UIKit/UIKit.h> 


@implementation test 

- (void)testFonts { 
    [UIFont systemFontOfSize:12]; 
} 

@end 

這崩潰與錯誤:

Test Case '-[test testFonts]' started. 
/Developer/Tools/RunPlatformUnitTests.include: line 415: 79768 Trace/BPT trap   "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" 
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/Developer/usr/bin/otest' exited abnormally with code 133 (it may have crashed). 

好像有一些設置,我沒有在我的單元測試的目標在做做這個工作。你如何測試實例化字體的東西?

+0

您應該提供控制檯輸出以更好地進行調試。但是,訪問字體不需要額外的步驟,您的操作方式就好了。問題是:不包括/鏈接到正確版本的UIKit或代碼中的其他地方。 – Till 2009-11-14 13:47:24

+0

也得到這個崩潰。任何嘗試調用systemFontOfSize:完全破壞它。 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/Developer/usr/bin/otest'以代碼133異常退出(它可能已崩潰)。 – featherless 2010-05-31 06:23:56

+0

嘿,有什麼我可以做的,使答案更完整/有幫助嗎?如果沒有...我可以有接受漢堡? – beOn 2012-03-22 20:44:17

回答

1

你有沒有試過在設備上?我似乎記得你只能在設備上運行時在測試中包含UIKit的東西,而不是針對模擬器...

+0

僅當使用Google Toolbox for Mac時,UIKit的東西在單元測試中工作得很好。 http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting – dmaclach 2010-07-12 20:55:29

+1

我有同樣的問題。它適用於設備和模擬器,但如果我在命令行中啓動測試,則會崩潰。 – Quentin 2011-04-26 15:47:17

2

我看到3.2(和3.1.3)的確切問題。我在兩臺獨立的機器上看到過它,所以我不認爲我的SDK已損壞。

我創建了一個新的iPhone觀點基於項目,並增加了一個單元測試,以及一個測試用例。

這被設置爲邏輯測試。

控制檯輸出如下:

Test Case '-[TestTests testTests]' started. 
/Developer/Tools/RunPlatformUnitTests.include: line 415: 21141 Trace/BPT trap    "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" 
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Deve loper/usr/bin/otest' exited abnormally with code 133 (it may have crashed). 
Command /bin/sh failed with exit code 1 

如果我設置了用於調試的單元測試,然後我可以看到飛機墜毀,用下面的堆棧跟蹤:

#0 0x00342d51 in __HALT 
#1 0x002947c7 in _CFRuntimeCreateInstance 
#2 0x00b8441e in GSFontCreateWithName 
#3 0x028c8f31 in +[UIFont systemFontOfSize:] 

我可以看到肯德爾點(UIKit的東西可能只在設備上工作),但似乎並沒有被記錄任何地方非常好。

9

這並不說明它非常好,但蘋果的測試套件分割單元測試分爲兩個不同類別:

  • 邏輯測試

    這些測試將檢查你的代碼的正確 功能在 潔淨室環境。

  • 應用測試

    這些測試將檢查你的代碼的功能 在運行的應用程序 。

似乎有很多UI相關代碼無法在「邏輯測試」情況下運行。有關邏輯測試與應用測試的更多信息,請點擊這裏。

http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/UnitTesting/01-Unit-Test_Overview/overview.html

+1

您提供的鏈接不存在。你是對的。 UIFont是UIKit的一部分,無法在單元測試中測試 – 2012-08-08 03:54:46

+0

鏈接對我有用 – 2013-07-16 16:46:33

19

我的一個朋友最近遇到了這一點,我挖出來的最後一個項目我成功地設置此上。訣竅是在應用程序測試中運行任何涉及UIFont的測試,而不是單元測試。這裏有幾件事情,以確保設置您的應用程序測試目標時:

  1. 構建階段:把你的產品代碼爲您的測試目標由 包括你的主要目標爲測試目標的 的一個依賴,而而不是將.m文件包含在您的測試 目標中。這僅僅是爲了組織。
  2. 生成設置:確保您的測試目標的「捆綁裝載機」設置 到$(BUILT_PRODUCTS_DIR)/Your Product Name.app/Your Product Name Again。注意,這是.../Product.app/Product - 也就是說,有 是在路徑的最後一段沒有的.app。如果你好奇, 看到你提到的文件,找到你打造的產品,適當 點擊,選擇查看包裝內容,然後查找可執行文件。
  3. 生成設置:您的測試目標的「測試主機」應該設置爲 $(BUNDLE_LOADER)。十分簡單。
  4. 生成設置:測試目標的其他鏈接標誌應包括 -framework SenTestingKit
  5. 生成設置:「測試版本後,」應該是第
  6. 計劃:「構建」應該包括你的測試目標,以及你的主要目標 ,以「測試」在這兩個目標中選擇的唯一複選框。
  7. 計劃:「測試」應該只包括你的測試目標。它包含的文件將自動添加到列表中。

...厚福。這將是足以讓你一切會。並不是所有的文檔都記錄在一個地方,搞清楚如何讓這兩種測試運行需要花費更多的時間和痛苦,而不是我想承認的。

很奇怪的是,蘋果似乎已經拉下自己的DOCO此事。我不知道是否有未來的另一個變化......

請打我,如果您有任何補充以上。這不是一個設置應用程序測試的完整指南,但以上是我遇到的未記錄的絆腳石。 FMI,我強烈建議this CocoaWithLove article

+0

對於列表中的第二步:是否可以通過某種變量以某種方式推廣「您的產品名稱」?我問的原因是我們有一個單獨的iphone和ipod應用程序共享相同的代碼,但不共享設備特定的資源(圖像和xib等)。每當我運行單元測試時,我必須選擇一個方案並使用它,因爲單元測試包只能以這種方式引用一個應用程序。我想使它具有通用性,以便在測試時可以選擇任何一個。 $ {PRODUCT_NAME}不起作用,因爲它引用了單元測試包本身,而不是應用包。 – Kevlar 2012-03-14 21:34:56

+0

嗯......好問題。讓我確定我明白你在做什麼......你想要一個可用於測試這兩個應用的目標嗎?我不知道這是否會奏效。您如何指出您希望測試目標測試哪個應用程序?令我困惑的是「我想使它成爲通用的,這樣我就可以在測試時選擇其中一個」。哪一個是什麼? (接下來的評論) – beOn 2012-03-22 20:28:56

+0

現在...如果你想有兩個單獨的測試方案,每個測試方案都會測試一個不同的應用程序,這並不難。我不知道如何爲產品名稱使用變量,但有兩個目標,您可以在其各自的「生成設置」中使用不同的常量值。我就是這樣做的。如果我完全誤解了你(總是可能;)),請解釋一下你之後的情況,我會盡力幫忙。 – beOn 2012-03-22 20:29:20

0

對不起,挖掘它,但我有XCT測試一些問題上的Xcode 5和它與這個主題相關的

報價:

「許多UIKit類不會無的UIApplication 工作嘗試將代碼添加到通過這一項目的測試結果表明,其他的測試將不得不從LogicTests有條件排除還有:

默認的loadView方法會失敗 - 這樣的testLoadView方法#ifdef'd出

任何分配/初始化UILabel的嘗試都將失敗。我不知道爲什麼,但正因爲如此,標籤上的所有測試必須#ifdef'd。

一般情況下,不要指望從UIKit框架事情在邏輯測試工作。其他框架幾乎總是可以工作的(在這個應用程序中,CoreLocation和Foundation框架沒有問題)。

在UIKit中,一些元素將工作 - 例如,一個UIWebView並沒有在我的測試任何問題。在LogicTests包中(沒有實際運行的應用程序),究竟哪些用戶界面對象會失敗,直到您嘗試纔會真正清楚,但這些失敗是您仍然需要運行應用程序測試進行驗證的原因 - 應用程序測試更具權威性導致在UIKit的東西「

網址:http://www.cocoawithlove.com/2009/12/sample-iphone-application-with-complete.html

0

中選擇您的單元測試的目標。‘常規‘部分目標’,從項目/目標清單和第’,選擇您的主機應用程序爲主要應用,它有字體。

這就解決了我的問題。