9

我的单元测试套件包含一些仅适用于最新 iOS 版本的测试用例。预期在旧 iOS 版本上运行套件时,这些测试会失败。

有没有标准的方法来表明这些测试用例应该只在特定的 iOS 版本上运行?

我想到的一个选择:

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

    // Actual test goes here
}

或者,我可以告诉SenTestCase动态跳过某些测试吗?

4

4 回答 4

5

你的方法对我来说似乎很好。

一般来说,我不认为有一种“标准方式”可以根据 iOS 版本选择性地执行单元测试。

一方面,您的方法是相同的,可用于根据 iOS 版本有选择地或以不同方式实现一项功能。可能您已经知道关于 CocoaWithLove: Tips and Tricks from conditional... 的讨论。它已经很老了,但是这里描述的方法仍然存在。

您没有指定执行单元测试的方式,但处理此问题的真正酷方法,IMO,将能够指定在实现之外执行哪些测试,以便您声明哪些测试仅适用于 iOS7 和不要污染您的测试实施。

这可以通过例如与每个测试相关联的版本号来完成;在调用单元测试实现之前,您检查函数调用中的版本号,例如testSomethingThatOnlyWorksOniOS7.

编辑:

实际上,事情可能比我一开始想的要容易。现在我要有点hacky了......

您可以修改 OCUnit 中完成实际测试方法调用的位置(不知道这一点,抱歉,但我认为这应该不难找到......)以便它检查选择器名称:您转换将选择器名称转换为字符串 ( NSStringFromSelector),如果它与某个正则表达式匹配,您将采用一些特定的分支(在您的情况下,忽略该测试)。

如果您通过修改Ocunit(可能是不明智的)担心,我上面说的是通过方法进行操作:只有选择器名称不符合您的表达式,您才会称呼原始实现,否则什么都不做。

于 2013-10-15T10:53:05.517 回答
3

最好的方法是respondsToSelector:使用您知道仅在 iOS 7 上可用的方法运行。例如

[view respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]

或者

[UIView instancesRespondToSelector:@selector(snapshotViewAfterScreenUpdates:)]
于 2013-10-15T10:44:25.030 回答
1

没有标准的方法来做这件事,一般来说测试不是 iOS 社区谈论太多的事情。我解决这个问题的方法是将特定的 iOS7 测试单独放在测试目标上,然后基本上决定相应地运行该套件

于 2013-10-15T10:53:25.310 回答
0

我尝试按照@sergio 的建议使用 OCUnit,但我走不远。到目前为止,我正在使用宏注释特定于版本的测试。它看起来像这样:

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

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

我不喜欢这种方法的地方是测试无论如何都会运行(并且什么都不做)。我宁愿完全跳过测试。

于 2013-10-15T13:52:24.447 回答