単純な処理の単体テストが重要

先日、appengine SDKが1.3.8にアップデートしたのですが、ローカル環境のSDKを1.3.8にした所、EtupirkaCMSの単体テストが1/3くらい失敗するようになりました。

原因の1つはプロトコルバッファを使って画像加工の部分を単体テスト用に細工しているところで、APIの仕様が変わった事。これはgoogleAPIを使っている以上は仕方ないです。ですが、もう1つの(ほとんどの)原因はカウント系の挙動がオカシイことです(テスト環境のみだと思われます)。
具体的には slim3 1.0.5の場合、

  • Kindを指定したcount
  • countQuickly

の2つが常にゼロを返すのです。
appengine-testing.jarとappengine-stub.jarが最新版でなかったのが原因でした。他のSDKのライブラリはPluginで指定できますが、これらのテスト用のjarは手動管理なのを忘れていたです・・・

現時点では正式リリースされているわけではないですし、幾らでも変更のリスクはあります。ですが、簡単なAPIでも単体テストを作っておくことは非常に重要です、特にGAEの場合は。
例えばあるあるモデルの件数を取得するサービスメソッドは1行で済みます。

public int count() {
  return Datastore.query(ModelMeta.get()).count();
}

テストコードも数行です。

@Test
public int count() {
  Datastore.put(newModel(1), newModel(2));
  assertThat(new Service().count(), is(2));
}
@Test
public int count_empty() {
  assertThat(new Service().count(), is(0));
}

こんな単純なメソッドの単体テストは不要とも感じます。しかし、ほんの数分だけ費やして単体テストを書いておけば、GAEの挙動が変わったことを直ぐに検知できるわけです。

というわけで、単体テストは重要というのは当然な事なんですが、GAEのようなサービスを使う場合にはそれがより重要になっていくという話でした。