2011-01-09 59 views
5

我跟着蘋果的instructions設置單元測試在我的項目。我遵循了使它們依賴的指示,所以測試在我的主要項目的每個版本中運行。這是有效的,當我的測試通過時,應用程序運行;當他們不這樣做時,我會在單元測試失敗的線上發現構建錯誤。如何在Xcode 3中調試單元測試?

我想,但是,要能步我的應用程序代碼時的測試是失敗的,但不能得到正確配置的Xcode(3.2.5)。該項目是一個Mac項目,而不是iOS。

我試過herehere的指令,但是在我設置的斷點處執行沒有停止過,不管是在單元測試代碼還是在我的應用程序代碼中。在遵循第一組指令之後,我設置的斷點變成了帶有藍色輪廓的黃色,我也不知道這是什麼意思。我需要做什麼才能完成我的測試?

更新

我發現試圖解決通過添加參數和環境變量,以我的主要可執行這個問題(here)另一頁,但同樣,那些沒有造成執行停止在我的斷點。我也注意到我的測試(豐富)日誌語句也沒有在我的調試器控制檯中顯示出來。

我還發現,黃斷點指的是代碼出現無法在運行時被發現。這些都在我的測試用例類中,所以這似乎解釋了爲什麼這些不是正在解僱。

回答

0

唯一最終爲我工作的是升級到Xcode 4.它集成精美。有一個little bit of pain轉移到它,但現在它結束了,整合是偉大的。我完全能夠完成我的測試和應用程序代碼。

0

開發你的單元測試,使他們包裹它駐留在其中有一個目標一個項目一個項目,那麼只需打開相關的項目和工作了。這可能是一個包含庫和可執行文件的項目(2個目標)。那麼你可以打開該項目並進行調試,而你的依賴項中的單元測試會通過這個庫調用。這是一種更模塊化的方法。

好運

2

我平時也沒什麼問題調試我OCTest測試和Xcode 3.2,包括在斷點處停止。

的基本思想是告訴GDB推出otest與束作爲參數。您將通過將/Developer/Tools/otest作爲自定義可執行文件添加到您的Xcode項目中,然後將OCTest軟件包名稱作爲唯一參數(在項目菜單中選擇「編輯可執行文件」並在第二個選項卡中添加一行Foo.octest在頂盒中調試Foo測試)。

現在,如果你打的調試按鈕,它就會馬上開始調試你的測試包,並將在宣佈斷點處停止(如果你打構建和調試如果測試沒有通過,可能無法啓動)。另外請注意,您可能必須將環境變量設置爲YES以禁用垃圾收集(在相同「參數」選項卡的底部框中),otest會準確告訴您是否需要。

如果你做了以上所有的事情,並且仍然無法進入你的測試代碼,這可能是因爲它是在關閉調試符號生成的情況下編譯的 - 檢查你的調試版本設置,但很可能是因爲測試代碼不是重新編譯。我說很有可能,因爲你的日誌沒有顯示在控制檯中,所以NSLog應該在Xcode控制檯中寫入。手動清理構建和bin文件夾,有時在更改路徑或名稱時最終加載過時的代碼。您可能還想檢查文件是否沒有跳出測試目標(是否在同一個非日誌記錄文件中失敗的測試?)。

2

我有一個Hiedi Utley發佈在http://hiediutley.wordpress.com/2011/03/08/xcode3-debugging-ios-unit-tests/的變體。我不喜歡它的是單元測試包目標的複製,其中包含一個運行腳本階段以在構建之後執行單元測試,另一個不運行單元測試。我注意到在運行腳本階段的Get Info窗格中,切換爲「僅在安裝時運行腳本」,並認爲這將是在正常模式下運行單元測試和在調試器中運行它們之間切換的一種方式。

按照Hiedi的說明,創建一個新的可執行項目,比如LogicTestsGDB。像這樣配置它:

常規選項卡:

  • 路徑:Developer/usr/bin/otest任何領導/
  • 路徑類型:Relative to Current SDK
  • 設置工作目錄:Build Products directory

參數Ta b:

  • 參數:Your UnitTest Bundle(eg。 LogicTests.octest)
  • 變量在環境
    • DYLD_LIBRARY_PATH ... : ${BUILD_PRODUCTS_DIR}:${DYLD_LIBRARY_PATH}
    • DYLD_FRAMEWORK_PATH . : ${SDKROOT}/Developer/Library/Frameworks
    • DYLD_ROOT_PATH ...... : ${SDKROOT}
    • IPHONE_SIMULATOR_ROOT : ${SDKROOT}
    • OBJC_DISABLE_GC : YES
    • DYLD_NEW_LOCAL_SHARED_REGIONS : YES
    • DYLD_NO_FIX_PREBINDING : YES
    • 設置
    • CFFIXED_USER_HOME : ${HOME}/Library/Application Support/iPhone Simulator/

完成。現在,調試你的單元測試,

  1. 揭露bundle的構建階段,並在運行腳本相雙擊。
  2. 檢查安裝選項
  3. 設置活動目標是單元測試包(LogicTests.octest如。)只有當運行的腳本。
  4. 設置活動的可執行要創建(如LogicTestsGDB)
  5. 點擊建立新的可執行文件和調試

正常運行,執行單元測試的構建階段的一部分應用:

  1. 揭露bundle的構建階段,並在運行腳本相雙擊。只有
  2. 取消選中運行腳本安裝選項
  3. 設置活動目標是應用程序時,正在修建
  4. 設置活動的可執行是正在構建的應用程序

爲了實現上述步驟的自動化,我創建了一個簡單的AppleScript腳本,它在兩種狀態之間切換:

property kApplicationName : "MyApp" -- name of the normal application to build 
property kUnitTestName : "LogicTests" -- name of the bundle target to debug 
property kUnitTestRunner : "LogicTestGDB" -- name of the executable to use when debugging the unit test bundle 

tell application "Xcode" 
    tell the active project document 
    set theTarget to first target whose name is kUnitTestName 
     set thePhase to first run script phase of theTarget 
     if name of active target is kApplicationName then 
      set active target to theTarget 
      set theExecutable to first executable whose name is kUnitTestRunner 
      set active executable to theExecutable 
      set run only when installing of thePhase to true 
     else 
      set theTarget to first target whose name is kApplicationName 
      set active target to theTarget 
      set theExecutable to first executable whose name is kApplicationName 
      set active executable to theExecutable 
      set run only when installing of thePhase to false 
     end if 
     return "Targeting " & (name of active executable) 
    end tell 
end tell