KNMParametrizedTest 使用 XCTest 框架添加了对参数化测试用例的支持。以下是一个示例
KNMParametersFor(testExample, @[ @"Hello", @"World" ])
- (void)testExample:(NSString *)word
{
NSString *result = [myUppercaser uppercaseString:word];
XCTAssertEqualObjects(result, [word uppercaseString],
@"Uppercaser failed for word %@", word);
}
最简单的方法是使用 CocoaPods。只需将以下代码添加到测试目标的 Podfile 中。
pod 'KNMParametrizedTests'
参数化测试的声明与普通单元测试方法一样,但它接受一个参数,然后用于传递参数。因此,参数化测试必须:
void
test
开头 - (void)testSomeParametrizedSomething:(NSDictionary *)param {
}
要提供参数,KNMParametrizedTest 将在测试用例类上调用 + (NSArray *)parametersForTestWithSelector:(SEL)selector
并将测试选择器作为参数传递。
默认实现将尝试找到与以下模式匹配的类方法
+ (NSArray *)parametersFor<TestName>
或者作为替代+ (NSArray *)parametersFor_<testName>
(请注意大小写不同)。第二种选择主要适用于宏,因为它更容易构建。
注意:参数方法是为类方法,而不是实例方法。
因此,对于名为 - (void)testExample:(NSString *)param
的测试用例,以下任一方法都可以提供参数。
+ (NSArray *)parametersForTestExample {
return @[ @"Foo", @"Bar" ];
}
+ (NSArray *)parametersFor_testExample {
return @[ @"Foo", @"Bar" ];
}
如果都提供了实现,则使用前者。
如果在上述实现中找不到任何实现,默认实现将返回 @[ NIL ]
。这将使用 nil
/0
作为参数执行一次测试。
对提供的每个对象执行一次性参数化测试。如果没有提供对象或返回一个 nil
数组,则跳过测试方法。
如果您希望将 nil
作为参数提供,请使用 NIL
宏。
+ (NSArray *)parametersForTestEmptyness {
return @[ @"", NIL ];
}
注意:如果您返回 [NSNull null]
作为参数,它将原样传递,而不转换为 nil
。
KNMParametrizedTest 支持结构和标量参数。只需在测试方法声明中使用所需的参数类型。
+ (NSArray *)parametersForTestScalars {
return @[ @10, @20 ];
}
- (void)testScalars:(NSUInteger)scalar {
XCTAssert(scalar >= 10, @"Should be greater or equal 10");
}
对于结构体参数,请使用 VALUE(...)
宏。
+ (NSArray *)parametersForTestStructs {
return @[ VALUE(NSMakeRange(10, 10)), VALUE(NSMakeRange(20, 20)) ];
}
- (void)testStructs:(NSRange)range {
XCTAssert(range.location >= 10, @"Should be greater or equal 10");
}
如果您想减少输入,可以使用一些缩写宏。为了给特定的测试用例提供参数,您可以使用 KNMParametersFor(...)
宏。
KNMParametersFor(testExample, @[ @10, @20, @30 ])
- (void)testExample:(NSNumber *)number {
XCTAssert([number integerValue] > 0, @"Should be positive");
}
这可以保持参数和测试用例在一块,而不会使测试用例过于杂乱。此外,该宏还会检查所引用的测试用例是否实际存在。如果不存在,则会发出警告。
这里有一些未加前缀的宏已声明(例如 NIL
)。如果您在使用这些宏时遇到问题,请在导入任何 KNMParametrizedTest 头文件之前添加 #define KNM_PARAM_NO_SHORTHAND
。
#define KNM_PARAM_NO_SHORTHAND
#import <KNMParametrizedTest/KNMParametrizedTest.h>
这将禁用未加前缀的宏。在这种情况下,您需要使用前缀 knm_
(例如 knm_NIL
)。