0

我正在为我的 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.
}

每个单一的单元测试都在没有任何错误的情况下执行。但是在执行整个测试套件时它会失败。

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

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

需要帮助来解决和理解问题。

4

2 回答 2

0

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

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

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

于 2017-04-12T00:07:15.393 回答
0

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

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

于 2017-04-12T12:37:46.423 回答