ztbuz@dev

人生に絶望しているZが、それでも技術を身につけようと必死になるブログ

RSpec+Sporkでテストを高速化する方法

いまさらすぎる話題ですが、Rails初心者の私にとっては新鮮な話ですので、ご勘弁ください。。。

RSpecでテストを書いてて「やけに遅いな〜こんなものか」と思っていたのですが、Sporkなるものがあるらしいですね。 ということで設定してみました。

設定方法

Gemfileに書く

とりあえずGemfileを編集します。 rspec-railsspork-railsを書きます。

group :development, :test do
  gem 'rspec-rails'
  gem 'spork-rails'
end

インストールする

有無を言わさずインストールします。

$ bundle install

RSpecを初期化する

すでにしていれば問題ないですが、していないとSpork設定時に怒られるので……。

これをやると、spec/spec_helper.rbが生成されます。

$ bundle exec rspec:install

Sporkを初期化する

つぎにSporkの設定ファイルを生成します。 これをやると、spec/spec_helper.rbが勝手に編集されます。

$ bundle exec spork --bootstrap

設定ファイルを編集する

spec/spec_helper.rbを開いて、RSpec生成時に書いてあった設定をSpork.prefork doendの中に書きます。

Spork.prefork do
  # ここに書く
end

Spork.each_run do
end

.rspecを編集する

Sporkを使うには、bundle exec rspec --drbとすればよいです。 ただ、毎回--drbをつけるのも面倒なので、標準でつけるようにします。

これは、Railsのルートディレクトリにある.rspecに書きます。

--color
--drb

使用方法

Sporkを起動する

ようやく設定が終わったので、Sporkを起動します。

$ bundle exec spork

テストする

この状態でRSpecでテストすると、ものすごくはやいです。

$ bundle exec rspec

注意

Sporkはもろもろの設定を事前に読み込んでおくためにテストが高速化されます。 なので、config/routes.rbなどを編集したら、Sporkを再起動しなければなりません。

この辺自動リロードなどもできると思いますが、ちょっと疲れたので今度にします。。。

Gitで直前のコミットを取り消す方法

私はよくやらかしてしまう人なのです。 なので、直前のコミットを取り消すこともしばしばです。

ですが、そのやり方を忘れることもしばしばです。 なので、その方法についてまとめます。

コミットを取り消す方法

コミットのみを取り消す

コミットのみを取り消すには、git reset --softを用います。

$ git reset --soft [commit]

直前のcommitHEAD^に格納されるので、直前のコミットを取り消すには以下のように書きます。

$ git reset --soft HEAD^

ファイルの変更も取り消す

ファイルの変更内容すらも取り消したい場合は、--softではなく--hardを用います。 これを意図せずにやってしまうと大変なことになる(と思う)ので、気をつけます。

$ git reset --hard HEAD^

もっとGitを優雅に使えるようになりたいものです。

git remoteの使い方

git remote関連をつかっているときに頭がごちゃごちゃになってきたので、一度整理してみました。 基本的な使い方のみまとめてみます。

git remoteのコマンド

リモートリポジトリの一覧を表示する

リモートリポジトリの一覧を表示するには、そのままgit remoteと打ちます。 詳細を確認するには、-vオプションをつけます。

$ git remote
$ git remote -v

リモートリポジトリを追加する

リモートリポジトリを追加するにはaddコマンドを使います。 GitHubを使うときによくやる、アレです。

$ git remote add [name] [url]

リモートリポジトリを削除する

削除するときはrmを使います。

$ git remote rm [name]

以上でござる。

参考記事

bundle installでのGemのインストール先を変更する方法

単純にbundle installすると、インストールしたGemがシステム全体に影響することになります。 rbenvなどでRubyをインストールしていればいくらかマシですが、でもやっぱり気になります。 A型だもの。

ということで、Gemのインストール先を変更してみます。

方法(1):オプションを指定する

bundle install実行時に、Gemのインストール先を指定することができます。 方法は以下のとおりです。

$ bundle install --path vendor/bundle

方法(2):設定ファイルにインストール先を書いておく

(1)のやり方を毎回打つのは面倒です。 そこで、インストール先を設定ファイルに書いておきます。

Bundlerのドキュメントを見ると、.bundle/configに書けばよいらしいです。

$ mkdir .bundle
$ vi .bundle/config

configの中身は以下のとおりです。

---
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'

設定できたかどうかは、bundle configで確認することができます。

$ bundle config

いつも書き方を忘れるので、まとめてみました。。。

追記:2013/12/29

方法(1)のやり方で一度実行すると、勝手に.bundle/configが生成されるみたいですね。 ということで、方法(2)は(゚⊿゚)イラネ

RailsプロジェクトをHerokuにデプロイする方法

いまRailsの勉強をしているのですが、試しにHerokuにデプロイしてみました。 その方法を簡単にまとめてみます。

Railsの準備

プロジェクトを作成する

rails newするだけです。

$ rails new hoge

Gitにコミットする

HerokuはGitを使うみたいなので、その準備をします。 Herokuを使うだけなら、特にリモートリポジトリを準備する必要はありません。

$ git init
$ git add .
$ git commit -m 'first commit'

Gemfileを編集する

ここで結構はまりました。

RailsはデフォルトでSQLiteを使うようになっているのですが、HerokuはPostgreSQLを使います。 それだけならまだしも、Gemfilegem 'sqlite3'が残っていると、以下のエラーが表示されます。

Installing sqlite3 (1.3.8)
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
/tmp/build_fe2767bf-8ae8-4b42-86f1-6f1536d20723/vendor/ruby-2.0.0/bin/ruby extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).

そうならないために、:development:production(Heroku)で分けます。

$ vi Gemfile

group :development do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
  gem 'rails_12factor'
end

gemをインストールする

あとはgemをインストールします。 このとき、--withoutオプションで、本番環境用のgemをインストールしないようにします。

$ bundle install --without production

コミットする

以上の変更をコミットします。 bundle installしたときにGemfile.lockが追加されているので、それをよしなに反映させましょう。

$ git add .
$ git commit -m 'add Gemfile.lock'

Herokuにデプロイする

ユーザ登録する

なによりまずはユーザ登録をします。

コマンドをインストールする

つぎに、Heroku Toolbeltというものをインストールします。 これがないといろんなコマンドがつかえないのです。

ログインする

次のコマンドで、ログインします。

$ heroku login

Heroku上にリポジトリを作成する

Railsのルートディレクトリ上で、createコマンドを実行します。 すると、Heroku上にリポジトリが作成されます。

$ heroku create

createすると、Herokuのサブドメインが与えられます。 あとはPushするだけでデプロイ完了、ということです。

Pushする

それではさっそくPushしましょう。 リモートリポジトリにはherokuを指定します。

$ git push heroku master

ちなみにどんなリモートリポジトリがあるかはgit remote -vで確認できます。

表示を確認する

ブラウザでURLを指定してもよいのですが、以下のコマンドを打てば自動でブラウザを開いてくれます。 親切すなぁ。

$ heroku open

以上でした。 ちなみにSQLiteのくだりで数時間はまってました。。。Orz

Vagrantのsaharaプラグインの使い方

ChefとVagrantでいろいろよろしくやっていると、Vagrantを何度も初期化することになります。 というか、初期化したくないけど、レシピを適用する前に戻りたくなります。

そんなときに便利なのがsaharaというプラグインです。 この使い方についてメモしておきます。

saharaの使い方

インストール方法

以下のコマンドをターンッとたたくだけです。

$ vagrant plugin install sahara

各種コマンド

一般的な使い方としては、まずonして、大きな変更を加える前にcommitして、いろいろよろしくやり、戻したくなったらrollbackします。

いろいろよろしくやって、その変更を覚えておきたい場合は再度commitし、いらなくなったらoffします。

実行

$ vagrant sandbox on

コミット

$ vagrant sandbox commit

コミット時に戻す

$ vagrant sandbox rollback

終了

$ vagrant sandbox off

注意

起動したままcommitすると、かなり時間がかかってやばいです。 そんなときは、一度haltしましょう。

Chef SoloでVagrant上にrbenv環境をつくったけどgem installがうまくいかない場合の対処法

以前、Chef SoloでVagrant上にrbenvの環境をつくりました。

ただ、この方法では、rbenv/versionsのグループがrootとなります。 そのため、vagrantユーザでgem installしてもこうなってしまいます。。。

[vagrant@localhost ~]$ gem install bundler
Fetching: bundler-1.3.5.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/local/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0 directory.

これを解決してみます。

解決方法

権限を変更する

上のエラー文では、「rbenv/versions/〜に書き込み権限がないよ!」と言われているようです(適当)。

じゃあ、とりあえず変えてみましょう。 /usr/local/rbenv下すべてのグループをrbenvグループにして、さらにrbenvグループに書き込み権限を与えます。

$ sudo chown -R :rbenv /usr/local/rbenv
$ sudo chmod -R 775 /usr/local/rbenv

gem installする

以上でOKです。 これで、試しにgem install bundlerすると……。

[vagrant@localhost ~]$ gem install bundler
Fetching: bundler-1.3.5.gem (100%)
Successfully installed bundler-1.3.5
Parsing documentation for bundler-1.3.5
Installing ri documentation for bundler-1.3.5
1 gem installed

きたこれ!

補足:Chefのレシピで書く

これをChefでやると、以下のようになると思います。 何度も実行しないように、rbenv/versionsのグループがrbenvじゃないときだけ実行するようにnot_ifなどを書いてみます。

execute 'change owner and mode' do
  not_if "ls -ld /usr/local/rbenv/versions | awk '{ print $4 }' | grep rbenv"
  command 'chown -R :rbenv /usr/local/rbenv; chmod -R 775 /usr/local/rbenv'
end

以上なのです。