読書会(JUnit実践入門)第4回議事録

[ 戻る ]


===============================
「JUnit実践入門」を読む会 第4回
===============================

.. csv-table:: 開催概要

  "日時", "2013/6/22(土) 10:00-17:00"
  "場所", "川崎市教育文化会館 第3会議室"
  "出席者", "高橋(徹)、高橋(智)、岩室(記)、田辺、中澤、吉本、北郷、山田、門脇、高久、村山、遠藤、曽我部、松永"

10章 カテゴリ化テスト テストケースのグループ化
==============================================

10.1 スローテスト問題
---------------------

* 「テストの実行環境を強化する」
** 極めて正論ではあるが、現実には何故か買えない。
*** 稟議を回すだけで人件費がマシン代を超える。
*** プロジェクト開始前に散々説得して、ようやく導入される。
*** やばいと思ったときは既に手遅れのことが多い。

10.2 カテゴリ化テスト問題
-------------------------

* @IncludeCategory, @ExcludeCategoryには複数のカテゴリが書けるか?
** 書けると思われるが、要確認。
* @IncludeCategory, @ExcludeCategory、どちらが優先される? また一方だけ書いたときは?
* いちいち @SuiteClasses 等を記述するのは大変。自動的に収集できないのか?
** Javaにはパッケージ配下のクラス一覧を取得する、標準的に機能がない。
** 動的にクラスを生成することもできるので、Javaの言語仕様として、そのクラスが実在するかどうかはロードが完了しない限りわからない。
** 単にファイルシステムやjarの中から拾えるだけでも9割がた救えると思われるのだが。

10.3 カテゴリ化テストのパターン
-------------------------------

* カテゴリの分類を行うのが大変。

10.4 ビルドツールによるカテゴリ化テスト
---------------------------------------

* どのようなときにカテゴリの分類を行うのか?
** 遅くなったときに考えるので良いのではないか。

11章 テストダブル テスタビリティと、モック/スタブによるテスト
==============================================================

11.1 テスタビリティを高めるリファクタリング
-------------------------------------------

p.174 リファクタリング本の訳者は「児玉『公』信」

* リスト11.4はリスト11.2と違ってsameInstanceが追加されているのは何故か?
** 確実にcurrentと同じものが返ってくることが期待されているから?
* いちいちテスト対象毎にFactoryの生成を考慮させるようにするこてぁ難しいのではないか?

11.2 テストダブルとは?
----------------------

* リスト11.15のような記述には、TestNGから移植されたDataProviderを使うのが有用。( https://github.com/TNG/junit-dataprovider )
** 境界値のテストにも有用。テストが正常ケースと異常ケースの2つで済む。
* 本題ではないが、いくら例とは言えUserNotFoundExceptionで「connection error」というのは、例外設計として問題があるのではないか。
* 例外のgetLocalizedMessageは、Webアプリケーションのように1つのアプリケーションで利用者の言語が1つとは限らないケースには役に立たない?
* p.187リスト11.19で、AtomicBooleanが使われているのはミュータブルなbooleanが欲しかっただけで、Atomicである必要はないようだ。
* SpyLoggerはLoggerをextendsしているのに、何故baseを必要とするのか?
** 本来のLoggerのinfoをwrapしたいだけのため。
* (java.util.logging.)Loggerクラスはinterfaceの方が良かった。(※slf4jの場合はインターフェース)
** しかし、interfaceだとラッパークラスを作るのに実装が面倒。
*** Java8ならばinterfaceのdefault実装がある。
* ユニットテストで対応しきれないようなテストはどうやって行うか? 例:
** 外部連携で特定のケースでコネクションが切れる。
** 特定のケースだけHTTPステータスを変更したい。
* ⇒ ユニットテスト以外で対応している。
* Byteman ( https://www.jboss.org/byteman ) で書き換えてテストを実現している。
* GUIテストや相互作用系のテストは大変。

11.3 Mockitoによるモックオブジェクト
------------------------------------

* 本文では、モックとスタブをちゃんと区別しようとしているように思える。
** どちらでもいいのでは?
** 「ダミー」ではだめか?
* リスト11.24のwhenはどうやってstub.get(0)が呼ばれていることを判断しているのか? nullしか受けとることはできないはず。
** stub.get(0)の中でトレース情報を保存して、whenはそれを見ているのではないか? ⇒ 宿題
* anyInt()の場合は?
** 上記と同様、anyInt()の中でその情報を保存しておけば、anyInt()が呼ばれていたか否かで判定可能なのでは。
* 英語に近いDSLは「わかりやすい」のか?
** そうは思えない、という意見が多数。
** jmockit ( https://code.google.com/p/jmockit/ ) (Mockitoとは別物) の方がわかりやすい。

12章 データベースのテスト テストコードで外部システムを制御する
==============================================================

12.1 データベースに依存するユニットテスト
-----------------------------------------

* ORマッパは何を使っているか?
** S2JDBC
** S2Dao
** Hibernate
** ActiveRecord (Javaではないが)
** PHPだとバージョン違いで前のものがつかえなくなることがよくある
* DBマイグレーションはどうしている?
** 手動。
** Hibernateだと自動的にマイグレーションしてくれる機能がある。
** データベース間のスキーマに差異があることを判定してくれるツールがある。

12.2 ユニットテストの自動化とH2 Database
----------------------------------------

* 一旦付録Cへ。

付録C H2 Databaseのセットアップと使い方
=======================================

C.1 H2 Databaseの特徴
---------------------

* ライセンスは、以下の通り:
** H2 is dual licensed and available under a modified version of the MPL 1.1 (Mozilla Public License) or under the (unmodified) EPL 1.0 (Eclipse Public License).

C.2 H2 Databaseのセットアップ
-----------------------------

C.3 H2 Databaseの起動と停止
---------------------------

* 「組み込みモード」の起動方法は正しくない?
** 本文の方法だと、同一プロセス内で「サーバモード (Server Mode)」で起動しているだけで、「組み込みモード (Embedded Mode)」ではない。
** インプロセスで読み書きする場合はJNDI経由で直接ファイルを指定する。
** インプロセスで読み書きしつつ、サーバーとしても受け付ける「混合モード (Mixed Mode)」もある。( http://www.h2database.com/html/features.html#connection_modes )

* 元のページに復帰。

* create schema の「schema」って何?
** databaseとtableとの間にある名前空間。(MySQLには無い?)

12.3 DbUnitによるデータベースのテスト
-------------------------------------

* サンプルコードとは言え、SQLインジェクションがあるのは如何なものか? プレースホルダで例題を作るのはそんなに大変?
* このサンプルコードはConnectionを閉じていないのではないか? ⇒ ユニットテストだから、テストが終わればプロセスが終了してConnectionも閉じられる。
* IDatabaseConnectionて何? ⇒ DbUnitのクラス?
* 実際問題、DBを上げたり下げたりできるか?
** ケースバイケース。
** 適用範囲はそれほど広くはないのではないか。
** fixtureが大量にあると、このようなやり方はできない。
** ユニットテストのコード内ではなく、mvn testの前にDBをリセットしている。
* actualが、リスト12.7と12.9で取得方法も型も異なっている。expectedは同じなのに何故? ⇒ 宿題
** ダウンロードしてきたサンプルコードだと12.7もITableらしい。12.7がおかしい?
* プログラムとしては間違っていない(エラーは出ない)が、以下のtypoあり。
** p.216, 217, 218 UserDaoDbUNitTeser ⇒ UserDaoDbUnitTester

次回
====

* p.219「第13章 Androidのテスト」から。


[ 戻る ]