cucumber で javascript テスト

2011 年 5 月 11 日 件のコメント

cucumber で javascriptテストなどをする場合はシナリオごとに @javascript タグを付ける。 テストを実行するとなんらかのWebDriver (デフォルトはselenium) がブラウザを起動して テストを実行するわけだが、alert や confirm が邪魔になる場合がある。 これらの確認をする必要がない場合は単純に alert や confirm を上書きして なんの挙動もしないようにしてしまえば良い。

さらに web_steps_ja.rb に利用部品として書いて好きな時にユーザが呼び出せるようにしてしまえば良いかな。

web_steps_ja.rb

module NotificationHelpers
  def ignore_notification(page)
    page.evaluate_script("window.alert = function(msg) { return true; }")
    page.evaluate_script("window.confirm = function(msg) { return true; }")
  end
end
World(NotificationHelpers)</p>

<p>前提 /^通知を無視する$/ do
    ignore_notification(page)
end

test.features (サンプル)

     @javascript
     シナリオ: 〜〜〜を登録する
     前提     ログイン名が&quot;xxxxx&quot;、パスワードが&quot;yyyy&quot;のユーザでログインしている
     前提     &quot;〜〜〜登録&quot;ページを表示している
     前提     通知を無視する</p>

<pre><code> 〜以下任意のテスト〜

 もし         〜をクリックする
 ならば     〜が表示されていること
</code></pre>

<p>

上記テストを実行するとブラウザが勝手に起動してテスト動いていくので selenium に免疫のない人はびっくりしないように :-)

カテゴリー: Development, Ruby タグ: , , ,

kanasan.coffee に参加しました

2011 年 5 月 10 日 件のコメント

kanasan.coffee に参加しました。

ハッシュタグは #kanasancoffe 最後に決まったので、実況はあまり上がってないかもしれません。 まとめは見つかるハズ。

私的には実は最後のサンプルコードレビューが一番参考になったと云う感じ。 まだまだ理解できてないと云う事です。でもほんとに RubyとかPythonっぽく書けるってのは嬉しい。 書こうと思うまでの敷居を下げる(拒絶反応を少なくする)って事だけでも、この功績はすでに大きいと思う。 まだどうなっていくのかわかりませんが、楽しみです。

CoffeeScriptの文法について by ujihisa

  • 文法は Ruby や Python ライク
  • CoffeeScriptの文法は実際難しい事はなくて、javascript理解してる人だったら数時間で使えるようになるよ
  • CoffeeScriptとjavascript は 1:1
  • http://jashkenas.github.com/coffee-script/ の TRY COFFEESCRIPT で実際に動かしての紹介

VimとCoffeeScriptの連携について by ujihisa

  • vim で shadow.vim 使うと便利だよと云うお話。
  • shadow.vim では たとえば a.js.sha ファイルがテンプレみたいな位置づけで頭の一行を実行して a.jsファイルとして保存できる仕組み(かな?) 。ユーザは .shaファイルを意識する必要なし。コミットする時は a.js をコミットすればいいと。
  • hootsuite でも絶賛広め中らしいw

Node.JS on Windows by cuzic

  • node.js を windows で使うための方法
  • node.js オススメパッケージ紹介 (coffee-script, underscore, zombie, meryl, connect)
  • no.de の紹介 node.js の開発元が提供するクラウドサービス (heroku みたいなもの)
  • 発表資料 Nodejs on windows http://slidesha.re/iH9Laf

CoffeeScriptを使ってTitaniumでiPhoneアプリを作る by deguchi

  • CoffeeScript を利用してつくったサービス http://www.caffein.tv/ の紹介
  • Caffein というサービス名なら CoffeeScript 使うしかないとw
    CoffeeScript 使うための確信犯的な根回しw
  • http://a-h.parfe.jp/einfach/archives/2011/0106235955.html

Node.JSのモジュールシステムについて by nanki

  • タイトル改め、「Node.jsは怖くない! 」
  • さっそく、 jasmine で BDD しよう!
  • prototype.js trancate関数のテストをjasmineで書いて、実装をCoffeeScript でやってみよう !! (hands on)

飛び入りでCaffeeScriptのサンプルコードをレビューしてみよう by yhara

  • http://jashkenas.github.com/coffee-script/ の overview をすべてレビュー
  • みんなで試しながら話し合いながら
  • これ最初にやるべきだった?w
  • 3項演算子がないのは残念。なんでだろう?
カテゴリー: 未分類 タグ:

Vim勉強会#7

2011 年 5 月 8 日 件のコメント

Vim勉強会#7 に行ってきました。

「vimはスポーツ!」と云う意味なのか cotocoto のキーワードに スポーツ系のキーワードが入っていた vim勉強会#7 みなさんユニークで楽しいですね。vim使いになってわずか数日の私にとって、どれも貴重なお話でした。

「おすすめVimプラギンをいくつか紹介」 by ujihisa

帰国中の @ujmによるプラギン紹介。

参加者のほとんどが Macユーザだったのですが、誰一人旧MBAir VGAケーブルを持っていないという事態に。@ujm がvimを操ってる姿見たかったなぁ。また次回が楽しみです !!

<li>
quickrun

表示中のコードを実行して出力結果をバッファに表示できます。 thincaさん ujihisaさん作のプラギン。

  • vimshell

    Vimからシェルを起動するVimScript :! コマンドとは違って非同期実行可能

  • unite.vim

    候補一覧からアイテムを選択しアクションを実行するプラギン unite-outline, unite-grep と併用するとさらにgood! 対応するファイルの見出し行を抽出して一覧化、選択してJump ができる。(ruby なら def定義一覧になるよね) –auto-preview オプションも紹介されたのですが、これは便利 !! 一覧カーソル移動中にプレビューが見られる。

  • smartchr

    
    inoremap  = smartchr#one_of(' = ', ' == ', ' === ', '=')
    
    
    と.vimrcに書くと、=を1回押すと、’ = ‘ 、さらに続けて =をタイプすると ‘ == ‘ 、さらに続けて =をタイプすると ‘ === ‘、さらに続けて =をタイプすると ‘=’になると言うもの。
  • neocomplcache

    オムニ補完する為のプラギンかな。 ファイル名補完とかバッファ名補完ができるらしい。

  • neco-look

    look コマンドが使える環境で使えるプラギン 英単語など補完できるのでスペルミスが激減しそう !!

    「lingr.vimとその中身」 by tsukkee

    lingr をしている時であれなんであれ、片時もvimから離れたくないという @tsukkeeさんの思いから生まれたプラギン。 これを使えば 10room以上同時閲覧可能だとか。ほかにもlingr.vim を使うべきいくつかの理由の紹介や、lingr.vim の仕組みが紹介されました。スレッドセーフな仕組みを作るのが難しかったようです。こういうの作れちゃうのスゴイと思います。ホントに。

    「Vundleでゔんどる」 by kozo-ni

    プラギンマネージャー vundle の紹介。@kozo-ni さんによると、色々なプラギンマネージャーを試した中ではこれがオススメだとか。

    実はvim初級者の私も使ってます。:BundleInstall , :BundleSearch などとても便利ですヨ。 lingr や 後々 ujihisaさんとも話した内容ですが、.vimrc での記述やコマンドも vundle という記法であって欲しかったなぁと。

    「僕がいかにして unite を使わなくなったのか」 by Sixeight

    uniteは便利だけれど、実際に開発してると列挙して選択ってのは煩わしいと。そんな時 rails.vim を使えば簡単に model や controller に移動できたりするそうです。model の追加とかrails の機能はほとんどvimから実行できるみたいです。

    rails開発者のデモが見れて良かったです。 unite の否定という事だったんですが、ujihisaさんによる補完でuniteの紹介にもなっていたような場面もありライブ感ある発表でした

    「気鋭の新機構vitalの全て」 by ujihisa

    プラギン作者にとっては嬉しい新機構vital の紹介。vital作者による発表名前の vital もタイプが気持ちいいものを選んだらしいです。確かにタイプが気持ちいい。 プラギン作者には関係ない話しなので、はやくLv4以上になろうねと云う話なのかw Vim-users.jp – Vim使いのレベル10

    プラギン作成時に似たような処理をライブラリ化するものらしいです。 プラギンを横断的にサポートするような仕組みなので普通のプラギンよりも コアな仕組み提供という事になるのかな?

    初心者として初参加だったのですが、和気あいあいとして楽しい会でした。 また戦闘力を上げて参加したいです。
    参加者の皆様、お疲れさまでした。

    カテゴリー: 未分類 タグ:

    RVM導入方法

    2011 年 4 月 28 日 件のコメント

    環境:Mac OSX 10.6.7 (RVMの導入方法は他にもありますが、今回の方法では git が必須です。)

    RVMは Ruby Version Managerで Rubyの複数バージョンを混在させる事ができるます。またgemsetと仕組みで プロジェクト毎に使用するgemやそのバージョンを切り替えると云う事が可能です。

    Macバイナリでの導入の方が楽かなと思っていたのだけれど、なんだかよくわからないので結局 git でインストールする事に。 といっても全然難しくない。簡単。

    適当なディレクトリで git clone

    
    $ git clone git://github.com/wayneeseguin/rvm.git
    $ cd rvm
    $ ./install
    
    以上で インストール環境。

    .bashrc に以下を追加。(できれば最後の方に)

    [[ -s "$HOME/.rvm/scripts/rvm" ]] &amp;&amp; source "$HOME/.rvm/scripts/rvm"  # This loads RVM into a shell session.
    

    .bash_profile に下記の設定がない人はこれも追加。

    if [ -f $HOME/.bashrc ]; then 
      source $HOME/.bashrc 
    fi 
    

    ターミナル再起動

    
    $ rvm -v

    rvm 1.2.6 by Wayne E. Seguin (wayneeseguin at gmail.com) [http://rvm.beginrescueend.com/]



    2010年に書いた記事が下書きのままだったので改めて公開しました。

    一部、下記サイトを参考にしています。

    Ruby Freaks Lounge:第39回 RVM(Ruby Version Manager)による環境構築|gihyo.jp … 技術評論社

    Ruby Freaks Lounge:第40回 RVM(Ruby Version Manager)による環境構築(2)|gihyo.jp … 技術評論社

    カテゴリー: Development タグ:

    cucumber の paths.rb で DBの値を利用する

    2011 年 4 月 26 日 件のコメント

    そもそも paths.rb の中で Model使えるのかとか思ったのですが、なんの事はない。普通に User.find(123) とかできるのですね。ちゃんと理解していないからこんな疑問が発生するのでしょう。

    それはさておき。

    when /フォロワーが([0-9]+)人いるユーザのプロフィール画面/
        user = Users.find(:first, :conditions => { :follower => $1.to_i} )
        edit_user_info_path(user.id)
    

    ([0-9]+) など、正規表現でマッチングさせておきと $1 で値渡してあげれば OK 正規表現のマッチングで () 内にヒットしたものが $1, $2…となるのを知らない人は意外にいるようだ。

    paths.rb っていうか、結局 routes.rb の話なんだよね。

    カテゴリー: Development, Ruby タグ: , ,

    Titanium & Android SDK セットアップエラー

    2011 年 3 月 28 日 件のコメント

    Titanium Developer (1.2.2) で Android SDK を指定する際に Couldn't find adb or android in your SDK's "tools" というエラーが発生する場合

    platform-tools/adb を toolsに移動するとエラーは発生しなくなる。 sdk のバージョンアップで adb の配置先が変わったようだ。

    WEB+DB PRESS Vol.61

    カテゴリー: Development タグ:

    TDD テスト駆動開発 in 第4回勉強会@minami.rb

    2011 年 2 月 3 日 件のコメント

    第4回勉強会@minami.rb に参加してきた。 http://qwik.jp/minamirb/57.html

    その中での1セッション 『TDD テスト駆動開発入門』(by yalabさん)での課題が時間内に終わらなかったので復習をかねて最後までやり遂げる事に。ruby はそんなに書きなれていない事もあり、なかなか手間取ったがやっと課題の要件はみたす事ができたので、ここに晒しておく。 ruby ではそうじゃないよとか、普通はこうだよね。的なツッコミを入れていただけると有難いです。

    時間がかかったポイントとしては ruby の実装不足。慣れてないのが大きいのかなと。 ただコーディングするだけならすぐかもしれないが、いかにrubyっぽく綺麗に書けるのだろうかと考えながらだったからのような気がします。実際このコードが rubyの暗黙の美的センスに乗っ取っているかどうかはわからないのですが、極力そうしたつもり。 for とか while とかでぐるぐるまわして if で条件分岐してどうたらとかいうのは、なるべくしたくないですし。

    こういう積み重ねが大切ですね。 まぁ、とりあえずこんな感じで一旦アップしておきます。 ちょっと思うところがあるので、これに手を入れてすぐに第2版をアップしたいと思います。

    課題 http://www.slideshare.net/yalab/ss-6749458 ・月末を返す last_day メソッドを作ってください。 ・第一週の日曜日 (先月の最後の日曜日かもしれない)を返すメソッドを作ってください。 ・最終週の土曜日(次月の最初の土曜日かもしれない)を返すメソッドを作ってください。 ・各週と各日を操作するeach_weekとeach_dayを作ってください。 ・月曜始まりと日曜始まりの両方を使えるようにしてください。

    calendar.rb カレンダー

    calendarTest.rb カレンダーのテストクラス これが重要。これのおかげで一旦完成した後も躊躇なくリファクタリングを進める事ができる。 常々思っている事なのだが、テストコードは人の為と云うよりも自分の安心の為に書くものだと思う。

    実行結果

    
    $ ruby calendarTest.rb 
    Loaded suite calendarTest
    Started
    ................
    Finished in 0.02391 seconds.

    16 tests, 16 assertions, 0 failures, 0 errors

    Calendar.rb

    class Calendar
      attr_reader :first_day
      attr_reader :last_day
      attr_reader :base_cwday</p>
    
    <p>def initialize(year, month, base_cwday = "Sun")
        @first_day = Date.new(year, month, 1)</p>
    
    <h1>@last_day = (Date.new(year, month, 1) >> 1) - 1</h1>
    
    <pre><code>@last_day = (Date.new(year, month, -1))
    @base_cwday = Date::ABBR_DAYNAMES.index(base_cwday)
    </code></pre>
    
    <p>end</p>
    
    <p># カレンダー表示上の最初の日を返す
      def display_first_day
        return @first_day - @first_day.cwday + @base_cwday
      end</p>
    
    <p># カレンダー表示上の最後の日を返す
      def display_last_day
        return @last_day + (6 - @last_day.cwday + @base_cwday)
      end</p>
    
    <p># 当月すべての日を週ごとに配列にして返す
      def each_week
        weeks = Array.new()
        display_first_day.step(display_last_day, 7) {|wd|
          week = Array.new()
          wd.step(wd + 6, 1) {|d|
            week &lt; &lt; d if first_day.month == d.month
          }
          weeks &lt;&lt; week
        }
        return weeks
      end</p>
    
    <p># 当月すべての日を配列にして返す
      def each_day
        days = Array.new()
        @first_day.step(@last_day, 1) {|date|
          days &lt;&lt; date
        }
        return days
      end
    end
    

    CalendarTest

    require 'test/unit'
    require 'date'
    require './calendar'</p>
    
    <p>class CalendarTest  &lt; Test::Unit::TestCase</p>
    
    <p># 基本パターン
      def test_first_day_201101
        actual = Calendar.new(2011, 1)
        assert_equal Date.new(2011, 1, 1), actual.first_day
      end</p>
    
    <p># 固定値で返してないか別の月で確認
      def test_first_day_201102
        actual = Calendar.new(2011, 2)
        assert_equal Date.new(2011, 2, 1), actual.first_day
      end</p>
    
    <p># 日数 31日
      def test_last_day_201101
        actual = Calendar.new(2011, 1)
        assert_equal Date.new(2011, 1, 31), actual.last_day<br />
      end</p>
    
    <p># 日数 28日
      def test_last_day_201102
        actual = Calendar.new(2011, 2)
        assert_equal Date.new(2011, 2, 28), actual.last_day<br />
      end</p>
    
    <p># 日数 29日
      def test_last_day_201002
        actual = Calendar.new(2012, 2)
        assert_equal Date.new(2012, 2, 29), actual.last_day<br />
      end</p>
    
    <p># 日数 30日
      def test_last_day_201004
        actual = Calendar.new(2010, 4)
        assert_equal Date.new(2010, 4, 30), actual.last_day
      end</p>
    
    <p>## display_first_sunday
      # カレンダー上の最初日曜が前月にあるパターン
      def test_display_first_day_feb
        feb = Calendar.new(2011, 2)
        assert_equal Date.new(2011, 1, 30), feb.display_first_day
      end</p>
    
    <p># カレンダー上の最初日曜が前月にあるパターン(月曜始まり)
      def test_display_first_day_feb_Mon
        feb = Calendar.new(2011, 2, "Mon")
        assert_equal Date.new(2011, 1, 31), feb.display_first_day
        puts feb.base_cwday
      end</p>
    
    <p># カレンダー上の最初日曜が前年前月にあるパターン
      def test_display_first_day_jan
        feb = Calendar.new(2011, 1)
        assert_equal Date.new(2010, 12, 26), feb.display_first_day
      end</p>
    
    <p>## display_last_saturday
      # カレンダー上の最終土曜が翌月にあるパターン2
      def test_display_last_day_201101
        actual = Calendar.new(2011, 1)
        assert_equal Date.new(2011, 2, 5), actual.display_last_day
      end</p>
    
    <p># カレンダー上の最終土曜が翌年翌月にあるパターン
      def test_display_last_day_201012
        actual = Calendar.new(2010, 12)
        assert_equal Date.new(2011, 1, 1), actual.display_last_day
      end</p>
    
    <p># カレンダー上の最終土曜が翌年翌月にあるパターン(月曜始まり)
      def test_display_last_day_201012_mon
        actual = Calendar.new(2010, 12, "Mon")
        assert_equal Date.new(2011, 1, 2), actual.display_last_day
      end</p>
    
    <p># カレンダー上の最終日が当月にあるパターン
      def test_display_last_day_201104
        actual = Calendar.new(2011, 4)
        assert_equal Date.new(2011, 4, 30), actual.display_last_day
      end</p>
    
    <p># カレンダー上の最終日が当月にあるパターン(月曜始まり)
      def test_display_last_day_201107_mon
        actual = Calendar.new(2011, 7, "Mon")
        assert_equal Date.new(2011, 7, 31), actual.display_last_day
      end</p>
    
    <p>def test_each_week
        actual = Calendar.new(2011, 1)
        expect = [
            Array.new(1) { |i| i+1 },
            Array.new(7) { |i| i+2 },
            Array.new(7) { |i| i+9 },
            Array.new(7) { |i| i+16 },
            Array.new(7) { |i| i+23 },
            Array.new(2) { |i| i+30 },
            ]
        weeks = Array.new()
        expect.each { |e|
          week = Array.new()
          e.each { |d| 
            week &lt;&lt; Date.new(2011,1,d)
          }
          weeks &lt;&lt; week
        }
        assert actual.each_week == weeks
      end</p>
    
    <p>def test_each_day
        actual = Calendar.new(2011, 1)</p>
    
    <pre><code>array = Array.new([])
    (1..31).each { |day|
      array &lt;&lt; Date.new(2011,1,day)
    }
    assert actual.each_day == array
    </code></pre>
    
    <p>end</p>
    
    <p>end
    

    カテゴリー: 未分類 タグ: , ,

    Mac OS X での Rails アップデート

    2011 年 1 月 4 日 件のコメント

    既存バージョンの確認

    $ ruby -v
    ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0]

    $ gem -v 1.3.5

    $ rails -v Rails 2.3.5

    Mac でのアップデートは簡単。以下の通り。

    sudo gem update --system

    sudo gem install rails

    sudo gem update rake

    確認

    $ gem -v
    1.4.1

    $ rails -v Rails 3.0.3

    昔はgemすら入ってなかったのに、今は gemもRailsもプリインストールされている。 便利な環境になったもんです。

    ちなみに Rails2.3.5 と Rails3.0.3 は共存しています。 Rails2.3.5 系を実行したい場合は

    rails 2.3.5 
    
    とすればOKです。

    カテゴリー: Development タグ:

    JDOM

    2010 年 5 月 13 日 件のコメント

    JDOM(Java Document Object Model)はJavaでXMLを容易に扱うため、DOMより使いやすいAPIを提供することを目指して設計された軽量XMLライブラリ

    JDOMでXMLプログラミングを単純化する

    java: JDOM入門 ~XMLファイルを 読み込む・書き出す~

    JDOM – JavaでXMLを容易に扱える軽量XMLライブラリ – オープンソースコラム

    カテゴリー: 未分類 タグ:

    Selenium がイロイロとバージョンアップしてた。

    2010 年 4 月 20 日 件のコメント

    Selenium バージョン1.0 が 2009/6/20 にリリースされた。 Firefox 3.0, 3.5 IE 8 などへの対応を含めているようだ。 また、自動テストツール Selenium の派生プロジェクトが随分と追加されている。

    http://seleniumhq.org/projects/

    ■Selenium Grid グリッド環境。複数の環境で同時テストを行う

    ■Selenium Ruby Ruby テスト用

    ■Selenium on Rails

    ■Cubic Test Eclipse 上でテスト対象の画面遷移がグラフィカルに参照できる。 これは欲しかった。わかりやすい。

    カテゴリー: 未分類 タグ: