query: tag:test

SConsを使ってscons testでテストを実行するには、
SConstructもしくはSConscriptで以下のように書く
(Google Test仕様)

python>>
import os, sys
Import('env')
env = env.Clone()

test = env.Program('test', Glob('*.cpp'), LIBS='gtest')
test_alias = Alias('test', [test], test[0].abspath)
AlwaysBuild(test_alias)
<<--

See Also

posted by genki genki on Tue 2 Mar 2010 at 07:45 with 0 comments

MerbではRSpecを使ってテストをするのが標準構成になっていますが、
merb-genが生成したアプリケーションのひな形では、
rake specの実行結果は色付きにはなっていません。
これを色付きにするためには、
spec/spec.optsの中で以下のように設定します。

spec/spec.opts

pre>>
--color
<<--

これだけです。

posted by genki genki on Mon 1 Dec 2008 at 15:41 with 0 comments

早速Growlとautotestを連携させてみようと思ったのですが、
growlnotify-1.1.4でメッセージを出そうとすると、

pre>>
% growlnotify -m "test"
2008-09-15 09:13:20.929 growlnotify[901:10b] could not find local GrowlApplicationBridgePathway, falling back to NSDNC
<<--

こんな感じのWARNINGが出てきます。
メッセージ自体はきちんと表示されるので、実用上問題ないのですが、
毎回警告が出てくるのはちょっと気になるので、
警告が出ない方法が無いかいくつか試してみた所、
以下のようにホストを指定すると大丈夫なようでした。

pre>>
% growlnotify -m "test" -H localhost
<<--

ということで、autotestと連携させるために、
以下のような.autotestファイルを作成しました。

ruby>>
class Autotest
module Growl
IMG_OK = '/Developer/Examples/Carbon/Dial/English.lproj/' +
'rotate_knob_select.tiff'
IMG_NG = "/Applications/Mail.app/Contents/Resources/Caution.tiff"
class << self
def growl(title, msg, img = nil, pri = 0, sticky = "")
img ||= IMG_NG
msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
system "growlnotify -n autotest #{title} -m #{msg.inspect}" +
" -H localhost --image #{img} -p #{pri} #{sticky}"
end
end

Autotest.add_hook :run_command do |at|
  growl "autotest running", "Started", IMG_OK
end

Autotest.add_hook :ran_command do |at|
  result = [at.results].flatten.join("\n")
  examples = result.slice(/(\d+)\s+examples?/).to_i
  tests = result.slice(/(\d+)\s+tests?/).to_i
  failures = result.slice(/(\d+)\s+failures?/).to_i
  errors = result.slice(/(\d+)\s+failures?/).to_i
  if failures + errors > 0
    growl "Tests Failed",
      "#{failures} failures #{errors} errors", IMG_NG, 2#, "-s"
  else
    growl "Tests Passed", "#{tests + examples} tests", IMG_OK
  end
end

end
end
<<--

最初はrequire 'autotest/growl'をしてモンキーパッチを当てていたのですが、
結局ほとんど書きかえてしまったのでこうなりました。

エラーが発生した場所や、エラーメッセージなんかも表示できるようになるともっと便利になるかもしれないですね。

posted by genki genki on Mon 15 Sep 2008 at 07:40 with 2 comments

テストの実行中になにげなく
MahaloDaily
を見てたら、見覚えのある大型装置が。

Youtubeの埋め込みテストも兼ねて。
OBJECTタグをそのまま貼り付ければ埋め込めます。

posted by genki genki on Tue 9 Sep 2008 at 19:07 with 0 comments

Rails-2.0.2以降から存在するBasic認証機能ですが、
この挙動をテストする方法をメモしておきます。

rails>>
request.env['HTTP_AUTHORIZATION'] =
'Basic ' + Base64::encode64("name:password")
<<--

テストコードのなかで、上記のように環境変数を設定してから
アクションを実行すればOkです。

posted by genki genki on Wed 3 Sep 2008 at 09:07 with 0 comments

書き方がよく判らないけど、こんな感じで書けるのかな?

これで改行?

なるほど、wiki形式か。

posted by shachi_kk shachi_kk on Wed 30 Jul 2008 at 09:49 with 1 comment

Controllerのアクションのテストを書くときに、
通常は以下のようにgetメソッドなどを使い、
アクションのメソッドを指定します。

rails>>
get :index
<<--

しかし、config/routes.rbの中でmap.root :formulae
のようにルートのPathをindexアクションにマッピングしている場合でも、
get :indexを呼び出した結果、Controllerに渡されるrequest.request_uri
の値は正しいルートのPathになっていません。

そのような場合には、以下のようにすると正しい結果が得られます。

rails>>
request.set_REQUEST_URI '/'
get :index
<<--

posted by genki genki on Sat 26 Jul 2008 at 00:35 with 0 comments

autotestでall_good時にrerun_all_testsをしないようにする
の改良版です。
handle_resultsメソッドの実装の変化を、
なるべく吸収できるような書き方に変えました。
~/.autotestに書いておくと良いかもしれません。

ruby>>
class Autotest
alias_method :handle_results_old, :handle_results
undef_method :handle_results

def handle_results(*args, &block)
handle_results_old(*args, &block)
self.tainted = !self.files_to_test.empty?
end
end
<<--

posted by genki genki on Tue 15 Jul 2008 at 21:52 with 0 comments

tridentは、
tail -f log/development.logautotestscript/console
を一枚の端末上で同時に実行するRailsプラグインでした(trident: tail -f, autotest and script/console at once参照)

ほぼ全てのRailsプロダクトに入れていたのですが、
毎回プラグインインストールするのが面倒になってきたので、
Gem化してGitHub上でリリースしました。

使い方ですが、RAILS_ROOTで以下のコマンドを実行します。

pre>>
% trident
<<--

すると色々立ち上がって script/console のプロンプトが出ます。
autotestのCtrl+Cをする代わりに、以下のコマンドを実行します。

ruby>>

Trident.reload
<<--

終了する時はexitでOKです。

See Also

posted by genki genki on Mon 14 Jul 2008 at 14:05 with 0 comments

昔は違った気がするのですが、手元の環境のautotest(ZenTest-3.10.0)とRSpec-1.1.4を使った状態で、テスト中に一度例外が発生した後に、全てのテストをgreenにすると、全てのテストがもう一回全部実行されるという現象が起きています。

全部テストを実行するのは大変なので、とりあえず、.autotest
でパッチを当てて回避しました。

ruby>>
class Autotest
alias_method :handle_results_old, :handle_results
undef_method :handle_results

def handle_results(results)
failed = results.scan(self.failed_results_re)
completed = results =~ self.completed_re

self.files_to_test = consolidate_failures failed if completed

color = completed && self.files_to_test.empty? ? :green : :red
hook color unless $TESTING

#self.tainted = true unless self.files_to_test.empty?
self.tainted = !self.files_to_test.empty?

end
end
<<--

L14-15行目が修正箇所です。

posted by genki genki on Sun 6 Jul 2008 at 11:41 with 0 comments

メモもかねて。

MacBookにRailsの自動テスト環境を構築した

RAILS_ROOTでautotestを実行。起動時に全部のテストを実行するのでちょっとだけ重くなるかもしれません。それ以降はテストファイルやモデル、コントローラファイルなどを修正する度に該当のテストが走ります。

autotestを-fオプションを付けて立ち上げると、Fast startモードになり、最初に全部のテストを実行しなくなります。

posted by genki genki on Sun 6 Jul 2008 at 10:47 with 0 comments

テストのC0カバレッジを上げるために、
何度もrcovを手で実行していたのですが、
テストの数が多くなってくると非常に時間がかかって面倒なため、
自動化するRakeタスクを作りました。

ruby>>
namespace :rcov do
desc 'Automate rcov'
task :auto do
interval = (ENV['INTERVAL'] || 10).to_f
org_path = File.join(RAILS_ROOT, 'coverage', '*')
pub_path = File.join(RAILS_ROOT, 'public', 'coverage')
sh "mkdir -p #{pub_path}"
loop do
Rake::Task['spec:rcov'].execute nil
sh "cp -Rf #{org_path} #{pub_path}"
sleep interval
end
end
end
<<--

使い方はRAILS_ROOTで以下のコマンドを実行するだけです。

pre>>
% rake rcov:auto INTERVAL=10
<<--

指定した時間間隔(秒)ごとにspec:rcovを実行します。
実行した結果はRSpecのデフォルトでは
RAILS_ROOT/coverageに出力されるので、これを
public/coverageに上書きコピーしています。
あとは、ブラウザで/coverageを見ればOKです。

public/coverageは間違ってデプロイしないように.gitignoresvn:ignoreに登録しておきましょう。

posted by genki genki on Sat 5 Jul 2008 at 03:53 with 0 comments

RSpecは面白そうだったのだけれど、なかなか移行する機会が無くて使っていなかったのですが、今は縁があってRSpecでViewのテストを書いています。

で、partialのテストをする場合のメモです。

ruby>>
require File.join(File.dirname(FILE), '../../spec_helper.rb')

describe '/foos/_form.html.erb' do
before do
render :partial => 'foos/form', :object => mock('form'),
:locals => {:bar => mock('bar')}
end

it "should be rendered successfully" do
response.should be_success
end
end
<<--

とりあえずこんな感じです。

See Also

posted by genki genki on Fri 16 May 2008 at 01:23 with 1 comment

script/generate mailerでgenerateされるテストコードの@expectedはTMailのインスタンスらしく、生すぎなことがあります。
というわけで、お手軽にテストする方法をぐぐりました。

via http://sablog.com/archives/2006/03/14/how-to-test-actionmailer-in-ruby-on-rails

rails>>
class SampleMailerTest < ActionMailer::TestCase
tests SampleMailer

def setup
# テスト時に配送したメールの配列を保存する。
ActionMailer::Base.deliveries = []
end

def test_welcome
to = "satoko@s21g.com"
sender = to
sender_name = "satoko"

SampleMailer.deliver_welcome(to, sender, sender_name)
assert !ActionMailer::Base.deliveries.empty?

sent = ActionMailer::Base.deliveries.first
assert_equal [to], sent.to
assert_equal "expected title", sent.subject
assert sent.body =~ /^Recommended by #{sender_name}. Enjoy!$/

end
end
<<--

###Refs
http://wota.jp/ac/?date=20050731

posted by satoko satoko on Tue 22 Apr 2008 at 16:34 with 0 comments

autotestは、Railsアプリケーションのテストを自動化する、
非常に便利なユーティリティです。
昔はlib/以下のファイルの自動テストには対応していなかったのですが、
いつの間にか対応していたみたいです。

lib/foo.rbファイルをテストする場合、
test/unit/foo_test.rbにUnitテストとしてlib/foo.rb
のテストを書けば良いようです。
そうしておくと、いずれか一方のファイルを編集したタイミングで、
自動的にテストを走らせてくれるようになります。

posted by genki genki on Sat 8 Mar 2008 at 16:22 with 0 comments

Rails-2.0から、FunctionalTest用のテストクラスの基底クラスは、
Test::Unit::TestCaseからActionController::TestCase
に変わりました。
それに伴って、テストクラス内にsetupメソッドやteardown
メソッドを書いても実行されなくなっています。

** Rails 2.0.2のファンクショナルテスト機構が壊れている件・謝罪と訂正Comments**

今日は久しぶりにRails 2.0.2を使い、久しぶりに付属のファンクショナルテスト機構を使っていたのですが、そこでひどいバグに遭遇しました。

FunctionalTestではsetupteardownを使う機会がなかったので
今まであまり気になってなかったですが、確かに使ってる人からすると
困る問題ですね。
バグだとして、パッチが採用されたら直るんだろうけど、
2ヶ月間放置されてる状況からすると、setupteardown
を使わない方向が「Convention」になっていくという事なのかな。

See Also

posted by genki genki on Wed 5 Mar 2008 at 12:24 with 0 comments

This is a memo of an idea that I'd wanted to do for about a year since my starting to write some codes for a comet server.

By using Comet, JavaScript tests by various browsers can be automated. It's sure to be able to do even by any browsers to say nothing of the Firefox with MozRepl.

I've said in each place about this, but it has been hard to make a time to touch it, because too many exciting ideas struggled in my brain to make my hands type them out.

I wrote this entry with a hope that it might be going to be done by someone else.

posted by genki genki on Sat 16 Feb 2008 at 06:11 with 0 comments

前からやりたかったアイディアのメモ。
Cometを使えばMozReplみたいなのをFirefox以外のブラウザでもできるはず。
それを使って各種ブラウザでのテストを自動化する。

結構各所で言ってるんだけど、なかなか手がつけられない。
最近手がつけられないアイディアが多くなってきたので、
誰かが作ってくれるかもしれない希望を込めて書いておきます。

posted by genki genki on Fri 15 Feb 2008 at 17:38 with 0 comments

Railsのテストフレームワークには、Mockを利用する仕組みがあります。
しかし、通常の方法でMockクラスを作成すると、オリジナルのクラスを
完全に置き換えてしまうため、すべての実装をテスト用に
書き直さなければならなくなってしまいます。

そこで、テスト用に改変したい場所だけMockで上書きし、その他の
動作はオリジナルに委譲する方法を紹介します。

rails>>
require_dependency 'models/foo'

class Foo
def bar
puts 'baz'
end
end
<<--

上記のように、require_dependencyを使ってapp
ディレクトリ以下のファイルを参照することで、Fooクラスのbar
メソッドの挙動だけを置き換えることができるようになります。

posted by genki genki on Fri 1 Feb 2008 at 13:24 with 0 comments

UnitTestやFunctionalTestの中から参照するファイルをどこに置くべきか
という疑問について、明確な回答を用意できていなかったのですが、
Railsのソースの中で答えらしきものを見つけたので紹介します。

actionpack/lib/action_controller/test_process.rb L325

rails>>

Usage example, within a functional test:

post :change_avatar, :avatar => ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/spongebob.png', 'image/png')

<<--

このExampleによると、test/fixtures/filesというディレクトリを作り、
その中にファイルを置いているようです。

posted by genki genki on Fri 1 Feb 2008 at 00:33 with 0 comments

以前、ログをトレースしながらautotestを走らせる方法を紹介しましたが、
今回はさらにその方法を拡張して、script/consoleも同時に実行してしまう
方法を紹介します。

ちなみに以前紹介した方法は、こんな感じでした。

% tail -f log/development.log &
% autotest

tail -f log/development.log &でloggerの出力をバックグラウンドで補足しつつ、フォアグラウンドではautotestを実行しています。

今回は、autotestもさらにバックグラウンドで起動させて、
フォアグラウンドで./script/consoleを実行させるのですが、
一つ問題があります。

autotestは、migrationの実行などでDBの中身が変わった場合など、
Ctrl+CでINTを送ってリロードさせる必要があるのですが、
バックグラウンドプロセスにしてしまうと、Ctrl+Cでリロード
できなくなってしまいます。

そこで、autotestのリロードを script/consle の中から行えるように
するプラグインを作りました。

インストール方法は、通常のRailsプラグインと同様です。

% ./script/plugin install http://svn.s21g.com/public/rails/plugins/trident/

使い方は、モニタリング用のコンソールから以下のRakeタスクを実行します。

% rake trident

すると、tail -f log/development.logautotestが実行され、
script/consoleが立ち上がります。

この状態で、autotestをリロードさせる場合、script/consoleから

> Trident.reload

を実行すればOKです。

終了するときは、普通にscript/cosoleexitすると、生成された子プロセスと一緒に終了します。

posted by genki genki on Fri 16 Nov 2007 at 10:54 with 0 comments

Railsのプラグインは非常に便利な仕組みなのですが、pluginのテスト
とうまく付き合うにはちょっと工夫が必要です。

plugin用に書かれているテストは、二通りの方法で実行される可能性があります。

  1. plugin ディレクトリの中で rake コマンドた実行された場合
  2. RAILS_ROOT から rake test:plugins が実行された場合

いくつかのプラグインは、上記の片方のケースのみを想定して
test が書かれている場合があり、想定されていないケースからテスト
が実行された場合、多くは沢山のエラーを出すようになります。

このような場合、プラグインディレクトリのRakefileに手を加えて、
呼び出し元に応じて処理を分けたりすれば、一見うまくいきそうですが、
そう簡単にはいきません。

Railsの test:plugins の仕組みは、プラグインディレクトリの
Rakefileを参照せずに、直接 test ディレクトリの中身を実行する
からです。

この挙動はあまり良くないと思うのですが、とりあえず、
rake test:plugins から実行するとエラーを出すプラグインの
テストディレクトリの名前を plugin_test 等に変更して、
プラグインのRakefileを以下のように書き換えることで回避できます。

Rakefile

ruby>>
desc 'Test the acts_as_taggable_on_steroids plugin.'
Rake::TestTask.new(:test) do |t|
t.libs << 'lib'
t.pattern = 'plugin_test/**/*_test.rb'
t.verbose = true
end
<<--

これによって、上記 1 のケースでは正常に動作し、2 のケースではSkipされるため、エラーの山を見ることから逃れられます。

posted by genki genki on Thu 15 Nov 2007 at 02:14 with 0 comments

Rails 2.0 RC1を使うようになったせいかどうかはわからないのですが、何故か僕の環境では acts_as_taggable_on_steroids のplugin testでFailureが一つ出るようになっていたので、修正してみました。

こんなエラーが出る

  1) Failure:
test_tag_destroyed_when_unused(ActsAsTaggableOnSteroidsTest)
    [./test/abstract_unit.rb:81:in \`assert_difference'
     /home/takiuchi/blog/vendor/rails/activerecord/lib/active_record/\
callbacks.rb:309:in \`each_with_index'
     ./test/abstract_unit.rb:80:in \`each'
     ./test/abstract_unit.rb:80:in \`each_with_index'
     ./test/abstract_unit.rb:80:in \`assert_difference'
     ./test/acts_as_taggable_test.rb:328:in \`test_tag_destroyed_when_unused']:
<5> expected but was
<6>.

修正箇所は以下のとおり。

vendor/plugins/acts_as_taggable_on_steroids/lib/acts_as_taggable.rb (L167-184)

ruby>>
def save_tags
return unless @tag_list

  new_tag_names = @tag_list - tags.map(&:name)
  old_tags = tags.reject { |tag| @tag_list.include?(tag.name) }

  self.class.transaction do
    tags.delete(*old_tags) if old_tags.any?
    # added by takiuchi to make all tests green.
    old_tags.each{|tag| tag.destroy} if Tag.destroy_unused
      new_tag_names.each do |new_tag_name|
      tags << Tag.find_or_create_with_like_by_name(new_tag_name)
    end
  end

  true
end

<<--

Tag.destroy_unused が指定されている場合、old_tagsdestroy
するようにしました。これで上記の Failure は出なくなりました。

posted by genki genki on Thu 15 Nov 2007 at 01:47 with 0 comments