基于iOS版本的条件单元测试

时间:2013-10-15 10:40:24

标签: ios objective-c unit-testing ocunit sentestingkit

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

是否有标准方法表明这些测试用例只能在特定的iOS版本上运行?

我想到的一个选择:

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

    // Actual test goes here
}

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

4 个答案:

答案 0 :(得分:4)

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

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

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

你没有指定你的单元测试的执行方式,但处理这个问题的真正酷的方法是IMO,它能够指定在实现之外执行哪些测试,以便你说明哪些是仅限iOS7,不会污染您的测试实施。

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

编辑:

实际上,事情可能比我想到的更容易。现在我有点hacky ......

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

如果您担心修改OCUnit,这可能不合理,我上面所说的可以通过方法调配来完成:只有当选择器名称与您的表达式不匹配时,才调用原始实现,否则什么都不做。 / p>

答案 1 :(得分:3)

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

[view respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]

[UIView instancesRespondToSelector:@selector(snapshotViewAfterScreenUpdates:)]

答案 2 :(得分:1)

没有一种标准的方法可以做到这一点,一般而言,测试不是iOS社区过多谈论的内容。 我这样做的方法是将特定的iOS7测试单独放在测试目标上,然后基本上决定相应地运行该套件

答案 3 :(得分:0)

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

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

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

我不喜欢这种方法,无论如何测试运行(并且没有做任何事情)。我希望完全跳过测试。