rspec-mode でカーソル行のテストを実行しよう

rubyist && emacs ユーザ向けの記事です。

rspec-mode.el を使う事で、emacs で spec ファイルを開き F10 (私の場合) キーを押すだけで、カーソルの当たっている行のテストを実行できるようになります。

インストール方法

wget https://raw.github.com/pezra/rspec-mode/master/rspec-mode.el

load-pathの通っている所におく

$ vi ~/.emacs.d/init.el
;; rspec-mode.el
(require 'rspec-mode)
(custom-set-variables '(rspec-use-rake-flag nil))

https://github.com/pezra/rspec-mode

使い方

spec ファイルを開いて C-c , s でカーソル行の rspec を実行

その他

  • toggle back and forth between a spec and it’s target (bound to `\C-c ,t`)
  • verify the spec file associated with the current buffer (bound to `\C-c ,v`)
  • verify the spec defined in the current buffer if it is a spec file (bound to `\C-c ,v`)
  • verify the example defined at the point of the current buffer (bound to `\C-c ,s`)
  • re-run the last verification process (bound to `\C-c ,r`)
  • toggle the pendingness of the example at the point (bound to `\C-c ,d`)
  • disable the example at the point by making it pending
  • reenable the disabled example at the point
  • run all specifications for project (bound to `\C-c ,a`)

http://www.emacswiki.org/RspecMode

もっと便利に - compilation バッファを小さく

$ vi ~/.emacs.d/init.el
(defun my-compilation-hook ()
  (when (not (get-buffer-window "*compilation*"))
   (save-selected-window
      (save-excursion
         (let* ((w (split-window-vertically))
               (h (window-height w)))
          (select-window w)
          (switch-to-buffer "*compilation*")
          (shrink-window (- h 10)))))))
(add-hook 'compilation-mode-hook 'my-compilation-hook)

http://stackoverflow.com/questions/9725015/how-do-i-make-the-compilation-window-in-emacs-to-always-be-a-certain-size

もっと便利に - F10 で行指定 spec を実行

$ vi ~/.emacs.d/init.el
(global-set-key [f10] 'rspec-verify-single)

init.el まとめ

;; rspec-mode.el
(require 'rspec-mode)
(custom-set-variables '(rspec-use-rake-flag nil))
(global-set-key [f10] 'rspec-verify-single)
(defun my-compilation-hook ()
  (when (not (get-buffer-window "*compilation*"))
    (save-selected-window
      (save-excursion
        (let* ((w (split-window-vertically))
               (h (window-height w)))
          (select-window w)
          (switch-to-buffer "*compilation*")
          (shrink-window (- h 10)))))))
(add-hook 'compilation-mode-hook 'my-compilation-hook)

Fluentd Casual Talks に行ってきた

Fluentd Casual Talks 勉強会 http://atnd.org/events/27808 に行ってきました。

というわけで、レポート・・・を書こうと思ったのですが、良いのがあったのでそれで ^ ^

自分(@sonots)のツイート

  • apacheレスポンスタイムの可視化! #fluentdcasual
  • アクションログを記録。登録、ログイン、操作、ログアウト。昔はgrepでやっていたが、fluentdで集計して、どの時刻にどのアクションしたのかアクションログを検索できるようにした。いいね。
  • fluentdでzabbixがやるような通知までできるのか。プラグイン次第か。
  • レコメンデーションシステムで、レコメンデーションするためにログを使うから、fluentdを使う、という流れ。ログが機能に繋がるって発想なかったな~。
  • fluentdも近々windowsで動くようになる?期待大 #fluentdcasual
  • 「fluentdがあればssh&grepしなくてすむ!」この世界を目指したい!
  • 熱気もあってすごい楽しかった!すごい良かった!#fluentdcasual

Jenkinsを利用した仕事の自動化

Jenkinsで何をやっているのか、またその効果を聞かれた(上司に)ので、どのように利用しているのか書きます。ただし、細かい設定方法については本文書のスコープ外とします。

困りごと

我々の開発チームでは、毎週新しいバージョンのウェブアプリケーションをリリース、およびデプロイ(ウェブサーバへの配置、インストール)する必要があるが、その作業に3〜5時間程度かかっている。

この3〜5時間の内訳は主には、(ビルド)、システムアップデート、自動テスト、デプロイにかかる待ち時間や作業メモを参照している時間であり、生産的な作業に時間を費やせているとは言えない。

自動化して解決したい。

解決方法

継続的インテグレーション(Continuous Integration: CI)を導入した。

利用するツール

  • Jenkins http://www.atmarkit.co.jp/fjava/rensai4/devtool21/devtool21_1.html
    • ソースコードを統合してビルドを自動化するCIツール。人手でコンパイルやデプロイ、テストを行うと、手順漏れが発生したり、統合/テストできる人が特定の人に限られることがあるが、ビルドを自動化しておけば誰でも簡単にビルドできるようになる。
  • rspec http://jp.rubyist.net/magazine/?0021-Rspec
    • ruby の単体テストフレームワーク。Java でいう JUnit, C++ でいう CppUnit のようなものと思ってもらえば差し支えない
  • capistrano http://www.oiax.jp/rails/capistrano.html
    • 自動デプロイツール。cap コマンド1発でサーバにウェブアプリをインストール(デプロイ)することなどができる。

我々の開発チームの情報(前提)

まず、大前提として、我々の開発チームでは ruby / Ruby on Rails を利用してウェブアプリケーションの開発をしている。

それらの Rails アプリケーションは、ウェブサーバアプリである nginxと、nginx 上で Rails アプリを動かすための passenger モジュールを用いて動作させている。

また、バージョン管理ツールには git を利用しており、リリース用ブランチ master と、開発中ブランチ develop、およびそれから派生した各開発者が自由に分岐させたブランチが存在している。

単体テスト、およびシステムテストは rspec を用いて自動化している。開発は Test Driven で行っており、テストが通らなければ、develop ブランチへマージすることは許されない。

我々の開発チームでの実践

Jenkins を用いて以下のことを自動化した。「成功した場合に次の作業を実施する」という仕組みはビルド・パイプラインというJenkinsのプラグインを用いて実現している。

  • 開発者が develop ブランチにマージすると、rspec の単体テストが走る。単体テストが通らなかった場合、開発者に(IRCチャットで)通知し、修正を促す。
  • 単体テストが通った場合、cap コマンドを用いて、develop 用 nginx に rails アプリをデプロイする。
  • デプロイに成功したら、rspec のシステムテストを走る。システムテストが通らなかった場合、開発者に通知し、修正を促す。

これと同じ仕組みを master ブランチ(システムリリース用ブランチ)にも適用しており、毎週のシステムリリースも自動化されるようになっている。

効果

これらの自動化により、毎週3〜5時間かかっていた工数が、(問題がない時には)5分程度の工数ですむように改善された。

おわり

A Ruby and Fluentd committer working at DeNA. 記事本文および記事中のコード片は引用および特記あるものを除いてすべて修正BSDライセンスとします。 #ruby #fluentd #growthforecast #haikanko #yohoushi #specinfra #serverspec #focuslight
はてぶ人気エントリー

Google