2017-04-11 97 views
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类。

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

+0

你已经说过答案..如果测试都使用相同的数据库,那么它的内容都处于不断变化的状态,正如你所说......解决方案是让每个单元测试看看单独的数据库或单独的实例或分开表格......或强制顺序执行。测试时的规则是你必须知道数据库的内容..在这种情况下,你永远不会知道,因为它正在被多个进程同时设置和测试。 – Spoon

回答

0

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

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

既然您已经显示了很少的代码,很难说什么是真正的问题。很可能你的假设很接近 - 你应该改善你的setUp(也许切换到实例版本的类版本)和tearDown方法或引入模拟,并尽可能在模拟数据库上执行测试。

0

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

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