该项目已停止维护,不再继续开发。请使用BeKindRewind代替。
一个用于记录和重放网络事件以进行集成测试的简单XCTest子类
这是一个用于自动集成测试网络调用记录和重放的简单测试框架。为了减少模拟,它记录了实时网络请求和响应,然后在后续运行中重放它们,并使用https://github.com/AliSoftware/OHHTTPStubs模拟网络请求,以便您的软件可以平静地运行。
要运行示例项目,请克隆仓库,然后从Example目录先运行pod install
。
JSZVCR可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中。
pod "JSZVCR"
#import <JSZVCR/JSZVCR.h>
@interface JSZVCRExampleTestCase : JSZVCRTestCase
@end
@implementation JSZVCRExampleTestCase
- (BOOL)isRecording {
return YES;
}
- (Class<JSZVCRMatching>)matcherClass {
return [JSZVCRSimpleURLMatcher class];
}
- (JSZVCRMatchingStrictness)matchingFailStrictness {
return JSZVCRMatchingStrictnessNone;
}
- (void)testSimpleNetworkCall {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://httpbin.org/get?test=test"]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration]];
// don't forget to create a test expectation
XCTestExpectation *networkExpectation = [self expectationWithDescription:@"network"];
NSURLSessionDataTask *basicGetTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
XCTAssertNil(error);
XCTAssertNotNil(response);
XCTAssertNotNil(data);
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
XCTAssertNil(error);
XCTAssertEqualObjects(dataDict[@"args"], @{@"test" : @"test"});
// fulfill the expectation
[networkExpectation fulfill];
}];
[basicGetTask resume];
// explicitly wait for the expectation
[self waitForExpectationsWithTimeout:5 handler:^(NSError *error) {
if (error) {
// Assert fail if timeout encounters an error
XCTAssertNil(error);
}
}];
}
运行此测试后,将在控制台输出类似以下的日志文件:
2015-06-25 20:48:47.968 xctest[97164:1809740] filePath = /Users/jzucker/Library/Developer/CoreSimulator/Devices/F9C2D4BE-9022-48E9-9A27-C89B8E615571/data/Documents/JSZVCRExampleTestCase.bundle/testSimpleNetworkCall.plist
将此拖放到您的项目作为以您的测试案例命名的bundle(它自动命名)。
然后将isRecording
值设置为NO
- (BOOL)isRecording {
return NO;
}
然后在随后的运行中,测试将使用记录的文件来响应匹配的网络请求。
这些值将自动设置。如果您愿意可以覆盖适当值,但这些值无需更改。默认值可能需要更改直到1.0版本发布。关于记录和回放,它们仅在测试运行时有效,不在设置和清理期间有效。
- (BOOL)isRecording {
return YES;
}
- (JSZVCRMatchingStrictness)matchingFailStrictness {
return JSZVCRMatchingStrictnessNone;
}
- (Class<JSZVCRMatching>)matcherClass {
return [JSZVCRSimpleURLMatcher class];
}
尝试避免编写依赖于状态的测试。相反,确保当 isRecording == YES
时,测试可以完全记录并用于回放,包括 setUp 和 tearDown。这有助于开发过程,并确保测试不会基于另一种开发者在更新你的测试并使用新的录制版本时无法重现的条件。
如果您想要针对 iOS 7 或更低版本进行测试,请使用 0.6.x 或更低版本的版本。
Jordan Zucker, [email protected]
JSZVCR 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。