JiemamyとSAStruts+S2JDBCでアジャイルっぽい何かやってみた

ストーリーとしては

  1. JiemamyでER図を作成
  2. DB構築
  3. S2JDBC-GENでEntityを生成

これを、テストを書きながらイテレーションして実行していくという感じで、環境はeclipse3.4、postgres8.3といったところです。

サンプルはDoltengでおなじみのempテーブルをもとにやってみた。

JiemamyでER図を作成

なにはともあれ、まずER図を書きます。
f:id:yamkazu:20090509131822j:image

データセットも突っ込んでおきます。
f:id:yamkazu:20090509132348j:image

idをserial型で作ってしまったのですが、現状jiemamyが生成するinsert文はこのidを含んだinsert文を生成するので、postgresql内部でシーケンスがインクリメントされず1の初期値のままになってしまう。id:daisuke_mに相談したら終了スクリプトで対応しては?というこで、終わりにsetvalを実行することで対処。
f:id:yamkazu:20090509131820j:image

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はこんな感じ。
f:id:yamkazu:20090509131824j:image
f:id:yamkazu:20090509131823j:image

s2junit4は今回初めて使ったのですが、テストの実行後にトランザクションを自動でロールバックできるみたい。これは便利。テスト前にjiemamyでdbを初期化して、その状態に対しs2junt4でテストケースを書いていけばかなり使いやすそうで、リズムよく開発できそうです。