XcodeによるSwiftプログラミング中級講座

非同期処理に対するユニットテストの書き方

全334コースを10日間無料で

ぜひご覧ください。

無料で視聴する すべての加入プランを見る
または
非同期処理を行うコードに対するテストの書き方について解説します。
講師:
07:51

字幕

このレッスンでは、非同期的な処理を行うコードに対してテストを書く方法を説明します。それではまず、テストを行うメソッドを早速書いていきたいと思います。ここに Tests のクラスがありますので、この tests の一番下のところにfunc test、非同期の処理を行うということで、Test Async という感じで、こういう名前をつけたメソッドを用意します。ここにですね、まず一番最初に何か一つ変数を用意します。ここでは value という名前で、整数型の 0 を代入しておきましょう。この value に対してですね、5 回のループを繰り返しながらこの value に += i ということで、この 1 から 5 までの数字を、5 回ですね、足し合わせていくというコードをこのように書きます。最後にこの 1 から 5 まで、足し合わせた数字、全部足し合わせると15 になるはずですけど、これが本当に 15 になることをアサートする。そういう AsserEqual を書いてみたいと思います。value が、15 になっているかということをアサートします。これはもちろんですね、ちゃんと機能しますので、このテスト実行してやるといまシミュレータが立ち上がってテストが完了しました。 特に問題なくアサートが完了したということで、このテストちゃんと通ります。これがですね、同期的にこの for 文の処理を行っている場合なんですけど、これが非同期で行われた場合はどうなるかということをみていきます。非同期で行うために、一つ Operation Queueというのを作成しましょう。var opQueue= NSOperationQueueとこのように書きまして、この Operation Queueというのに対して、addOperationWithBlockというのを使ってですね、このようにこのブロックのなかにこの for 文を入れてやると、この for 文で value に一つ一つ値を足していくという作業がこのアサートとは別のスレッドで、実行されるようになります。この時はですね、このfor 文のなかで足し合わされてるこの value のここの部分が実行されてるかもしれないし、実行されてないかもしれないタイミングでこの AssertEqual が呼ばれます。実際にですね、これを実行してみましょう。いまシミュレータ上で実行しましたが、大体の場合こうやって失敗すると思います。15 に対してこの 1 から5 を足し合わせる前に、この AssertEqual が呼ばれてしまっているので、この value の中身は 0 だと。 0 と 15 を比較してももちろん違いますよとなります。なのでこれをちゃんとですね通るようにすれば、ここのところで sleep を一回入れて、例えばここで 2 秒間待ってくださいねという sleep を入れてから、これを実行することによって、1 秒間 2 秒間くらい待ってアサートを実行すると、2 秒間の間にこちらのスレッドの実行が終わってますから、value は問題なく 15になっているということで、このようにアサートの状態が通ります。ですが現実問題としてですね、色々なテストを行う時にじゃあここは 2 秒でいいのかと、10 秒間くらい必要なんじゃないかとか、あるいは 1 分間も待ってたらテストがいつまでたっても終わらないということがあったりしますので、ここの処理がですね、この 5 回繰り返す処理が終わるなり、このアサートを行うというふうにしたいなと思うわけです。そのときにどうしたらいいかといいますと、このテストの全体の処理を行う前に、一つですねオブジェクトを作成しておきます。どのようなオブジェクトかと言いますと、expect という名前のオブジェクトを作成します。これはですね、test クラスに対してはじめから用意されているexpectationWithDescriptionという名前のメソッドを使います。 ここの文字列、なんでも構いません。なんでも構わないので例えば今回は、AsyncTest と非同期のテストということで AsyncTestと書いてみます。そしてここで 2 秒間待っていますけど、sleep の代わりに、このself.waitforExceptationsWithTimeoutというのを使います。ここで何秒まで待つことができますかと、秒単位でまず最初に指定します。例えばそうですね 60 秒、1分間待つことができますよということで、60.0 まで待っていいですよということをここに書きまして、その後ろに handler というのがあります。この handler、ここにですねちなみにこの handler のところマウスで選択して、「Return」 キーを押すともうそのままコードを書き始められるようになっています。ここに NSErrorと書いてある ところですね。NSError と書いてあるところこちらに、このままだと多分エラーが起きるんですよね。なのでここに、error というふうに変数名でエラーを受け取る変数名を書いてやってですね、ここに最後アサートを行うプログラムを移動します。 そうするとこのExceptation というのは、waitForExceptation というのが呼び出されている間は、この expect が仕事が完了するまではこのなかに書かれているメソッドが実行されることはありません。まだ完了じゃないんですけどね。ここの expect が終わったということを示すために、Operation Queue の中で行なわれている、この非同期な作業が全部終わったところで、expect に対してメソッド呼び出しを行います。名前は fulfill という名前ですね、これで非同期の仕事が全部完了しましたということを伝えます。fulfill が呼ばれたら、今まで実行を停止していたこの waitForExpectations のところの処理が再開されて、ここにあるアサートの、プログラムがこのなかに書かれているhandler に書かれているプログラムが実行が開始すると、ここでもう一度テスト実行をしてやるとこのように問題なくテスト実行が行われるようになります。本当にこの XCTAssertEqual が呼ばれているか確認するには、一番簡単なのはここの15 になっているのを例えば 14 にしてみてもう一度テストを再実行してみると、そうするとこうやってエラーが出てますよということがわかりますので、先ほどのこれが 15 だったときにテストが成功していたのは、ちゃんと問題なく動作していたんだなということが確認できます。 このレッスンでは、非同期処理を行うコードに対して、テストを書く方法を説明しました。

XcodeによるSwiftプログラミング中級講座

このコースではSwiftのプログラミングに慣れてきた方を対象に、より効率的にXcodeを使い、プロジェクトを管理するためのさまざまなテクニックを紹介します。各レッスンではブレークポイントやプロファイラを使った便利なデバッグ方法や、条件に応じてコンパイル対象のコードを書き分けるやり方など実際のアプリ開発で使える実践的なテクニックを解説します。

3時間01分 (27 ビデオ)
現在、カスタマーレビューはありません…
 
ソフトウェア・トピック
価格: 2,990
発売日:2015年10月29日

このコースは、「オンデマンド」でご利用可能であり、ダウンロードすることもオンラインで見ることもできます。

ダウンロードすると、オフラインでコースを使用し、豊富なインターフェースをフルに活用できます。複数のデバイスを使用したり、 一度に全コースをダウンロードしたくない場合は、アカントにログインして、ストリーミング・ビデオとしてコースのレッスンを視聴してください。

ビデオトレーニングをお楽しみいただけますように! お問い合わせは、cs-jp@lynda.com宛までご連絡ください。