XCTest测试套件中的共享测试

时间:2014-05-06 08:54:34

标签: ios objective-c unit-testing xctest

我有一个类可以配置为做两个稍微不同的东西。我想测试两条路径。该类是UIViewController的后代,大多数配置都在Interface Builder中进行。我需要验证两个Storyboard场景及其Outlet是否以相同的方式连接,还需要检查行为的差异。

我想为此目的使用共享的XCTest套件。

一个用于左手,一个用于右手。使用该应用程序时,两者都出现在另一个第一个(右手)触发一个segue到另一个。最后一个(左手)应该触发不同的segue。例如,这就是它的不同之处。

现在我想通过测试验证segues。我想创建一个BothHandSharedTests套件,它们都会查看控制器实例测试,以验证它们共有的所有内容。但是,BothHandSharedTests类被视为一个自包含的测试套件,它显然不是。

我想出了这些策略:

  • 继承自抽象XCTest后代,如上所述(似乎并不那么容易),
  • 为公共属性编写测试auite,并使用其中一个作为对象测试,并为差异添加两个较小的套件。

你会如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

这是Swift的解决方案:

class AbstractTests: XCTestCase {

    // Your tests here

    override func performTest(run: XCTestRun) {
        if self.dynamicType != AbstractTests.self {
            super.performTest(run)
        }
    }

}

答案 1 :(得分:2)

我没有确定的答案,但这就是我最终做的事情。

我首先尝试了子类化路由。在父测试(“AbstractTestCase”)中,我实现了将由AbstractTestCase子类执行的所有测试,但添加了一个宏,因此它们不会被实际的父测试运行:

#define DONT_RUN_TEST_IF_PARENT if ([[self className] isEqualToString:@"AbstractTestCase"]) { return; }

然后我将这个宏添加到每个测试的开头,如下所示:

- (void)testSomething
{
    DONT_RUN_TEST_IF_PARENT

    ... actual test code ...
}

这样,在继承自AbstractTestCase的ConcreteTestCase类中,所有这些测试都将被共享并自动运行。当然,您可以覆盖-setUp来执行必要的特定于类的设置。

然而 - 由于以下几个原因,这是一个糟糕的解决方案:

  1. 它混淆了Xcodes测试用户界面。您实际上并没有看到正在运行的实时表示,并且测试有时不会按预期显示。这使得点击调试测试失败变得困难或不可能。
  2. 它混淆了XCTest本身 - 我发现即使我没有问过它们(如果我只是试图运行单个测试),测试通常会运行,所以测试输出不会是我想要的期望的。
  3. 老实说,让流量控制重定向的宏 - 宏从来都不是一个好主意,感觉有点笨拙。
  4. 相反,我现在正在使用一个共享对象TestCaseHelper,它为每个测试类实例化,并且具有所有测试用例共有的协议/委托模式。它不那么干 - 大多数测试用例只是其他测试用例的重复 - 但至少它们很简单。这样,Xcode就不会混淆,调试失败仍然存在。

    更好的解决方案很可能来自Apple,除非您有兴趣放弃整个测试套件。