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/