2012年1月13日金曜日

Slim3+Cross Group TransactionをUnit Testで使う #gaeja

昨年末から何度か「Slim3でCross Group Transaction(所謂XG)をUnit Testで使う時どうするの」的な話を見かけつつ、反応できていなかったので書いておきます。

まず「UnitTest環境でHRDを有効にする」「(Slim3で)XGを使う」のふたつに分けて考える必要があります。

UnitTest環境でHRDを有効にする

Slim3は1.0.15くらいからGoogle App Engine SDKが提供するUnitTestの仕組みを併用できるようになっています。mavenを使っている方は、最新のslim3-archetype-pluginを使ってプロジェクトを生成した場合にappengine-testing等のモジュールが依存に追加されている事に気づいた人もおられるんじゃないでしょうか。

Slim3のAppEngineTestCaseを継承したテストクラスの場合は、SDKが提供するUnit Testの仕組みを併用して、setUp()/tearDown()を次のようにするとHRDが有効になります。

LocalServiceTestHelper helper;


@Override
public void setUp() throws Exception {
  LocalDatastoreServiceTestConfig dsConfig =
    new LocalDatastoreServiceTestConfig()
      .setDefaultHighRepJobPolicyUnappliedJobPercentage(0.01f);
  helper = new LocalServiceTestHelper(dsConfig);
  helper.setUp();
  super.setUp();
}

@Override
public void tearDown() throws Exception {
  super.tearDown();
  helper.tearDown();
}

Slim3でXGを有効にする

Transactionオブジェクトの構築方法によります。

Slim3のDatastore.beginTransaction()を使ってTransactionオブジェクトを作っている場合は、システムプロパティにslim3.useXGTX=trueが指定されている必要があります。Server環境(Productionサーバ、開発サーバ)で起動している場合はシステムプロパティはappengine-web.xmlでそれを指定すれば良いですが、Unit Testの際にはappengine-web.xmlが読み込まれませんので、setUp()の際にSystem.setProperty("slim3.useXGTX", "true");とする必要があります。

Slim3のDatastore.beginTransaction()を使わず、Low Level APIを使ってDatastoreServiceFactory.getDatastoreService().beginTransaction(TransactionOptions.Builder.withXG(true));としてTransactionオブジェクトを作っている場合はSlim3のシステムプロパティを気にする必要はありません。Slim3が使用するTransactionオブジェクトはLow Level APIで使用するTransactionオブジェクトと同じクラスですので、Low Level APIとの併用も可能です。

私としては、slim3.useXGTX=trueを指定せずSlim3のXGは使えなくしておき、XGを使うときはLow Level APIを使ってTransactionオブジェクトを作成する方が好みです。XGを使用している事がコードから明確に見て取れるという点が嬉しいです。

コメントを投稿