XCTest测试套件中的共享测试。

问题描述 投票:3回答:2

我有一个类,它可以被配置成做2个稍微不同的事情。 我想测试这两种路径。这个类是 UIViewController 我需要验证故事板场景和它们的输出端是否以同样的方式连接,但也需要检查行为的不同。

我想使用共享的XCTest套件来达到这个目的。

一个是针对左手使用的,一个是针对右手使用的。在使用应用程序时,两者都会相继出现。第一个(右手)会触发到另一个的切换。最后一个(左手)应该会触发不同的转场。例如,这就是它的不同之处。

现在我想用测试来验证这些转场。 我想创建一个 BothHandSharedTests 套件,这两个视图控制器实例测试都用来验证它们的所有共同点。然而, BothHandSharedTests 类被视为一个自包含的测试套件,但它显然不是。

我想出了这些策略。

  • 从一个抽象的XCTest子类继承,就像上面所说的那样(似乎没那么容易)。
  • 针对常见的属性写一个测试auite,并以其中一个作为被测对象,并针对不同的属性增加两个小的套件。

你会如何解决这个问题?

ios objective-c unit-testing xctest
2个回答
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. 老实说,有那个宏感觉有点怪怪的--重定向流控制的宏从来都不是什么好主意。

取而代之的是,我现在使用了一个共享对象,一个叫做 TestCaseHelper,它是为每个测试类实例化的,并且有一个所有测试用例通用的协议委托模式。它不那么DRY--大多数测试用例只是其他测试用例的重复--但至少它们是简单的。这样一来,Xcode就不会感到困惑,而且调试失败还是有可能的。

更好的解决方案很可能要来自Apple,除非你有兴趣抛弃你的整个测试套件去做别的事情。


5
投票

这里有一个Swift中的解决方案。

class AbstractTests: XCTestCase {

    // Your tests here

    override func perform(_ run: XCTestRun) {
        if type(of: self) != AbstractTests.self {
            super.perform(run)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.