JiemamyとSAStruts+S2JDBCでアジャイルっぽい何かやってみた
ストーリーとしては
- JiemamyでER図を作成
- DB構築
- S2JDBC-GENでEntityを生成
これを、テストを書きながらイテレーションして実行していくという感じで、環境はeclipse3.4、postgres8.3といったところです。
サンプルはDoltengでおなじみのempテーブルをもとにやってみた。
JiemamyでER図を作成
データセットも突っ込んでおきます。
idをserial型で作ってしまったのですが、現状jiemamyが生成するinsert文はこのidを含んだinsert文を生成するので、postgresql内部でシーケンスがインクリメントされず1の初期値のままになってしまう。id:daisuke_mに相談したら終了スクリプトで対応しては?というこで、終わりにsetvalを実行することで対処。
DBを構築
mavenで実行したいのでpom.xmlをセットアップします。
このあたりをhttp://svn.sourceforge.jp/svnroot/jiemamy/metis/jiemamy-tutorial/trunk/参考にする。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> ... <build> ... <plugins> <plugin> <!-- jiemamyプラグインの設定 --> <!-- cleanゴール = DB上に存在するエンティティ等を全削除する --> <!-- jiemamyゴール = データファイルからSQLを生成する --> <groupId>org.jiemamy</groupId> <artifactId>maven-jiemamy-plugin</artifactId> <configuration> <!-- jiemamy:clean用設定 --> <username>${database.username}</username> <password>${database.password}</password> <driver>${database.driver}</driver> <uri>${database.uri}</uri> <!-- jiemamy:jiemamy用設定 --> <inputFile>./database/jiemamy.jer</inputFile> <parameter> <outputFile>./target/jiemamy.sql</outputFile> <drop>false</drop> <schema>false</schema> <overwrite>true</overwrite> <dataSetIndex>0</dataSetIndex> </parameter> </configuration> <executions> <execution> <id>create-sql</id> <phase>process-test-resources</phase> <goals> <goal>clean</goal> <goal>jiemamy</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.jiemamy</groupId> <artifactId>jiemamy-dialect-postgresql</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>8.3-603.jdbc3</version> </dependency> </dependencies> </plugin> <plugin> <!-- sqlプラグインの設定(生成されたSQLを実行) --> <groupId>org.codehaus.mojo</groupId> <artifactId>sql-maven-plugin</artifactId> <configuration> <autocommit>true</autocommit> <srcFiles> <srcFile>./target/jiemamy.sql</srcFile> </srcFiles> <username>${database.username}</username> <password>${database.password}</password> <settingsKeys>sensibleKey</settingsKeys> <driver>${database.driver}</driver> <url>${database.uri}</url> <skip>${maven.test.skip}</skip> </configuration> <executions> <execution> <id>create-db</id> <phase>process-test-resources</phase> <goals> <goal>execute</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>8.3-603.jdbc3</version> </dependency> </dependencies> </plugin> </plugins> </build> <pluginRepositories> <pluginRepository> <id>jiemamy</id> <name>Jiemamy</name> <url>http://maven.jiemamy.org/release</url> </pluginRepository> </pluginRepositories> ... <properties> <jetty.version>6.1.4</jetty.version> <database.username>postgres</database.username> <database.password>postgres</database.password> <database.driver>org.postgresql.Driver</database.driver> <database.uri>jdbc:postgresql://localhost:5432/demo</database.uri> </properties> </project>
mavenのtestフェーズの前にDBを初期化したいので、executionでprocess-test-resourcesを指定してみました。
こで準備は完了。mavenで
mvn package
でjiemamy:clean、jiemamy:jiemamy、sql:executeがテストの前に実行される。
※事前にdemoという名前のdbは作成済み
S2JDBC-GENでEntityを生成
eclipseからさくっとantを実行してentityを作る。
後はイテレーション
テストを書きながら
mvn package
を実行していきます。
テストはs2junit4を使ってやってみました。こんな感じです。
@RunWith(Seasar2.class) public class EmpServiceTest { protected TestContext ctx; protected EmpService empService; @Test public void testFindById() { result = empService.findById((long) 2); assertEquals(ctx.getExpected(), result); } @Test public void testInsert() throws ParseException { Emp emp = new Emp(); emp.empNo = 7952; emp.empName = "DAM"; emp.mgrId = 6; emp.hiredate = DateFormat.getDateInstance().parse("1981/05/14"); emp.sal = new BigDecimal(2100.00); emp.deptId = 1; emp.versionNo = 1; empService.insert(emp); assertEquals(ctx.getExpected(), empService.findAll()); } }
期待値のxmlはこんな感じ。
s2junit4は今回初めて使ったのですが、テストの実行後にトランザクションを自動でロールバックできるみたい。これは便利。テスト前にjiemamyでdbを初期化して、その状態に対しs2junt4でテストケースを書いていけばかなり使いやすそうで、リズムよく開発できそうです。