Можно построить схему сценария с несколькими примерами с 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
Здесь есть много возможностей для совершенствования, но это хорошее место для начала.