Kiwi--BDDモードでのユニットテストの自動化
6386 ワード
Kiwi--BDDモードでのユニットテストの自動化
まずタイトルの中のBDDを見て、これは何の鬼ですか?ここでは、まず現在の異なるテスト思想を見てみましょう.
TDDとBD
Given...When...Then
のフォーマットに翻訳することができ、読みやすい.TDD
需要やインタフェースの状況に応じてテストを作成してから、テストに基づいてビジネスコードを作成することを提唱する.まず、これは従来のソフトウェア開発における先行認識、特に国内環境に違反している.しかし、TDDモードでは、コードの使用など、事前に深く考え、実践することで、設計と拡張性を高めることができます.また、テストの保護があるため、論理の破壊や論理の損失を心配することなく、既存のコードを安心して再構築することができます.上の2つのテスト思想の違いを見た後、私たちの現在のiOSと国内環境の下で、BBDテスト方法は私たちの第一選択だと思います.BDDは、Kiwiを紹介しなければなりません.
Kiwi
KiwiのGitHubアドレス:https://github.com/kiwi-bdd/Kiwi
インストール方法
target :YourProjectTests do
pod 'Kiwi';
end
ここで注意しなければならない
YourProject
あなた自身のプロジェクト名です.KiwiProject
シミュレータとGeneric iOS Device
コンパイルを選択すると対応するKiwi.framework
が生成されます.Kiwi.framework
あなたの工事に引きずり込んで、注意、引きずり込んで、引用ではありませんsetting - Build Phases
奥のLink Binary With Libraies
に追加User Headers Search
その位置を指すRunpath Search Paths
、追加$(FRAMEWORK_SEARCH_PATHS)
非常に重要で、そうでないとエラーOther Linker Flags
に追加-ObjC
.Kiwiの基本文法と構造
自分で書く
Kiwi
文法を始める前に、Kiwi
のGitHubが提供するサンプルコードを見てみましょう.describe(@"Team", ^{
context(@"when newly created", ^{
it(@"should have a name", ^{
id team = [Team team];
[[team.name should] equal:@"Black Hawks"];
});
it(@"should have 11 players", ^{
id team = [Team team];
[[[team should] have:11] players];
});
});
});
文脈で抽出できる
Given...When...Then
の三段式自然言語Given a team,when newly created,it should have a name,and should have 11 players
describe
テストが必要な対象内容を記述する、すなわち我々三段式中のGiven
context
・テストの文脈を記述する、つまりこのテストはwhen
で行われ、最後it
のはテストの本体であり、このテストがどのような約束(条件)を満たすべきかを記述し、三者は共にKiwiテストにおける動作記述を構成する.これらはnest
、つまり1つSpec
ファイルに複数含まれることができるdescribe
(私たちはそうすることはめったにありませんが、1つのテストファイルは1つのクラスをテストすることに専念すべきです).1つdescribe
複数のcontext
を含むことができ、クラスの異なるシナリオでの動作を記述する.1個context
複数含むことができるit
の試験例.この例では、次のような重要な動作記述キーワードについて説明します.
Kiwi
-現在のbeforeAll(aBlock)
内部の全ての他scope
運転前に一度呼び出すblock
-現在afterAll(aBlock)
内部全てscope
運転後1回呼び出すblock
-beforeEach(aBlock)
内のitマネーごとに1回呼び出す、scope
の配置はこちらcontext
-alterEach(aBlock)
内のitごとに1回呼び出し、テスト後のコードとクリア状態をクリアscope
-記述不要のテストを直接書くことができるspecify(aBlock)
-1本のみ印刷pending(aString, aBlock)
テストをしないというメッセージは、行動記述がまだ実現していないテストを集中的に書き始めるヒントとして警告されますlog
・xit(aString,aBlock)
と同様、別の書き方.実装時にテスト時にxを削除するだけで済むのがpending
ですがit
意味がより明確なのでおすすめpending
pending
が存在し、ネスト可能な特性のため、テストのフロー制御は従来のテストよりも正確であることがわかる.context
とbefore
の役割領域を適切な場所に制限しやすい.実際のテストはafter
に書かれており、1つ1つの期待it
によって記述されており、従来のテストでの断言に相当する期待があり、実行結果が期待に合致しなければテストに失敗する.(Expectations)
中期望都ではKiwi
またはshould
から始まり、1つまたは複数の判断のチェーン呼び出しが続くが、ほとんどがshouldNot
またはbe
の形式である.Kiwi使用例
どのようにKiwiを利用してユニットテストを行いますか!私たちのプロジェクトには
haveSomeCondition
のクラスが追加されました@interface Person : NSObject
- (CGFloat)everyDayTheBodyPutOnWeight:(CGFloat)weight;
- (CGFloat)everyDayRunForKeepFitLoseWeight:(CGFloat)weight;
@interface Person()
@property (nonatomic, assign) CGFloat totalWeight;
@end
@implementation Person
- (instancetype)init
{
if (self = [super init]) {
_totalWeight = 50.0;
}
return self;
}
- (CGFloat)everyDayTheBodyPutOnWeight:(CGFloat)weight
{
return _totalWeight + weight;
}
- (CGFloat)everyDayRunForKeepFitLoseWeight:(CGFloat)weight
{
return _totalWeight - weight;
}
このクラスのユニットテストをkiwiで作成するにはどうすればいいですか?
#import
#import "Person.h"
SPEC_BEGIN(PersonSpec)
describe(@"every one for a day", ^{
context(@"for lose or put on weight", ^{
__block Person *p = nil;
beforeEach(^{
p = [Person new];
});
afterEach(^{
p = nil;
});
it(@"put on weight", ^{
CGFloat onWeight = [p everyDayTheBodyPutOnWeight:7];
[[theValue(onWeight) should] equal:57 withDelta:2];
});
it(@"lose weight", ^{
CGFloat loseWeight = [p everyDayRunForKeepFitLoseWeight:10];
[[theValue(loseWeight) should] beLessThanOrEqualTo:theValue(50)];
});
});
});
SPEC_END
このテスト例をcommand+Uで実行すると、次のように出力されます.
- 'every one for a day when for lose or put on weight, put on weight' [PASSED]
- 'every one for a day when for lose or put on weight, lose weight' [PASSED]'
以上の文法で用いられる
Person
・を説明する.Kiwiは、
theValue
というスカラー変換対象の文法糖を提供しています.正確な比較をするときは、例の中で直接theValue
または7
と比較するような書き方で比較することができます.このような簡単な例を通して、基本的に
10
の簡単な文法とKiwiの使い方を身につけることができます.ユニットテストは入門の敷居が高くないにもかかわらず、どのように心を込めて、頭を働かせてユニットテストを書き、自動化を実現することができるかは、私たちのプログラマーにとって大きな試練です.さらにkiwiを使用するには、KiwiがステップMock、Stub、パラメータキャプチャ、非同期テストを使用していることを確認してください.まとめ:
まず、CocoaPodsと緊密に結合し、公式にPodsを作成した後、Kiwiを生成するテストプロジェクトを直接サポートします.次に、そのBDDの特性のため、文法の可読性が強い.最後に、XCTestに基づいて開発されたので、XCodeのサポートはよく、直接XCodeでテスト回帰やデバッグを行えばよい.
参考文献:
TDDのiOS開発の初歩とKiwi使用の入門
iOS開発——TDD、BDD方法及びKiwiユニットテストフレームワーク