iphone单元测试(二)
来源:互联网 发布:阿里云 有多少个节点 编辑:程序博客网 时间:2024/05/16 14:46
Jan 16th
No comments
对 TDD 不了解的同学可参考 Test-driven development
本文使用的 Objective-C 单元测试框架是 OCUnit ,最新的 Xcode 已经包含。
TDD 的步骤如下:
- 写一个测试某个功能的单元测试用例;
- 运行,测试失败;
- 编码实现功能;
- 运行单元测试,通过修改代码,直到测试成功;
- 重构代码;
- 重构单元测试用例;
- 重复 1。
其中 5、6 是可选步骤,有必要了才会进行,但是必须保证产品代码和单元测试用例不能同时被更改。
简单的例子
实现一个很简单的储蓄账户管理。
创建项目
TddDemo (iOS Window-based Application).
Xcode 模版会缺省生成一个 TddDemo 的 target,这个是在 simulator 上跑的,我们需要添加新的 target Test,菜单 project -> new target -> Cocoa -> Unit Test Bundle。具体设置可参考这篇博文 。
测试 Case
创建类 _SavingAccountTest, target 选择 Test。
使用 OCUnit 需要 import 头文件 SenTestingKit.h, 并继承 SenTestCase,测试方法名必须以 test 开头。
代码如下: 我们需要可以存钱。
1234567891011121314151617181920212223
// _SavingAccountTest.h#import < foundation /Foundation.h >#import < sentestingkit /SenTestingKit.h > @interface _SavingAccountTest : SenTestCase { }@end // _SavingAccountTest.m#import "_SavingAccountTest.h" @implementation _SavingAccountTest - (void)testDeposit { SavingAccount *account = [[SavingAccount alloc] init]; [account deposit:100]; STAssertEquals(100, [account balance], @"bad balance 100 != %d", [account balance]); [account release];} @end
运行,测试失败
功能实现
最简单的方式让测试通过。
1234567891011121314151617181920212223242526
// SavingAccount.h#import < foundation /Foundation.h > @interface SavingAccount : NSObject { } - (void)deposit:(int)money;- (int)balance; @end // SavingAccount.m#import "SavingAccount.h" @implementation SavingAccount - (void)deposit:(int)money { } - (int)balance { return 100;} @end
运行,测试成功
下一个 Case
那么如果取钱会怎样?
修改 testDeposit 函数为如下:
123456789
// _SavingAccountTest.m- (void)testDepositAndWithdraw { SavingAccount *account = [[SavingAccount alloc] init]; [account deposit:100]; [account withdraw:50]; STAssertEquals(50, [account balance], @"bad balance 50 != %d", [account balance]); [account release];}
运行,测试失败
SavingAccount 添加空方法 withdraw 使编译通过。
功能实现
SavingAccount interface 添加属性 balance,更改实现如下
123456789101112
// SavingAccount.m- (void)deposit:(int)money { balance += money;} - (void)withdraw:(int)money { balance -= money;} - (int)balance { return balance;}
运行,测试成功
新 Case
银行存款账户不能透支, 添加 testNegativeBalanceIsNotFine:
123456789
// _SavingAccountTest.m- (void)testNegativeBalanceIsNotFine { SavingAccount *account = [[SavingAccount alloc] init]; [account deposit:50]; [account withdraw:100]; STAssertEquals(0, [account balance], @"balance can't be negative 0 > %d", [account balance]); [account release];}
运行,测试失败
更改实现
123456
- (void)withdraw:(int)money { balance -= money; if (balance < 0) { balance = 0; }}
运行,测试成功
重构
这时我们会发现测试的两个 case 里面都要实例化一个 SavingAccount, 是重复代码,可以提取出来,放入 setUp 和 tearDown 中,这两个方法分别在每一个 test 的最早和最后执行。
12345678
// _SavingAccountTest.m- (void)setUp { account = [[SavingAccount alloc] init];} - (void)tearDown { [account release];}
运行,测试成功
继续 …
UT 和 TDD
- 人月神话很早以前就说过 No, silver bullet,TDD 也是;
- UT 是需要时间成本的,所以要考虑 ROI (Return on Investment), 有些场景比如 UI 交互单元测试成本很高,就可以不去做,但大多数场景下,只要做 UT,总是会有很好的 ROI 的;
- 切记切记不要追求覆盖率,但至少每个 bug 都要用 UT 覆盖;
Hello, From org2blog
Jan 13th
No comments
以前使用 weblogger 作为 Emacs 的 blog 扩展,但一直不是很给力,设置的选项不知道为什么每次重新连接都要从 url 开始输入一遍,就没怎么用过。偶然发现这个扩展,准备试用一下。
Org2blog 可以直接将使用 org-mode 撰写的 blog 发布到 wordpress 博客中。
下载: git clone http://github.com/punchagan/org2blog.git
使用起来很简单,首先将下面代码加入到 .emacs,路径选自己放 org2blog 的地方。
12
(add-to-list 'load-path "~/Dropbox/Emacs/emacs.d/org2blog/")(require 'org2blog)
然后添加 blog
12345678910
(setq org2blog-blog-alist '(("zhengdong.me" :url "http://zhengdong.me/xmlrpc.php" :username "test") ("wordpress" :url "http://username.wordpress.com/xmlrpc.php" ::username "username" :default-title "Hello World" :default-categories ("org2blog" "emacs") :tags-as-categories nil)))
上面设置添加了两个blog,zhengdong.me 和 wordpress。
M-x 输入 org2blog- 后 tab,便可以看到很多可以选择的命令,首先使用 org2blog-login,会提示 blog?,输入前面设置中的 blog 名,zhengdong.me 或者 wordpress,然后会提示输入密码,之后便连接成功,使用 org2blog-new-entry 便可以开始 blog 书写了。
这篇 blog 使用的便是 org2blog。
————–
上文中的 lisp code 是后来加上的,暂时不知道如何在 org2blog 中直接使用 html,比如加入 <pre lang=“lisp”> </pre> 这样的标记。
————–
解决了上面的问题,在 org-mode 中,如果需要加 html tag,只需要在 tag 前面加 @ 即可,复杂的 tag 可以使用 html 标记,如下皆可:
1.
@<pre lang=”lisp”>
(end-of-line)
@</pre>
2.
#+BEGIN_HTML
<pre lang=”lisp”>
(end-of-line)
</pre>
#+END_HTML
转自:http://zhengdong.me/?m=201101
- iphone单元测试(二)
- Iphone 单元测试
- iphone单元测试
- .NET单元测试(二)
- 单元测试JUnit4(二)
- 单元测试(二)如何进行单元测试
- CppUnit 单元测试框架(二)
- JUnit + Mockito 单元测试(二)
- JUnit + Mockito 单元测试(二)
- Visual Studio 单元测试之二---顺序单元测试 (转)
- iphone学习笔记(二)
- C/C++单元测试理论精要(二)
- android单元测试二(JUnit框架)
- 单元测试(二)--测试范畴
- iOS开发中的单元测试(一)& 二
- iOS开发中的单元测试(二)
- 聊聊单元测试(二)——MockEJB
- java 单元测试二(hibernate sessionFantory注入)
- iphone单元测试
- Oracle 10g Data Pump Expdp/Impdp 详解
- 通过身份证分析出生年月日、性别、年龄的SQL语句
- Image::FromFile() Bitmap::FromFile() 并不是将图像调入内存
- WritePrivateProfileString
- iphone单元测试(二)
- windows和cygwin下hadoop安装配置
- 新手的困惑
- 学计算机的孩子很可爱的
- Oracle 检查命中率的SQL
- Javascript的原型继承是如何工作的
- Oracle SQL Loader
- 新iPhone来了!苹果宣布10月4日召开新品发布会
- C 语言中什么是“句柄”和“指针”?“文件”和“流”又有什么异同?