当我使用 XCTest 创建自定义测试套件时,为什么我的测试用例中的 +setup 没有被调用?

Why isn't +setup in my testcases being called when I create a custom test suite with XCTest?

我有一个 XCTestSuite 的子类,我即时实例化并填充测试:

+ (XCTestSuite *)defaultTestSuite {
    MySuite *suite = [[MySuite alloc] initWithName:@"suite"];
    [suite addTest:[[MyTestCase alloc] initWithSelector:@selector(firstTest)]];
    [suite addTest:[[MyTestCase alloc] initWithSelector:@selector(secondTest)]];
    return suite;
}

+ (void)setUp {}
- (void)setUp {}
- (void)firstTest {}
- (void)secondTest {}

每次测试都会调用 -(void)setUp,但从未调用 +(void)setUp。如果我不使用我的自定义 testSuite 或者我调用:

 + (XCTestSuite *)defaultTestSuite {
    XCTestSuite *suite = [super defaultTestSuite];
    [suite addTest:[[MyTestCase alloc] initWithSelector:@selector(firstTest)]];
    [suite addTest:[[MyTestCase alloc] initWithSelector:@selector(secondTest)]];

它确实被调用了。这是为什么?

XCTest 有一个名为 XCTestCaseSuite 的私有内部 class,它是 XCTestSuite 的子 class。您可以查看 Swift 来源 here。它负责为您调用 +(void)setUp。如果您想要相同的功能,则必须在您的自定义 XCTestSuite subclass 中复制它。我在任何地方都找不到这方面的文档,但它确实有意义,因为如果测试用例来自不同的 classes,那么在调用 +(void)setUp/+(void)tearDown 方法时如何排序。