KNMParametrizedTests 0.1.2

KNMParametrizedTests 0.1.2

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Markus Gasser维护。



  • By
  • Markus Gasser

KNMParametrizedTest

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)。