Можно построить схему сценария с несколькими примерами с KIF?

Я использую KIF для тестирования интеграции / приемки в своем приложении для iOS, и у меня есть пример, который должен пройти ~50 строк статической таблицы, ожидая, что конкретное содержимое в представлении помещено в стек.

Если бы я был в мире огурца /Rspec, я написал бы план сценария, подобный примеру огурца:

Scenario Outline: eating
  Given there are <start> cucumbers
  When I eat <eat> cucumbers
  Then I should have <left> cucumbers

 Examples:
   | start | eat | left |
   |  12   |  5  |  7   |
   |  20   |  5  |  15  |

Где сценарий будет работать для каждого примера и записывать отдельные проходы / неудачи. Есть ли простой способ воссоздать это с KIF (2.0)? Я мог бы почти воссоздать его, просматривая каждый "пример" и сообщая о сбое, если не удалось выполнить одно выполнение цикла, но я обеспокоен тем, что он будет отображаться только как один сбой, когда в действительности будет протестировано несколько примеров.

1 ответ

Решение

После того, как я задал вопрос, я понял, что для этого мне действительно нужно использовать SenTestingKit (не обязательно KIF). Я использовал вариант решения из http://briancoyner.github.io/blog/2011/09/12/ocunit-parameterized-test-case/ для запуска нескольких тестов с использованием одного и того же метода тестирования и разных значений при каждом запуске.

Я добавил description метод моего подкласса SenTestCase, который обеспечивает поддержку тестового навигатора Xcode 5. С помощью одного метода теста вы можете увидеть выполнение теста для каждого набора параметров. Изменяя description Метод, который вы можете уникально назвать каждый прогон. Подход похож на пост в блоге, на который я ссылался, но я приведу свою реализацию здесь:

WMScenarioOutline.h

#import <KIF/KIF.h>

@interface WMScenarioOutline : SenTestCase

@property (nonatomic, copy) NSDictionary *example;

- (id)initWithInvocation:(NSInvocation *)anInvocation example:(NSDictionary *)example;

@end

WMScenarioOutline.m

#import "WMScenarioOutline.h"

@implementation WMScenarioOutline

+ (id)defaultTestSuite
{
    SenTestSuite *testSuite = [[SenTestSuite alloc] initWithName:NSStringFromClass(self)];
    [self addTestCaseWithExample:@{@"name" : @"Foo", @"value" : @0} toTestSuite:testSuite];
    [self addTestCaseWithExample:@{@"name" : @"Bar", @"value" : @1} toTestSuite:testSuite];

    return testSuite;
}

+ (void)addTestCaseWithExample:(NSDictionary *)example toTestSuite:(SenTestSuite *)suite
{
    NSArray *testInvocations = [self testInvocations];
    for (NSInvocation *testInvocation in testInvocations) {
        SenTestCase *testCase = [[WMScenarioOutline alloc] initWithInvocation:testInvocation example:example];
        [suite addTest:testCase];
    }
}

- (id)initWithInvocation:(NSInvocation *)anInvocation example:(NSDictionary *)example
{
    self = [super initWithInvocation:anInvocation];
    if (self) {
        _example = example;
    }

    return self;
}

- (void)testScenarioOutline
{
    [tester runBlock:^KIFTestStepResult(NSError *__autoreleasing *error) {
        NSLog(@"Testing example: %@", self.example);
        return [self.example[@"value"] intValue] == 0 ? KIFTestStepResultSuccess : KIFTestStepResultFailure;
    }];
}

- (NSString *)description
{
    NSInvocation *invocation = [self invocation];

    NSString *name = NSStringFromSelector(invocation.selector);
    if ([name hasPrefix:@"test"]) {
        return [NSString stringWithFormat:@"-[%@ %@%@]", NSStringFromClass([self class]), NSStringFromSelector(invocation.selector), self.example[@"name"]];
    }
    else {
        return [super description];
    }
}

@end

Испытания с разными параметрами

Здесь есть много возможностей для совершенствования, но это хорошее место для начала.

Другие вопросы по тегам