我正在为我的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
类。
需要协助解决&了解问题。
答案 0 :(得分:0)
基于XCTests
的测试并不是并行运行 - 它们是按顺序运行的。引用the docs:
测试是同步执行的,因为每个测试都是一个接一个地独立调用的。
由于您显示的代码非常少,因此很难说真正的问题是什么。您很可能与您的假设很接近 - 您应该改进setUp
(可能从类版本切换到实例版本)和tearDown
方法或引入模拟,并在模拟上执行测试数据库,如果可能的话。
答案 1 :(得分:0)
您不应该在要测试的代码库中使用单例。我认为您的代码在内部使用DBManager的sharedSingleton实例。每个unitest都会更改该实例的内部状态,因此所有后续unitest都会被破坏。您需要在拆解每个测试用例后重置所有更改。
但我的建议是通过依赖注入避免基本代码中的单例。在创建类的实例时,请注入DBManager的单例实例。这使单元测试更容易。如果您注入协议而不是对象,您甚至可以使用协议伪实现来测试您的代码。