Fixies yet another testing framework
Download
Report
Transcript Fixies yet another testing framework
Fixies
yet another testing framework
データ駆動テスト
ノススメ
ユニットテストどうしてますか?
JUnit
入出力のパターンだけ変えてテスト
するのが面倒
Javaスキルが無い人に、テストケー
スのレビューアをお願いしにくい。
データベースアクセスのテストは?
ユニットテストどうしてますか?
DBUnit
エクセルで準備データや期待データを記述
こんな制約が…
1スキーマ1ブック/1テーブル1シート
⇒ブックが大量に増える。
データはDBだけじゃない。
⇒検索条件となる入力パラメータ等は、
結局テストソースに直接書くことに…
xUnitはブラックボックステスト
「入力」と「期待する出力」のバリエーション
⇒フィクスチャ
テストソースのうち、大半はフィクスチャの準備
DBの事前準備
入力パラメータの組み立て
期待値の組み立て、などなど
だから重要なのは、
いかに簡単に、わかりやすい
フィクスチャを用意できるか
テスティングフレームワーク
毎回作ってませんか?
これらの問題を解決する為、独自FWを作ることが
多いようですが、まだまだ問題が山積み
PJ毎に似たようなテスティングフレームワーク
でも、どれも微妙にちがう
使いまわしたいけど、著作権的にグレー過ぎる
毎回作るのマンドクセ
毎回覚えるのマンドクセ
Fixiesを導入すると…
フィクスチャ準備が簡単・簡潔
フィールドインジェクション
コンバータ
Excelにデータを記述
パターン増幅が簡単
業務有識者によるレビューが容易
テストソースはシンプルに、
テストデータこそテストケースの本質
他にもメリットたくさん。
PJ非依存、カスタマイズもかんたん
(テストプログラマにとって)学習コスト低下
(アーキテクトにとって)FW整備工数削減
オープンソース
極めて制限の少ないMITライセンスを採用
改変・納品OKです!
詳しくはこちら
http://sourceforge.jp/projects/opensource/wiki/lic
enses%2FMIT_license
(オープンソースグループ・ジャパンによる日本語参考訳)
For Example…
消費税を計算するメソッド
int calcConsumptionTax(int);
消費税は5%とする
引数が負数の場合、例外発生
引数が10,000より大きい場合、例外発生
消費税が1円未満になる場合は、0円を返却
JUnitだけでやると…
データのバリエーションを変えたいだけなのに、
ケースの数だけ同じような処理を繰り返してしまう
// ケース1
// ケース3
actual =
Calc.calcConsumptionTax(0);
actual =
Calc.calcConsumptionTax(20);
assertEquals(0, actual);
assertEquals(1, actual);
// ケース2
// ケース4
actual =
Calc.calcConsumptionTax(19)
actual =
Calc.calcConsumptionTax(10000)
assertEquals(0, actual);
assertEquals(500, actual);
Fixiesの場合
こんなかんじのデータセットをExcelに記述します。
「本体価格」欄の値が入力、「消費税」の欄が期待する出力と
なります。
本体価格
0
19
20
10000
消費税
0
0
1
500
一目瞭然!
これなら、Javaが分からなくてもレビューできるはず!
テストソースコードは?
@RunWith(DataSetRunner.class)
public class DataSetRunnerSampleTest {
自動的にフィールド
@FromDataSet
インジェクション
public Map<String, Cell> param;
@Test
メソッドは1個だがデータ行数分
public void testNormal() { 呼ばれる(4行なので4回)
int orig = param.get(“本体価格”).parseInt();
int expected = param.get(“消費税”).parseInt();
int actual = Calc.calcConsumptionTax(orig);
assertEquals(expected, actual);
}
データベース初期化
Excelに書いて、便利クラス呼び出すだけ
// 準備データ(DB)
#ID=setUpTable
#TYPE=TABLE
#TABLE=PRODUCT
ID
NAME
PRICE
1
ふらんすぱん 100
2
じゃむぱん
200
@RunWith(BookRunner.class)
public class SampleProductTest {
// シートから取得
@FromDataSet(converter
= ITableConverter.class)
public ITable setUpTable;
// 便利クラス
@FromFactory
public DBSupport dbSupport;
@Before
public void setUp() {
// データベースの初期化
dbSupport.setUpDB(
setUpTable);
}
データベース内容確認
Excelに書いて、便利クラス呼び出すだけ
// 期待する結果(DB)
#ID=expectedTable
#TYPE=TABLE
#TABLE=PRODUCT
ID
NAME
PRICE
1
ふらんすぱん 100
2
じゃむぱん
400
じゃむぱんの価格が
更新された
@RunWith(BookRunner.class)
public class SampleProductTest {
// シートから取得
@FromDataSet(converter
= ITableConverter.class)
public ITable expectedTable;
// 便利クラス
@FromFactory
public DBSupport dbSupport;
@After
public void tearDown() {
// データベース内容確認
dbSupport.assertContains(
expectedTable);
}
PJ固有のJavaオブジェクト
フラットなJavaBeanならデフォルト対応
Person
#ID=MyBean
id
1
name
age
山田太郎 25
自動変換
id = 1
name = “山田太郎”
age=25
setId(int)
setName(String)
setAge(int)
※複雑なオブジェクトでもPOIから作るより相当楽チン
絶賛ダウンロード中!
今すぐアクセス!
http://code.google.com/p/fixies/
Ch-Check It Out!(SVN)
http://fixies.googlecode.com/svn/trunk/