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

float値に対するユニットテストの書き方

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

ぜひご覧ください。

無料で視聴する すべての加入プランを見る
または
float値に対してテストを行う方法について解説します。
講師:
08:50

字幕

このレッスンでは、フロート値に対してテストを行う方法について解説します。まずこちらのプログラム、ご覧ください。現在ここにですね、 MyCalc というクラスが用意されていて、そしてこの中に add という名前のメソッドが用意されています。int 型の値を 1 つ、そしてもう 1 つ、2 つ受け取って、そしてこの 2 つの値を足し合わせてリターンする、とそれだけの関数です。今度はですね、 こちらにpublic func add として、名前は同じですけどvalue1 に double 型の値、value2 にも double 型の値を受け取るような、そして double の値をリターンするような、このような関数を、メソッドをですね、用意したときに、これをどのようにテストを書けば良いかというところについてお話しします。で、テストを書くためにはですね、もちろんこの Tests の中にテストを書いていきます。今ここに int 型のためのadd のテストを書いたところがあるので、その下あたりに testDoubleAddという風に書いて、同じように書けばいいはずです。なので、var calc = MyCalc として新しいオブジェクトを作成して、そしてこいつに対してですね、ちょっとこれをもうコピー & ペーストで貼り付けますけど、calc に対して 例えば3.2 + 4.1これを計算したら 7.3 になりますよね、という風にこんな感じで AssertEqual の文を書くことができます。 ただ、ここでちょっと待っていただきたいんですね。小数点のついているこの double 型の値であるとか、float 型の値そういった型の値をですね、検証する時には実はこの Equal というのは使ってはいけない方法なんです。何故かということをちょっとプレイグラウンドを使って簡単に説明しましょう。プレイグラウンドを使って新しいプレイグラウンドを作成します。で、ここにですね「Double Test」として新しいプレイグラウンドをデスクトップ上に今 作成したいと思います。これでですね、ちょっと簡単な実験をしてみましょう。まず この文字列のところはいりませんので一旦削除しまして、ここにですね、double 型の値を1 つ用意します。value = 0.0。で こっから 0.1 という値を10 回足し合わせてみましょう。for i in 1...10ということで、10 回ループするこういう i を用意してですね、で value に対して 0.1 を10 回足し合わせます。で、この値がどうなるかということを見てみますと、勿論 0.1 をですね10 回足し合わせているので全部で 1.0 になるはずなんですが、実際にこの value というところの値がですね、どのようになっているのかというのを見ると0.999999 というのが表示されて、1.0 にはなっていないことが分かります。 これ 実際にですねif 文を書いてみるとはっきりします。もしも value == 1.0 だったらYes!!そうでなければ No. を表示してくださいという風にですね、この == になるかどうか ということを検証してみると分かりますが、このように No. になります。で これはなんでかというと、コンピュータの中でですねこの 0.1 という値を正確に表すことが結構難しい訳です。で、コンピュータの中、特に C 言語ファミリーと呼ばれるプログラミング言語の中では、この 0.1 というのは実は0.0999999 といったような値で表されています。ですので そういう微妙な値をですね足し合わせていって、今これ 1 から 10 までの10 回にしましたけど、これを例えば 1000 回とかにしてやると更に良く分かりますね。99.~ と来た後のここのところに859 という風になって、ちょっと 9 が並ばなくなってきます。このように 細かいずれがですね、どんどん起きてくるわけです。なので == 1.0 ですか と聞いても、限りなく 1.0 に近いけど1.0 ではないですよということが 頻繁に起こります。ですので 例外的にですね、このコードが働くとすれば、この for 文で1.0 を作るのではなくて、最初から 1.0 で初期化した値に対してこの value が 1.0 かどうかということを比較すれば、これは Yes が返ってきますが、そうではなくてこの for 文でこうやって 0.1 を足し合わせて1.0 を作った時には、= にならないので ちょっと工夫が必要になります。 じゃあどうすれば良いのかというと、この時の基本的な戦略としてはですねabs という関数を使います。これは 絶対値を求める関数で、こっから value - 1.0、というのを入れてやってこの値から 要するに 1.0 に近い値から1.0 を引いたんだから限りなく 0 に近い値がここに来ているはずだ と。なので、これがもしも 0.001 よりも小さければもう同じだと考えましょうよ という風なこういう考え方をします。そうすると Yes!! が表示されるようになります。ここでは今 かなり小さい数のことを指してこの 0.001 という風に書きましたけど、プログラムの中でですね、ここはDBL_EPSILONという、こういう定数を使って書くのが一般的なプログラムの通例になります。このようにですね、浮動小数点の値、double 型とか、float 型の値に対してそれが等しいかどうかということをチェックするためには、必ずこの誤差というものを考えてやらないといけません。ですので ここでですね、今 3.2 と 4.1 を足し合わせたら7.3 になるはずですよねという条件をこのように書きましたけど、ここで使わなければいけないのは実はこの下の方にあるAssertEqualWith。Accuracy というこのAccuracy というのが精確さという意味を表しますが、誤差をですね、どこまで許すかということを書いてやります。 で、これ使い方は簡単です。例えば 1.0 と 0.9 が等しいことにするのであれば、0.1 までの誤差は許しますよということで、こういう風にこの Assert の関数を書いてやります。そうするとこれ、テスト実行してみると分かりますけど、今 テスト実行しています。上の方の XCTAssertEqualというのは失敗していますけど、下の方のこれはですね、成功しています。ちなみにこれ、この Accuracy をですね0.09 にしてしまうと、もうこれ 0.9 と 1.0 には開きがあるということになってしまいますので、これ 再実行したところ、今 実行し直しています。この上も下もこのようにエラーが出てしまっていることが分かります。ということでこの calc.add(3.2, value2: 4.1) を7.3 かどうかということを検証する場合のお話ですけど、これがですね、どこまで誤差を許すのかということを決めたうえでテストを書いてやる必要があります。この 1.0 のところにcalc.add を書いてやって、そしてその後ろに7.3 にしますよと。で、まあ 0.0001 くらいまでの誤差は許しましょうよ、とこのように書いてやると、勿論まだ実装していないので今のところこれでこのテストを実行してもエラーが出ます。 0.0 が返ってきてますよ、とエラーが出ますけどこれで value1 + value2これをリターンするようにしてから、テストをですね もう一度ビルドし直してテストを実行し直すと、このようにしっかりと値が等しいという風に判別されるようになりました。float 値、 double 値、こういった値を比較する時には、かならずこのように誤差を考えたうえでテストを書くようにしてください。このレッスンでは、浮動小数点の値に対してテストを行う方法を説明しました。

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

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

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

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

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

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