1

在我们的 iPhone 应用程序单元测试中,我们有一个包含所有测试用例类的测试套件。在套件的 setUp/tearDown 中,我们进行一般设置/拆卸,在 DB 中创建/删除一些实体。在 setUp 中,我们使用 NSAsserts 来断言一切正常。问题是,如果 setUp 出现问题,NSAssert 会导致崩溃,并且不会调用 tearDown,从而导致数据库未清理。

确保始终调用 tearDown 以确保数据库始终干净的最佳方法是什么?也许不使用 NSAsserts?但是那么如何告诉测试框架不运行测试用例呢?

谢谢。

4

2 回答 2

2

我建议您在测试套件中添加一个布尔 ivar,当一切设置正确时,该套件在 setUp 中设置。NSAssert 然后被替换为设置这个变量,例如。由 STAssert 标记...以防万一出现任何问题,这将导致您的测试失败。

然后,在每个测试用例中,您在执行检查之前检查此 ivar 是否为真,例如通过使用以下内容:

-(void)setUp {
  // Perform the setup of the testbed and setting testBedStable accordingly
  STAssertTrue(testBedStable, @"Failed to setup test environment";
}

-(void)testSomething {
  if(testBedStable) {
    // Perform tests
  }
  else
    STFail(@"Unable to perform test case");
}

此方法将确保始终调用 tearDown 并且您可以相应地进行清理。

于 2011-05-10T09:08:04.207 回答
1

对,不要使用 NSAssert。反而:

  • 将数据库设置拉入单独的辅助方法中。
  • 设置实例变量以指示成功设置的内容。
  • STFail在任何没有成功设置的东西上。
  • 让每个测试调用适当的辅助方法。
  • -tearDown中,检查实例变量以查看需要清理的内容。

例子:

@interface DatabaseTest : SenTestCase
{
    BOOL removeTestDataInTearDown;
}

- (void)addTestDataToDatabase
{
    BOOL success;
    // Attempt to add data to database. Set success according to results.
    if (!success)
        STFail(@"Unable to add test data to database", nil);
    removeTestDataInTearDown = YES;
}

- (void)removeTestDataFromDatabase
{
    // Remove data from database.
}

- (void)tearDown
{
    if (removeTestDataInTearDown)
        [self removeTestDataFromDatabase];

    [super tearDown];
}

- (void)testSomething
{
    [self addTestDataToDatabase];
    // Execute test using data.
}

请注意,即使这样也有可能在数据库中留下杂乱无章的东西,这使得此类测试变得脆弱。因此,您可以使用一组不同的测试来补充这些测试,这些测试使用模拟对象代替真实的数据库调用。

于 2011-05-02T20:43:40.197 回答