单元测试参考
- 添加单元测试框架
新建立项目时添加
如果新建项目时, 忘记添加, 在项目中添加
image.png- 新建测试类
- 新建 PersonInformation类
#import <Foundation/Foundation.h>
@interface PersonInformation : NSObject
@property (nonatomic, copy) NSString *age;
@end
#import "PersonInformation.h"
@implementation PersonInformation
@end
- 在 PesonalInformationTest.m文件中写测试方法
#import <XCTest/XCTest.h>
#import "PersonInformation.h"
@interface PesonalInformationTest : XCTestCase
@end
@implementation PesonalInformationTest
// 单元测试开始前调用
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}
// 单元测试结束前调用
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
// 测试代码可以写到以test开头的方法中, 并且左边会有一个菱形图标产生
- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testInformationAge {
PersonInformation *info = [[PersonInformation alloc] init];
info.age = @"20";
[self checkAge:info];
info.age = @"109";
[self checkAge:info];
}
- (void)checkAge:(PersonInformation *)info {
// 左边条件不满足时, 输出右面的信息
XCTAssert([info.age integerValue] > 0, @"年龄不能为负数");
XCTAssert([info.age integerValue] < 110, @"年龄不能超过 110");
}
// 性能测试
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
-
测试
image.png
测试成功
image.png
-
修改 info.age = @"-1"; 继续点击测试方法前面的✅
image.png -
性能测试
image.png
从这里我们可以获知在一个for循环重复的代码,程序会运行10次,取一个平均运行时间值,average: 0.00388s这个就是平均时间0.00388秒。
我们来看看这几个参数都是啥意思:
- Baseline 计算标准差的参考值
- MAX STDD 最大允许的标准差
- 底部点击1,2…10可以看到每次运行的结果。
\
- 异步测试
异步测试的逻辑如下,首先定义一个或者多个XCTestExpectation,表示异步测试想要的结果。然后设置timeout,表示异步测试最多可以执行的时间。最后,在异步的代码完成的最后,调用fullfill来通知异步测试满足条件。
// 异步测试
- (void)testAsyncFunction {
XCTestExpectation *exception = [self expectationWithDescription:@"Just a demo expectation,should pass"];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(1);
NSLog(@"Async test");
XCTAssert(YES, @"should pass");
[exception fulfill];
});
[self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) {
// Do something when timeout
}];
}
-
测试覆盖率
image.png
测试覆盖率达到50%以上已经是一个很健壮的程序了.
eg: AFNetWorking
image.png
eg: SDWebImage
image.png依赖注入
依赖注入是一种分离依赖,减少耦合的技术。可以帮助写出可维护,可测试的代码。那么为什么这里要提到依赖注入呢?因为在我们的单元测试中,某些时候模块间的依赖太高,会影响我们的单元测试,合理使用依赖注入帮助我们进行测试。
网友评论