今天看了一下objc中国的测试篇,做了一下学习整理。本文不涉及测试代码,只是从概念上理解测试。
一、行为驱动开发(BDD)
1. 应该测试什么?
应该测试对象的行为,即对象的方法接口,接口定义了对象的行为。BDD的思想是尝试思考行为的结果,而不是实际的实现。
2. BDD DSL
测试模板为:
SpecBegin
describe(@"string about what to test",^){
context(@"string about context", ^{
beforeEach(^{
// code
});
it(@"some strings", ^{
// test code
});
});
});
SpecEnd
SpecBegin 声明了测试类;SpecEnd 结束了类声明。
describe 块声明了一组实例。
context 上下文。
it 是一个单一的例子 (单一测试)。
3. BDD框架
BDD框架有specta, kiwi, Cedar,当涉及到语法,所有这些框架几乎是相同的。它们之间的主要区别在于它们的可配置能力和绑定的组件。
1)Cedar:捆绑了匹配和置换,包含了额外配置功能:集中测试,和反向配置功能。
2)Kiwi:捆绑了匹配和stubs, mocks,但是没有可配置的功能。
3)Specta:缺少匹配、subs、mocks功能,但是具有可配置功能。
4. 举例说明
文章列举了四个例子:消息格式化、数据下载、测试视图控制器、登陆视图控制器。有兴趣的可以去objccn中去看具体的例子。
5. 结论
BDD的思想是专注于测试对象的行为而不是内部实现。
二、XCTest测试实践
XCTest比较简单,而且与Xcode IDE集成。测试用例被分到继承 XCTestCase 的不同子类中去。每个以 test 为开头的方法都是一个测试用例。一般测试用例的命名:testThatIt***或者test+待测试的方法名、类名。如果禁用某一test case,可以在用例名前加前缀Disabled_。
1. 测试用例的组织模式Given/when/then
Given描述指定的测试状态;
when描述测试代码;
then检查测试结果。
测试用例示例:
- (void)testThatItDoesURLEncoding
{
// given
NSString *searchQuery = @"$&?@";
HTTPRequest *request = [HTTPRequest requestWithURL:@"/search?q=%@", searchQuery];
// when
NSString *encodedURL = request.URL;
// then
XCTAssertEqualObjects(encodedURL, @"/search?q=%24%26%3F%40");
}
2. 可重用的代码
将可重用的代码通过公用类来维护,也可以在 XCTestCase 类中直接实现委托协议。
3. Mocking
用 mock 来管理一个对象的所有依赖项,通过这个方式对类进行隔离测试,但是注意不要过度mock。通过函数- (void)verifyMockLater:(id)mock;验证mock对象。
4. 状态性和无状态性
一些类中包含状态,而大部分则是无状态的。状态的管理又很容易引起很多 bug,因为管理状态非常复杂。通过隔离状态来使测试代码更好的运行,测试用例也变得简单。
文章中还提到需要XCTest中的技巧,大家需要结合测试例子看,这里我就不一一赘述了……
5. 与Xcode和XCodeServer集成
XCTest 最好的优点就是它可以和 Xcode IDE 集成的非常好。
当运行一个或某几个测试用例时,点击左边栏上、靠近行数的小菱形按钮即可。也可以从测试导航中运行某一个或一组测试用例,并且可以过滤所有失败的测试用例。
持续集成:Xcode Server是一个基于 Xcode 的持续集成服务器。只要有新的提交,Xcode Server 就会自动从 Github 上 check out工程,然后可以让它运行静态分析、执行测试用例,并且自动打包成 Xcode archive 以供下载。
6. BDD和XCTest
XCTest 的优势和缺点都是由于它太简单了,其优点还有易于和XCode集成,但是XCtest的功能还不够强大。因此,XCTest 对中小型的工程来说是一个很好的选择,但是对于更大型的工程,就有必要参考一下像 Kiwi 或者 Specta 这样的 BDD 框架。
参考website:http://objccn.io/issue-15/
欢迎访问我的个人博客 www.dzwanli.com.cn
网友评论