如何确保调用OCUnit测试套件tearDown?

时间:2011-05-02 19:30:55

标签: iphone unit-testing assert ocunit

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

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

感谢。

2 个答案:

答案 0 :(得分: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,您可以相应地进行清理。

答案 1 :(得分: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.
}

请注意,即使这样也有可能在数据库中留下残余,这使得此类测试变得脆弱。因此,您可以使用一组使用模拟对象代替实际数据库调用的测试来补充此类测试。