听说Kiwi,是来自于我在进行模块化构建的时候,执行 pod lib create xxxPods
的时候会有一个问题:
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Kiwi
Kiwi是一套以BDD为思想的可读性良好的测试框架,其底层由XCTest框架实现,与XCode结合度很高。
BDD
BDD提倡的是通过将测试语句转换为类似自然语言的描述,开发人员可以使用更符合大众语言的习惯来书写测试,这样不论在项目交接/交付,或者之后自己修改时,都可以顺利很多。如果说作为开发者的我们日常工作是写代码,那么BDD其实就是在讲故事。一个典型的BDD的测试用例包活完整的三段式上下文,测试大多可以翻译为Given..When..Then
的格式,读起来轻松惬意。
Demo
describe(@"My initial tests", ^{
context(@"will pass", ^{
it(@"can do maths", ^{
[[@1 should] beLessThan:@23];
});
it(@"can read", ^{
[[@"team" shouldNot] containString:@"I"];
});
});
});
四种常用的测试场景
Sequence Logic
此种情况直接通过equal语法,或者should not + equal语法完成,简单明快
it(@"can do maths", ^{
[[vc.name should] equal:@"nimo"];
});
Notification
此种方式利用出发notification的方式,来测试是否真的执行到了Notification的方式来执行。
it(@"can hook notification", ^{
[[@"Notify" should] bePosted];
NSNotification *myNotification = [NSNotification notificationWithName:@"Notify"
object:nil];
[[NSNotificationCenter defaultCenter] postNotification:myNotification];
});
Block场景和Thread场景
这两种场景的测试方法一致,都是待其执行后看运算是否执行,通过expectFutureValue来进行查看:
it(@"can hook thread", ^{
[vc changeNameByThread];
[[expectFutureValue(vc.name) shouldEventually] equal:@"kiki"];
});
it(@"can hook blocks",^{
__weak NimoViewController *wVC = vc;
[vc changeNameWithBlock:^(NSString *name) {
wVC.name = name;
}];
[[expectFutureValue(vc.name) shouldEventually] equal:@"nimo for Block Function"];
});
优点
首先,和CocoaPods结合紧密,官方创建Pods后直接支持生成Kiwi的测试项目;
其次,由于其BDD的特性,语法可读性很强;
最后,由于是基于XCTest来开发的,对XCode的支持很好,直接通过XCode进行测试回归或调试即可。
和Jenkins的结合
Todo
不过因为起支持XCode级别的调试和运行,所以即便无法Jenkins也不是很有所谓了。
更详细的Kiwi介绍:
本来想写一篇关于Kiwi的详细介绍,发现喵神已经有专著了,所以我就不重复造轮子了:
TDD的iOS开发初步以及Kiwi使用入门
Kiwi 使用进阶 Mock, Stub, 参数捕获和异步测试
网友评论