簡體   English   中英

基於iOS版本的條件單元測試

[英]Conditional unit testing based on iOS version

我的單元測試套件包含一些僅適用於最新iOS版本的測試用例。 預計,在較舊的iOS版本上運行套件時,這些測試會失敗。

是否有標准方法來指示這些測試用例應僅在特定的iOS版本上運行?

我想到的一個選擇:

- (void) testSomethingThatOnlyWorksOniOS7
{
    const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
    if (!iOS7OrHigher) return;

    // Actual test goes here
}

或者,我可以告訴SenTestCase動態跳過某些測試嗎?

你的方法對我來說似乎很好。

一般來說,我認為沒有像“標准方式”那樣有選擇地執行基於iOS版本的單元測試。

一方面,根據iOS版本,您的方法可以選擇性地或以不同方式實現一個功能。 可能你已經知道關於CocoaWithLove的這個討論: 來自條件的提示和技巧.... 它已經很老了,但這里描述的方法仍然保持不變。

你沒有指定單元測試的執行方式,但處理這個問題的真正酷的方法是IMO,它能夠指定在實現之外執行哪些測試,以便你說明哪些只適用於iOS7和不要污染你的測試實現。

這可以通過例如與每個測試相關聯的版本號來完成; 在調用單元測試實現之前,請檢查函數調用中的版本號,例如testSomethingThatOnlyWorksOniOS7

編輯:

實際上,事情可能比我想到的更容易。 現在我有點hacky ......

您可以在OCUnit中修改實際測試方法調用的位置(不知道這個,對不起,但我認為不應該很難找到...)以便它檢查選擇器名稱:您轉換將選擇器名稱轉換為字符串( NSStringFromSelector ),如果它匹配某個正則表達式,則需要一些特定的分支(在您的情況下,這將忽略該測試)。

如果您擔心修改OCUnit,這可能不合理,我上面所說的可以通過方法調配來完成:只有當選擇器名稱與您的表達式不匹配時,才調用原始實現,否則什么都不做。

最好的方法是運行respondsToSelector:對於你知道只在iOS 7上可用的方法。例如

[view respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]

要么

[UIView instancesRespondToSelector:@selector(snapshotViewAfterScreenUpdates:)]

沒有一種標准的方法可以做到這一點,一般而言,測試不是iOS社區過多談論的內容。 我接近這個的方法是將特定的iOS7測試單獨放在測試目標上,然后基本上決定相應地運行該套件

我試着和OCUnit一起玩@sergio建議,但我無法遠離。 到目前為止,我正在用宏來注釋特定於版本的測試。 它看起來像這樣:

#define SKIP_IF_VERSION(v) if (floor(NSFoundationVersionNumber) <= v) return;

- (void)testSomethingThatOnlyWorksOniOS7
{ SKIP_IF_VERSION(NSFoundationVersionNumber_iOS_6_1)
// Test goes here
}

我不喜歡這種方法是測試運行無論如何(並沒有做任何事情)。 我寧願完全跳過測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM