iOS unit test雑記

2131 ワード

unit testの必要性


unit testは何ができるのか、どのように書くのか、ここでAppleが提供した簡単なサンプルコードを参考にして、計算機のmodelをテストすることができます.標準的なMVCアーキテクチャをMVVMアーキテクチャに変更すると、viewModelもテストできますが、ここでは説明しません.
unit testは開発で書いたコードが変更できない問題を効果的に解決することができる.また、複雑なモデルに対しては、テストコードを書いてから実装コードを書くのもより効率的な方法です.

その他


リソースファイル


いくつかのキャッシュデータや準備されたデータベースを使用する必要がある場合があります.これらのファイルを参照するときは[NSBundle bundleForClass:[self class]][NSBundle mainBundle]に代わって、まだ見つからない場合は、unit test対応のtargetのcopy bundle resourceに追加されているかどうかを確認します.

テスト・インスタンスは共有されていません


1つのXCTestCaseの下の各testメソッドは、1つのXCTestCaseオブジェクトを個別に作成して実行し、-setupおよび-tearDownもテスト・インスタンスごとに呼び出されます.
一般的な直感ではそうであるべきだ.
var foo = 1
func testfc1 {
    print(foo)  // 1
    foo = foo + 1
}
func testfc2 {
    print(foo)  // 2
}


でも実際は
var foo = 1
func testfc1 {
    print(foo)  // 1
    foo = foo + 1
}
func testfc2 {
    print(foo)  // 1
}


この特性に注意する必要がある場合があります.例えば、データベース関連のコードをテストして、テスト後にアプリケーションが停止したような気がします.データベース接続がオフになってもかまいませんが、テスト中にトンのエラーメッセージが見つかります.各テスト例は接続をオフにしていない場合に新しく作成されました.- tearDownでリンク[_queue close]をオフにしたほうがいいです.

ちえんしけん


遅延タスク(マルチスレッド、ネットワーク接続)をテストする必要がある場合は、XCTestExpectationクラスを使用する必要があります.具体的には、他の記事で検索することができます.簡単なコードは以下の通りです.
XCTestExpectation *expectation = [self expectationWithDescription:@"des"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    ...
    dispatch_async(dispatch_get_main_queue(), ^{
        if (succ) {
            [expectation fulfill];
        }
        else {
            XCTFail(@"...");
        }
    });
});

[self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) {
    XCTFail(@"...");
}];

数値比較の問題


浮動小数点数の格納メカニズムのため、浮動小数点数と対応する文字列の比較はたまに奇妙な問題が発生し、@"3.5"である.floatValue==3.5はfalseを返します.ここではNSNumberFormatterを使用して処理することをお勧めします.

サードパーティフレーム


Expecta、SDWebImageのunitTestsも使用するこのフレームワークをお勧めします.