くりにっき

ドリコムのプリキュアの人です

Paraductでお手軽マトリクステスト #SWTestAdvent

これは

ソフトウェアテストあどべんとかれんだー2014 - connpass の4日目です

3日目

@ さんの選択的シンボリック実行ツールS2E | 一生あとで読んでろ でした

4日目:Paraductでお手軽マトリクステスト

渋谷Ruby会議01でParaductをエクストリームリリースしました #428rk01 - くりにっき で書いたことの再編です

Paraductとは?

Paraduct = parallel + parameterize + product(掛け算の積)

複数のパラメータを組み合わせて平行してテストを実行するためのライブラリです

Jenkinsで複数のパラメータを組み合わせたマトリクステストしようとすると組み合わせの個数分だけジョブを作る必要があるので、Travis CI みたいにyamlでマトリクステストを実行できます。

Jenkinsだと

f:id:sue445:20141109013852p:plain

Paraductだと

script: ./build.sh
work_dir: ./tmp/paraduct_workspace
variables:
  ruby:
    - 2.0.0-p451
    - 2.1.3
  gemfile:
    - rails3_2.gemfile
    - rails4_0.gemfile
    - rails4_1.gemfile
max_threads: 10
rsync_option:
  exclude_from: .paraduct_rsync_exclude.txt
  • variables が組み合わせたいパラメータ
    • export RUBY=2.0.0-p451 GEMFILE=rails3_2.gemfile ./build.sh のような形式で実行されます
    • yaml上の変数名は小文字ですが、スクリプト実行時に大文字になるのは仕様です。(yamlで名前を大文字にするのは違和感があるし、シェルの環境変数名が小文字なのも違和感があるので)

アーキテクチャ

f:id:sue445:20141109014439p:plain

  1. テストの組み合わせの個数分のディレクトリにrsyncでコピーする
  2. コピーしたくないファイルは.paraduct_rsync_exclude.txt で設定
  3. 各ディレクトリでテストを同時に実行
  4. テストが全部終わるまで待つ

インストール方法

gem install paraduct
  • ruby 1.9以降で動きます
  • paraductの実行に必要なのがrubyなだけで、シェルで実行できるテストであれば何でもマトリクステストできます
    • paraductはパラメータを組み合わせてシェルを並列実行するためのラッパー

Paraductのメリット

  • TravisCI以外でもマトリクステストを簡単にできるようになる
  • gem installできる環境であればどこでも動く
    • 実際にJenkinsやCircle CIでも動いてます
    • ただ、apt-getやyumでインストールできるrubyは1.8系なことがあるorz

Paraductのデメリット

  • ローカルで実行するのでCPUやメモリのリソースを喰う
    • テストスクリプト内からリモートサーバに接続しにいくようにすれば解決
  • 排他制御も面倒
    • 複数のテストで同一のDBを使うと排他ロックがかかるのでパラメータで動的にDB名を変える必要がある
  • rbenv と相性が悪い
    • Jenkins rbenv pluginを有効にしてるとテストスクリプトの中でrbenv使ってもrubyのバージョンがちゃんと切り替わらないことがある
  • 作ったばかりなので発展途上

Paradact を使う時のコツ

  1. スクリプトファイル1つでビルド出来るようにする
  2. スクリプトにパラメータを渡せるようにする(マトリクステスト用のビルド)
  3. パラメータを渡さなくても動くようにする(普通のビルド)

Railsアプリをビルドする時のサンプルスクリプト

5日目

id:igrep さんの igreque :: Info -> より「普通に」書くためのTest Doubleライブラリ「crispy」 #ruby #SWTestAdvent です