Testほぼ発売と同時に買ったにもかかわらず、ずっと積読本になっていた「JUnit実践入門」をようやく読んでいます。ここ最近で、バグによるリリーストラブルがあったり、単体レベルのバグがQAでボロボロ出てきたりということがあったため、改めてテストコードの品質(テストとしての品質はもちろん、可読性やメンテナンス性も含めて)について考えていたのですが...もやもやしてたこと、ほとんど書いてあるじゃん!ぐぅ、もっと早く読んでいればよかった。いう問題が見られます。(そうでないものも多くあります)自分なりに原因分析をすると、以下のような原因が見られます。テストメソッド名に意味がなく、コメントも無いので、何をするテストなのかよくわからない(最近は結構改善されてきた)テストメソッドが長く、どれが前処理で、どれが実行で、どれが検証なのか、一目でわかりにくいものがあるプロダクトの特性上、メソッドの入力値や期待値が巨大なオブジェクトとなることが多く、別のファイルで定義されたjsonやXMLを読み込んでオブジェクトを用意している。思っていたところ、「JUnit実践入門」のPart1(第1章〜第3章)と第7章を読んだ時点でかなりの収穫がありましたので、そちらを中心にレポートを書かせていただきます。Setup(前処理)、Execute(実行)、Verify(検証)、TearDown(後処理)を明確にする第2章の冒頭に、以下のようなことが書かれています。ソフトウェア開発によるテストの定義は「【ある条件下】において【ソフトウェアの振る舞いを記録】し、その記録が【期待される結果となっていることを検証】するプロセス」。振る舞いと期待値を比較して「検証」(必要なら)後処理。これがテストコード上できれいに表現できていないと、可読性の低いテストコードになってしまう可能性があります。いうコマンドを各テストメソッドに書く方法があるそうです。これはいっそテストコードのコーディングルールにしてしまうのもありだと思いました。適切な方法でテストフィクスチャをセットアップするそもそもテストメソッドの行数が多くなければ、前述のようにコメントを入れたりする必要もないのですが、中には10行を超えるようなテストメソッドもあります。条件の定義、実行、検証しかしていないのになぜこんなに長くなるかというと、メソッドの入力値や期待値に使われるオブジェクトを作るのに手間がかかっているのです。テストフィクスチャ」に書かれています。Fixtures)とは、入力するデータ、テスト実行のための予備操作、データベースなどの外部リソース、検証に必要なデータなど、テストに必要なデータやオブジェクトの状態のことを言うそうです。ユニットテストの事前準備フェーズでは、これらのフィクスチャをセットする必要がありますが、これがなかなか大変で、テストコードが長くなってしまう傾向にあるようです。第7章では、用意するテストフィクスチャの複雑さや出現の仕方によって、複数のセットアップ方法を紹介しています。インラインセットアップテストメソッド内でSetterなどを使ってオブジェクトを用意する方法です。セットアップの量が少ないのであれば、テストメソッドの可読性が良くなるメリットがあります。区別がつきにくくなり、一気に読みにくくなります。暗黙的セットアップBeforeアノテーションを使ってセットアップを共通化する方法です。この方法によりテストメソッドはテストの実行と検証が中心となるため、何をテストしようとしているのか明確になります。(本には書かれていませんが、修正が必要になった時の修正が1回で済むようになるのも大きいと思います)欠点は、テストクラス内の各テストケース固有の事前処理は記述できないことです。生成メソッドでのセットアップ複数のテストクラスで共通に使われる事前処理を、独立したメソッドにまとめる手法です。暗黙的セットアップに比べて、使いたい箇所で使えるメリットがあります。staticで作るのがいいそうです。外部リソースからのセットアップ生成メソッドの利用はテストメソッドの可読性は上がるのですが、結局生成メソッド自身は読みにくいコードのままになることが多いです。いうことで、コードでセットするのを諦めて外のファイルにデータ定義してしまったのがこの方法です。データを記述したファイルを別で用意し、それを読み込むことでセットアップする方法です。筆者のオススメはYAMLとのこと。シンプルながらxmlと同等の記述力があるとのことです。フィクスチャがリスト構造で、かつデータが多いならcsvがオススメとのこと。この方法のメリットは、データがJavaでゴリゴリ書くのに比べて読みやすいこと。デメリットは、テストデータが、Javaでないファイルに置かれるため、テストコードを追いずらくなることです。前述の通り、今、私の周辺ではこの「外部リソースからのセットアップ」をメインで使っていまして、まさにこのデメリットに悩んでいるところです。外に記述されたデータそのものは読みやすいのですが、IDEでそのファイルを開くのがほんの少し面倒なんですね。本文では、最後に、Javaのプログラム内で、setterなどを使わずにオブジェクトを定義する方法を二つ紹介しています。その中でぜひ試して見たいと思ったのがGroovyを使った方法。(firstName:"Martin",lastName:"Fowler",),)}こんな風に、まるでJsonのように記述できるそうで、これはぜひ試してみたいと思いました。#gunmawebGunma.webさんの勉強会に参加してきました。「データしか持たないデータクラスは作らない...こちらの本を読んででのレポートです。試してみたのだけど結論から言うと、思ってたのとは違ったかも。読者になる検索リンクはてなブログブログをはじめる週刊はてなブログはてなブログPro最新記事awkで特定の列を除外して出力するWindows10にOracleをインストールしようとしたらありがちな罠にハマった古いプログラムからも学ぶことがある...と思う。#rtechconf月別アーカイブ参加グループプログラミングインターネットテクノロジーはてなブログをはじめよう!taichiwさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。