(第一回)JCUnitで2次方程式を解くプログラムをテストする。blogJCUnitの開発日誌(ログ)です。"その時点での"JCUnit作者の理解や考え、開発状況を日本語で書きます。この広告は、90日以上更新していないブログに表示しています。2016-03-09(第一回)JCUnitで2次方程式を解くプログラムをテストする。2次方程式を解くプログラムをテスト今回からしばらく、JCUnitの使い方を解説するために簡単なプログラムをテストしてみたいと思う。例題としてQuadraticEquationSolver(2次方程式ソルバー)を取り上げる。a,b,cの三つの入力をとり、これらを係数とする2次方程式を解の公式を使って解く他愛もないプログラムだ。準備0.6.0リリース。参考に、JCUnitをDependencyに持つMavenプロジェクトを用意して欲しい。SUT(テスト対象ソフトウェアについて)Javaで2次方程式を解くプログラムを作るとしたらどんなものだろうか。大体、こんな感じになるのではないか。}}2次方程式を解の公式を使って解いているだけの単純なプログラムだ。このプログラムをこのまま使おうとすると、色々と問題に気づくはずだ。a、b、cの値によっては解が虚数になったり、そもそも2次方程式にならなかったりする。これだけのプログラムを作るだけでも、プログラマは多くの明示的なあるいは暗黙の仮定を置いている。いう場合、ソフトウェアエンジニアはどう振る舞うべきか?こうした数々の仮定の明確化は能力の見せ所であろう。0の場合には一次方程式の解をもとめるか?あるいは例外を送出するか?この例では係数であるa、b、cがintだが、そもそもこれらは整数で良いのか?等々。このプログラムがこうした入力に対して示すことであろう「不自然な挙動」はバグと言えるか?バグが定義された仕様と実際の挙動の乖離であるとするならば、仕様がなにも定義されていない以上、どんなへんてこな挙動であろうと「設計通り」と言い張ってみてもよいのだが、あまり生産的な態度でもなかろうし、何より見苦しいのでやめて欲しい。最初のテストプログラムが、仕様がないならないなりにでもなにかしらテストっぽいことをしてみないと、仕事は進まない。言語化されていない暗黙の仮定を白日の下に晒す。それは思うにテストの重要な価値ではなかろうか。JCUnitでこのプログラムをテストするなら、おおよそこういう風になる。cに様々な値を自動的に代入してからsolveEquationテストメソッドを実行する。assertThatとかis(CoreMatchersクラスのメソッドがstaticインポートされている)とかは、Assert.assertEqualsとおよそ同じ意味だ。solveEquationメソッドは、QuadraticEquationSolver#solveメソッドが出力した値を実際に二次方程式に代入して計算し、その結果が0になるかを確かめる。JCUnitがデフォルトでa、b、cに代入するのは以下の7つの値のうちの一つだ。JCUnitのデフォルトの挙動では任意の2つの係数(因子)の組み合わせ(aとb、bとc、cとa)に関して可能な値(水準)の組み合わせを網羅するテストスイートを生成する。{a=100,b=-100}、{b=-100,c=1}、{c=1,a=100}のそれぞれはJCUnitが生成するテストスイートによって必ず網羅される。{a=100,b=-100,c=1}が同時に網羅されるかどうかについては保証しない。このような網羅性を担保するテストスイートは無数にある。JCUnitが生成するものは53件のテストケースからなるものだ。7水準の因子が2つあれば、7*7で49通りは必要になる。このテストは3因子使われているにも拘らず、わずかな増加しか見られない。7水準で125通りになる。19件=121件)と大差がない。100因子だとJCUnitは18通りのテストケースしか作らない。それでいて上述した特性を満たすテストスイートになるわけだから、興味深いことではなかろうか。(ただし、JCUnitが生成するテストスイートが一番小さいわけではない。PICTなどは同じ性質を満たしながらもっと小さいテストスイートを生成する)もう一点、JCUnitの特性で注意を促したいことがある。それは、同じ因子と同じ水準を使った場合、常に同じテストスイートを生成することだ。テスト対象製品の挙動自体が不安定で同じ条件のテストが成功したり失敗したりするのはある意味やむを得ない。内部的にHashSetを使えば、その要素の列挙において順番は不定になる。このような場合には「このバグはこのテストケース107番をおよそ10回に1回失敗させる。修正を行い1,000回同じ条件のテストを行ったところ1度も再現しなくなった」という決着のさせ方をすることになる。したら「テストケース107番は常に{a=100,b=-1,c=-100}である」のように言えないと非常に不便だ。テスト対象製品自体の出力が、なにかしらの理由で固定的に予測できない場合はあり得る。我々がHashSetクラスを自分自身でテストするときなどがそうだ。テスティングフレームワーク側の事情でテストスイートが不定になるのは避けるべきだと、私は考えるのだ。先程のテストクラスを実行するとどうなるか?53件のテスケースが生成され、39件も失敗するのだ。これもなかなか興味深いことではなかろうか。次回以降、ステップ・バイ・ステップでJCUnitの使用方法を解説していきたい。その過程でテスト対象であるQuadraticEquationSolverのデバッグ、仕様の精緻化を進めていくことになる。07:40(第一回)JCUnitで2次方程式を解くプログラムをテストする。2017でJCUnitの発表をすることになりました。joinedプログラミングはてなブログをはじめよう!dakusuiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。