くりにっき

フルスタックキュアエンジニアです

Twitter API 1.1でも CI したい

以前LTでしゃべった内容をブログ用に再構成してみます

冒頭に結論

Twitter API 1.1対応は廃止されたAPIだけ対応してもダメ

ことの発端

AZusaar!!のテストにて

  • 1テストケースずつ -> GREEN
  • テストスイート一括実行 -> RED

という事象が発生

WHY ?

RateLimitに引っかかってた(;´Д`)

一度に同じAPIを大量に使うと規制される&Jenkinsのビルドも通らないorz

解決策

Groovy基礎勉強会 で @ さんに教えてもらったBetamaxを使った。

Betamaxって何よ?

テストケース中のhttp通信を全部yamlに記録するライブラリ。groovyで作られているので当然Javaからでも使えます

AZusaar!!でやったこと

pom.xml

betamaxとgroovyを追加

<project>
  <dependencies>
    <dependency>
        <groupId>co.freeside</groupId>
        <artifactId>betamax</artifactId>
        <version>1.1.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy</artifactId>
        <version>2.1.2</version>
        <scope>test</scope>
    </dependency>
  </dependencies>
</project>

テストケース

public class SomeTest{
    @Rule
    public Recorder recorder = new Recorder();

    @Betamax(tape="SomeTest#yourTest", match={MatchRule.uri})
    @Test
    public void yourTest() throws Exception {
        // do something
    }
}
  • テストメソッド単位でtapeの名前を一意にした
  • matchはyamlを読み込む時の条件(上記の例ならuriが一致したらそのyamlを読み込む)
  • 初回のテスト実行時にsrc/test/resources/betamax/tapesにyamlが保存されるので2回目以降はそれが参照される(READ_WRITEモード)
    • READ_WRITEモードの他にもWRITE_ONLYモードやREAD_ONLYモードもある
    • yamlをcommitしておけばjenkinsでも同じ結果を返せる

参考リンク

書いていて気になった点

  • テストクラスごとにRecorderやBetamaxをつけるのが冗長
    • テストケース全体の振る舞い (rspecにおけるspec_helper的なもの) を定義できればもっとシンプルになった。。。
    • Groovyでテストを書いていたらRecorderを継承した新しいRecorderを使えばBetamaxアノテーション自体不要になりそう
      • ただしそこまでやろうとするとテストのためのテストが必要になるのでちょっと重い
  • tape名にクラス名とメソッド名を書く方式だとTheoriesのようなパラメタライズテストに対応できない
    • Theoriesを1つだけだったのでそこは割りきってBetamaxを使わないようにした
  • RSpecに慣れすぎてJUnit面倒くさい
  • Javaだけでやるのが面倒くさい部分でGroovyを利用することでさっくり解決できるのは素敵。まさに万能接着剤!

重要なことなのでもう一度

Twitter API 1.1対応は廃止されたAPIだけでなくRateLimitも考慮しよう

参考書籍

API 1.1対応マダ-?

Twitter API ポケットリファレンス (POCKET REFERENCE)

Twitter API ポケットリファレンス (POCKET REFERENCE)

Ruleの使い方とか

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)