Как убедиться, что набор тестов OCUnit вызывает tearDown?

В наших модульных тестах приложения для iPhone у нас есть один набор тестов, который содержит все классы тестовых случаев. В наборе setUp/tearDown мы делаем общую настройку/удаление, которая создает/удаляет некоторые объекты в БД. В setUp мы используем NSAsserts, чтобы убедиться, что все прошло правильно. Проблема в том, что если что-то пойдет не так в setUp, NSAssert вызовет сбой, и tearDown не будет вызван, оставив БД неочищенной.

Каков наилучший способ убедиться, что tearDown всегда вызывается, чтобы БД всегда была чистой? Может быть, не использовать NSAsserts? Но тогда как сказать среде тестирования не запускать тестовые случаи?

Спасибо.


person Mikayel Aghasyan    schedule 02.05.2011    source источник


Ответы (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 всегда вызывается, и вы можете выполнить соответствующую очистку.

person Claus Broch    schedule 10.05.2011
comment
Вам не хватает [super setUp]. - person Ricardo Sanchez-Saez; 09.11.2012

Правильно, не используйте 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.
}

Обратите внимание, что даже это может оставить мусор в базе данных, что делает такие тесты хрупкими. Таким образом, вы можете дополнить такие тесты другим набором тестов, в которых вместо реальных вызовов базы данных используются фиктивные объекты.

person Jon Reid    schedule 02.05.2011