2013-10-09 99 views
1

單元測試我的程序時出現問題。 問題很簡單,但我不知道爲什麼這不起作用。Xcode C++使用全局變量進行單元測試

1 - >我建立我所有程序
2 - >我建立我單元測試
3 - >的測試正在運行。

當它不是從數據段獲取全局數據時,一切正常。看起來好像該變量未被初始化/或者簡單地被找到。所以當然,我所有的測試都是錯誤的。

我的問題是: 它是完全錯誤建立一個可執行文件,然後運行它的測試?或者我應該在同一時間編譯我所有的代碼+單元測試,然後運行它?還是隻是缺乏SenTesting框架?

我忘了提及這是一個C++常量字符串。不知道是否改變了一些東西。

*編輯***

我的假設是錯誤的,但我還是不明白魔術超越!似乎一個C++魔術hoydi hoo?

char cstring[] = "***"; 
std::string cppString = "***"; 
NSString* nstring = @"***"; 

- (void)testSync{ 
    STAssertNotNil(nstring, nil); // fine 
    STAssertNotNil((id)strlen(bbb), nil); // fine 
    STAssertNotNil((id)cppString.size(), nil); // failed 
} 

編輯2 **

實際上這是正常的,在C++不是在這部分代碼初始化。如果我在我的可執行文件上執行nm,看起來我的C和Obj-C全局都放入了dataSegment。我認爲我的C++字符串是相同的情況下,但它實際上是放入BSS段。這意味着它是未初始化的。事實上,C++編譯器做了一些超越,並且C++字符串在main()調用之後被初始化,並且像進入dataSegment一樣進行操作。

我不知道testSuit沒有main()調用,所以C++對象從不初始化。爲了在testSuit之前調用.ctor,有一些技巧。但我也懶得解釋,這是一種話題。我剛剛用一個簡單的char數組替換了我的C++字符串,並且它的工作原理很完美,因爲我的值現在是POD。

順便說一下,如果它們只是只讀的,那麼全局變量中就沒有惡魔。 ;)

回答

0

好的,我可以在這裏看到一些缺點。

首先,這個代碼給我的環境(的Xcode 5),並有很好的理由的錯誤(啓用ARC)。我不知道你是如何編譯的。原因是你正在將一個整數(或長整數)轉換爲一個對象,這會導致很多錯誤,因爲它通常是無效的操作。所以,真正的問題不是爲什麼第三個「斷言」失敗,但爲什麼第二個成功。

至於你問題的第二部分而言,我不得不承認,我沒有完全理解你的問題,你可能有更徹底地解釋。

通常,單元測試正在測試代碼的特定部分。因此,您通常不會對實際的最終可執行文件執行測試(我相信這不稱作單元測試),也不需要同時編譯「所有C++代碼+您的單元測試」。

既然你使用Xcode,我會給你一些指示。

  • 編寫您的應用程序(或至少它的一部分),並找到您要執行單元測試的方面/功能/對象。
  • 在單獨的文件中,編寫實例化這些對象並測試它們的方法的單元測試,調用它們並比較輸入和輸出。
  • 你的應用程序中應該有第二個目標,它只編譯單元測試源代碼和相關的主程序代碼。
  • 建立這個目標,或按命令-U,它會報告成功和失敗。

所以,你需要分離你的源代碼並隔離你的類/方法來使它們像這樣可測試。這需要一個良好的體系結構和應用程序的設計,你可能需要在靈活性方面做出一些妥協(這取決於你自己決定)。哦,我相信在可測試代碼中,由於各種原因,您應該避免使用全局變量。全局變量有時候會有幫助,但是它們通常會使單元測試變得非常困難(如果誤用會導致意大利麪代碼,但這是一個完全不同的故事)

我希望我幫助,即使沒有完全理解第二部分您的帖子。

+0

嗨csotiriou。我終於找到了一種解決方案,我忘了關閉這個話題。下面我發佈了答案,以防有人陷入同一陷阱。 –

相關問題