我的单元测试套件包含一些仅适用于最新iOS版本的测试用例。预计,在较旧的iOS版本上运行套件时,这些测试会失败。
是否有标准方法表明这些测试用例只能在特定的iOS版本上运行?
我想到的一个选择:
- (void) testSomethingThatOnlyWorksOniOS7
{
const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
if (!iOS7OrHigher) return;
// Actual test goes here
}
或者,我可以告诉SenTestCase
动态跳过某些测试吗?
答案 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
}
我不喜欢这种方法,无论如何测试运行(并且没有做任何事情)。我希望完全跳过测试。