执行整个Test Suite时,单元测试用例失败

时间:2017-04-11 21:08:06

标签: ios objective-c swift unit-testing xctestcase

我正在为我的sqlite数据库类编写单元测试用例。我在该课程中有五个公共API。

我的测试用例如下所示:

+ (void)setUp {  // Note, this is class method and hence called only once during start of this test suite.
    // Code to delete the existing sqlite DB file.
}

- (void)testDBManagerSingletonInstance {
    DBManager *dbMgr = [DBManager getSharedInstance];
    DBManager *dbMgr1 = [[DBManager alloc] init];
    XCTAssertEqualObjects(dbMgr, dbMgr1);
}

- (void)testSaveAndDeleteNicknameAPI {
    // Multiple Assert statements in this test.
}

- (void)testAllAccountStatusAPIs {
    // Multiple Assert statements in this test.
}

每个单一单元测试都没有任何错误地执行。但是当整个测试套件执行时它会失败。

可能我知道失败的根本原因。这是因为当执行整个测试套件时,所有测试都并行运行,并且数据库中会同时发生更新删除。因此,当所有单元测试运行时,它将失败。

但我不知道如何解决这个问题,因为这不是Async,因此我不能使用XCExpectation类。

需要协助解决&了解问题。

2 个答案:

答案 0 :(得分:0)

基于XCTests的测试并不是并行运行 - 它们是按顺序运行的。引用the docs

  

测试是同步执行的,因为每个测试都是一个接一个地独立调用的。

由于您显示的代码非常少,因此很难说真正的问题是什么。您很可能与您的假设很接近 - 您应该改进setUp(可能从类版本切换到实例版本)和tearDown方法或引入模拟,并在模拟上执行测试数据库,如果可能的话。

答案 1 :(得分:0)

您不应该在要测试的代码库中使用单例。我认为您的代码在内部使用DBManager的sharedSingleton实例。每个unitest都会更改该实例的内部状态,因此所有后续unitest都会被破坏。您需要在拆解每个测试用例后重置所有更改。

但我的建议是通过依赖注入避免基本代码中的单例。在创建类的实例时,请注入DBManager的单例实例。这使单元测试更容易。如果您注入协议而不是对象,您甚至可以使用协议伪实现来测试您的代码。