あなたのコードに ハナマルを。- 〜...
TRANSCRIPT
あなたのコードに ハナマルを。 〜 ぼっち開発でも出来る
プラグインテスト初めの一歩(仮)
2016.11.26 redmine.tokyo 第11回勉強会
たかの あきこ (@akiko_pusu)
さいきん目撃したTWEET画像。
あわわわわ……拙い事例ですが、
Redmineの普及を願っておはなしします。
たかのあきこ @akiko_pusu
おはなしするひと。
20代後半 (16進ってことで)
エンジニア35歳説なにそれ?
産休まえにRedmineと出会う
Redmine.tokyo ロゴ描きました
趣味でプラグイン書いてます
色々あって渋谷で働いてます
ココナラって会社です!
ごめんなさい今回は時間なくてイラストなしです ><
自己紹介はさっくりと…
おはなしすること。
なぜやるの? なにからはじめればいい? どうやってるの? こんなものつかってます ぼっち開発でも、コードレビュー! やってみての気づきとか まとめ & 時間があったら参考画面
4
なぜやるの?
問い合わせが来る! インストールできないです マイグレーションできないです このプラグインとこのプラグイン入れてるんだけどエラーになっちゃいます…
5
プラグイン公開しました! でも…
過去のクレーム(汗チケットの山…
— by @akiko_pusu
“ たくさんの Redmineかんりしゃさんを
こまらせたいわけでは ないのです
べんりにつかってほしい だけなんです ”
はじまりは、ここから。
マイグレーションが通るかどうか プラグインを配置した状態でのマイグレーションの確認 ロールバックの確認も!
8
テストコードがなくても。 まずはこれだけは。
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=test
$ bundle exec rake redmine:plugins:migrate \ NAME=${PLUGIN_NAME} VERSION=0 RAILS_ENV=test
なにからはじめればいい?
どうやってやるの?
まずRedmine本体を取得 本体のマイグレーションする プラグインを配置してマイグレーションする Redmineのベースディレクトリからプラグイン用のテストを走らせる
9
プラグインのテストには Redmine本体が必要です。
前田さんからの取れ立て情報!
“Redmine本体に付属の テストも通るか
ためしてみよう!”
ありがとうございます さっそくCiのステップに入れます!
※ 20161127:追記このスライドアップ後に手元のMacで 試したら素のRedmineでも失敗しました…rake ci だと想定される全てのSCMプトロコル、DBに対するテストを通しで行うようです(?)。そこまでの環境を用意するのは大変なので、失敗しても参考情報程度がいいのかも。
基本のテストは?
$REDMINE_ROOT/test/ 以下を見よう テスト用データは test/fixtures/を利用しよう まずは test/unit/*.rb 以下のユニットテスト、モデルのテストを参考に取り組もう 自作プラグイン用のfixturesも追加
11
基本はRedmine本体の テストコードを参考に。
でもプラグインのテストをRspecで書くことはできます! 自分でRspecと関連するヘルパーを入れちゃいましょう! 自分のプラグインのGemfileにrspec_rails を追加
Redmine本体のbundle install時にRspec用のgemが入ります
12
Redmine本体はまだRspecじゃない…
Rspecでテスト書けるの?
13
プラグイン用のspec helperやrails_helperはちょっと工夫すること。
Rspecでテスト書けるの?
テスト用データにRedmine本体のfixturesも利用できるように
実行はやっぱりRedmineのベースディレクトリから
$ bundle exec rspec -I plugins/redmine_issue_templates/spec \ plugins/redmine_issue_templates/spec/
— by @akiko_pusu
“ やりかたはなんとなくわかった ……
でもめんどくさい”
そこで、自動化ですよ。
15
オープンソースだと無料で利用できるCI環境がいくつもあります!
こんなものつかってます
初はJenkins
仕事で使ってるCIツールの学習にdrone.io や wercker に切り替え
$ bundle exec rspec -I plugins/redmine_issue_templates/spec \ plugins/redmine_issue_templates/spec/
コマンド長いのでrake taskで実行中。
16
drone.io https://drone.io/
こんなものつかってます
googleの開発したDockerコンテナを利用したCI
OSS版もあり、前職で利用してたのをきっかけにツールに慣れるため個人でクラウド版を利用
pushのたびにビルド実施してくれます
https://drone.io/github.com/akiko-pusu/redmine_banner https://drone.io/github.com/akiko-pusu/redmine_issue_templates ビルドの内容 / Statusは公開してますので、よかったら参考にしてください!
17
wercker http://www.wercker.com
こんなものつかってます
Docker + KerbernatesベースのCI/CD
現職で利用してたのがきっかけやっぱり慣れるために個人で使ってみた
pushのたびにビルド実施
drone.ioではrubyのバージョンが限られているのでこちらをメインに
https://app.wercker.com/akiko-pusu/redmine_issue_templates/runs ビルドの内容 / Statusは公開してますので、よかったら参考にしてください!
18
wercker こんなものつかってます
https://github.com/akiko-pusu/redmine_issue_templates/blob/master/wercker.yml 設定は公開してますので、よかったら参考にしてください!
wercker.yml というビルド用の設定ファイルに基づいて動きます
Banner, Templateプラグインはwerckerを使ってます
現在SQLiteですがDB用のコンテナと組み合わせてテストできたりします
19
オープンなCIを使うと…
あなたのコードに ハナマル(バッジ)が!
ぼっち開発でも、コードレビュー!
静的解析、やってみよう!
— by @akiko_pusu
“ひとりでほそぼそと つくってます…
コードレビューして みたいんです……”
ぼっち開発でも、コードレビュー!
SideCI https://sideci.com/ja
綺麗なコードと文化を作る コードレビューのためのCI
面倒な設定が要りません!
30秒で解析できちゃう!! http://qiita.com/akiko-pusu/items/0f4cf90ab91d88e16c9d
Qiitaの記事もよかったらどうぞ!
SideCI による静的コード解析
ぼっち開発でも基本はプルリク作ってマージ
プルリクの際にはSideCIが静的解析、werckerがテスト実施
キレイじゃないコードはガンガンレビューが付く!
どっちもパスしないとマージできない設定に!
自分以外のプルリクも、事前にチェック、テストを通して確認してもらえます
やってみての気づきとか。
インストール関連の問い合わせ減ったかも
本体よりもテスト用コードが増えてきた(汗
テストをしやすい単位に切り分けてコードを書くほうがいいと実感した(ただいま修行中)
jQueryをはじめフロントで制御する動作が増えてきたので、E2Eテストも必要と感じた
Capybara + Seleniumのテストも追加 しているところです。
まとめ。
使ってくれる人が困らないようにテストを!
でもプラグインテストは若干面倒
まずはマイグレーションからはじめよう
面倒な設定はCIにまかせちゃおう
静的コード解析も利用していこう
あなたのコードに ハナマルを!
参考:SideCI負債カンバンの例。
コード上になんらかの 難点がある場合。
コードがクリーンな場合。
参考:CIでのE2Eテストの例。
wercker や drone.io でテストする場合は、 ヘッドレスブラウザの PhantomJSを使います。
wercker の場合は、 ベースのコンテナでテストする前に、 PhantomJSをインストールする処理をしています。
テンプレートをポップアップで表示、フィルタ、適用させる機能や、Cheklist連携させたところを テストできるように調整中。
参考:CIでのE2Eテストの例。
wercker や drone.io でテストする場合は、 ヘッドレスブラウザの PhantomJSを使います。
wercker の場合は、 ベースのコンテナでテストする前に、 PhantomJSをインストールする処理をしています。
テンプレートをポップアップで表示、フィルタ、適用させる機能や、Cheklist連携させたところを テストできるように調整中。
参考:個人的にこころがけてること。
無理しないで小さくやろう
追加Gemは本体と競合するので控えめに
なるべくこまめにCIまわそう
カバレッジやバッジでモチベーション維持!
プラグインと同じ機能が本体に実装されたら、
それが一番いいことです。
本体に実装される際の参考になれたら幸せ。
なので、テストは今後も付けていこうと思います。