http://capsctrl.que.jp/kdmsnr/wiki/bliki/?c=index
kdmsnrさんに感謝。
Redmine Advent Calendar jp 2011 : ATND の19日目です。
18日目は Redmineでのタスクの進捗報告について - いぬおせろ です。
えー、最初はテキストエリアを拡張する方法でも書こうかと
思っていたのですが、
ってことをつぶやいたら cointoss1973 さんが、
@nobiinu_and まっさらな状態から90分でRedmineをインストールする方法
2011-12-19 22:33:39 via web to @nobiinu_and
天の助け!!
Windows7 で Redmine 1.3.0 を動かすまでの流れです。
Release - Ruby-mswin32 (ja) からダウンロード。
適当なフォルダに解凍しましょう。
Download RubyGems | RubyGems.org | your community gem host からダウンロード。
やっぱり適当なフォルダに解凍します。
コマンドプロンプトを開いて、
set PATH=%PATH%;[rubyを解凍したフォルダ]\bin cd [gemを解凍したフォルダ] ruby setup.rb
http://jarp.does.notwork.org/win32/zlib-1.1.4-1-mswin32.zip からダウンロード。
bin フォルダにある zlib.dll を [rubyを解凍したフォルダ]\bin にコピーします。
インストール - Ruby-mswin32 (ja) にあるリンクからダウンロード。
lib フォルダにある iconv.dll を [rubyを解凍したフォルダ]\bin にコピーします。
openssl-0.9.8e_WIN32.zip からダウンロード。
bin フォルダにある dll を [rubyを解凍したフォルダ]\bin にコピーします。
ここまできたら、あとは RedmineInstall - Redmine を見ながら進めればいいはず?
gem install rails -v=2.3.14
gem install rack -v=1.1.1
大事な大事な Redmine のインストールを忘れてました。 @naitoh さんツッコミありがとうございます。
RubyForge: Redmine: Project Filelist からお好きなバージョンをダウンロード。
適当なフォルダに解凍しましょう。
今回は sqlite3 を使います。
config/database.yml.example をコピーして config/database.yml を作成。
production: adapter: sqlite3 database: db/production.sqlite3 development: adapter: sqlite3 database: db/development.sqlite3
rake generate_session_store
で、エラー!!!!
NOTE: Gem.source_index is deprecated, use Specification. It will be removed on o r after 2011-11-01. Gem.source_index called from D:/Development/redmine-1.3.0/config/../vendor/rails /railties/lib/rails/gem_dependency.rb:21. rake aborted! uninitialized constant Gem::SyckDefaultKey (See full trace by running task with --trace)
こ、これはキツイ。
もぞもぞググる先生とやっていると以下の記事が見つかりました。
これに違いない!
かなり落ちるんだなぁ。
gem install rubygems-update -v=1.3.7 update_rubygems
rake generate_session_store
成功。後25分!!
rake db:migrate RAILS_ENV=production
失敗。 sqlite3 がないって…。
gem install sqlite3-ruby
rake db:migrate RAILS_ENV=production
成功!!
(ちなみに RAILS_ENV=production rake db:migrate だと失敗します。Windows だから?)
rake redmine:load_default_data RAILS_ENV=production
言語を聞いてくるので、日本語 "ja" を入力します。
ruby script/server webrick -e production
画面出ましたー!(タブの多さが混乱を如実に…)
というわけで、約90分による Redmine インストールでした。
次は @cointoss1973 さんです。よろしくお願いします!
Redmine Advent Calendar jp 2011 : ATND 4日目です。
現行のRedmineだともっとスマートに書けるかもしれません。
良い実装をご存知のかた、ぜひ、教えてください :D
Hudson Plugin をインストールすると、チケットのフィルタに
という、見慣れない項目が登場します。これがそうですね。
Query クラスが親玉です。狙いどころは以下。
available_filters でジョブ番号とビルド番号を項目に追加して、
sql_for_field で追加した項目に応じたSQLを作成できるようにすれば良い訳です。
時間がないのでいきなり奥義。
上記の Query#available_filters, Query#sql_for_field は新しい項目を追加できるように設計されていません。
また、Query クラスを入れ替えることもできないので、Queryクラスを継承してメソッドをオーバーライドする戦法も取れません。
手詰まり… orz
そこで登場するのが alias_method_chain です。
Query.class_eval do alias_method_chain :available_filters, :redmine_hudson end
のように書いておくと(ここちょっと自信ない)、
ようになります。
これを使ってあれこれすれば、フィルタに項目を追加することができるのですが……。
時間がなくなったので今日はここまで。2回目があれば続きを!
というわけで次は cucumber と組み合わせてみる。
redmine <--> firefox <--> selenium <--> capybara <--> cucumber
になるのかな?
さっきの続きなので、追加したものだけ。
rails, cucumber-rails は雛形作りたいためだけのもの…。
特になし。
> rails new test-app
group test に突っ込んだ。
group :test do # Pretty printed test output gem 'turn', :require => false gem 'cucumber-rails' gem 'capybara' end
> cd test-app > ruby script/rails generate cucumber:install --capybara
雛形だけがほしかったので、
test-app\features にあるファイルとフォルダを、どこぞにコピーする。
+ using-cucumber
+ step_definitions
+ web_steps.rb
+ support
+ env.rb
+ paths.rb
+ selectors.rb
今回は外から rails のテストをするので、改変しないとエラーが出て動かない。
※ 多分ちゃんとやり方があるに違いない。
env.rb
# -*- encoding: utf-8 -*- require "Capybara" require "Capybara/cucumber" require 'test/unit/assertions' World(Test::Unit::Assertions) Capybara.app_host = "http://127.0.0.1:3000" Capybara.default_driver = :selenium Capybara.javascript_driver = :selenium Capybara.default_wait_time = 2 Capybara.add_selector(:name) do xpath { |name| XPath.descendant[XPath.attr(:name) == name.to_s] } match { |value| value.is_a?(Symbol) } end Capybara.add_selector(:class_name) do xpath { |class_name| XPath.descendant[XPath.attr(:class) == class_name.to_s] } match { |value| value.is_a?(Symbol) } end
web_steps.rb も成長させる
できあがった feature はこんな感じ。
redmine_walpurugis_night.feature
Feature: redmine_walpurgis_nights In order to extend life of universe As Incubator wants more energy. Scenario: Register new issue Given I go to toppage When I follow "ログイン" And I fill in "username" with "qb" And I fill in "password" with "homuhomu" And I press "login" When I select "Walpurgis Night" And I follow "New issue" When I select "Feature" from "issue_tracker_id" And I fill in "issue_subject" with "As Incubator, I want magical girl." And I fill in "issue_description" with "foobaa" And I select "High" from "issue_priority_id" And I select "qb incubator" from "issue_assigned_to_id" And I press "commit" When I follow "Issues" Then I should see following data at the head of issue list: |tracker|status|priority|subject |assigned_to | |Feature|New |High |As Incubator, I want magical girl.|qb incubator|
初めての人がつまづきそうなところは、まとめたほうがいいかもなー。
某ベンダ系アジャイルコミュニティの合宿で Selenium を使ったテストをやってみたので、
復習がてら Windows XP SP3上でタイトルのことをやってみたりする。
まで。
redmine <--> firefox(IE) <--> selenium(webdriver) <--> test::unit
こんな感じ?
selenium と webdriver のところが怪しい。
なんで WebDriver なの?という説明が Selenium 2.0 と WebDriver — Selenium 日本語ドキュメント にあった。
各自、適当にインストールする。
selenium-webdriver と cucumber を 1.8.7 に同居させられなかったので Selenium 陣営は 1.9.2 を選択…。
プロジェクト "Walpurgis Night" と ユーザ "qb" をあらかじめ作っておく。
諸般の事情により、とりあえず英語。
firefox -> ツール -> Selenium IDE を選択。
以下の操作を行う。赤い●のボタンを押すと記録開始、も一回押すと記録終了。
メニュー -> アクション -> 現在のテストケースを実行。
メニュー -> テストケースを保存。
これは便利だなぁ!
メニュー -> テストケースをエクスポート -> Ruby Test::Unit(WebDriver)
ここで、 テストスイート にしちゃうとエラーが出るので注意。
# -*- encoding: utf-8 -*- require "rubygems"
@driver.manage.timeouts.implicit_wait = 2
@driver.get "http://127.0.0.1:3000"
メソッドに抜き出しておいてもよさそう。
無事チケットができてたらOK
ruby \path\to\testcase.rb
ちゃんと希望通りの内容になっているのか検証をする。
手抜きをして、
のみ検証してみる。
ができないといけない。ふぅ。
ここで Web Developer の出番な訳ですよ!
使い方は(後で書くかも)
情報 -> 要素の情報を表示する が使えると思う。
チケット一覧テーブルの一番上にある行を取り出せば良い感じ。
トラッカーの内容が Feature であることを確認するにはこんな感じ。
@driver.find_element(:xpath, "//table[@class='list issues']/tbody/tr[1]") assert_equal "Feature", latest_issue.find_element(:class, "tracker").text, "tracker"
> ruby \path\to\testcase.rb Loaded suite Redmine-WalpurgisNight Started . Finished in 16.453125 seconds. 1 tests, 6 assertions, 0 failures, 0 errors, 0 skips Test run options: --seed 31656
できた!!
これができてこそ。setup の最初の行をちょいちょいと書き換える
@driver = Selenium::WebDriver.for :ie
ログインする時にパスワードをうんぬんのダイアログが出て最初は失敗したけど、
2回目は成功。
すげーすげー。
でも、いちいちここ切り替えるの面倒。
上手い指定の方法が思いつかないので、環境変数使うことにする。
上手く切り替わったゾ!
今度は Cucumber と組み合わせてできるかやってみよう。
# -*- encoding: utf-8 -*- require "rubygems" require "selenium-webdriver" require "test/unit" class RedmineWalpurgisNight < Test::Unit::TestCase def setup raise "Please set environment variable 'WEBDRIVER_TYPE' (ex. firefox, ie)" unless ENV["webdriver_type"] @driver = Selenium::WebDriver.for ENV["webdriver_type"].to_sym @driver.manage.timeouts.implicit_wait = 2 @verification_errors = [] end def teardown return unless @driver @driver.quit assert_equal [], @verification_errors end def test_redmine_walpurgis_night @driver.get "http://127.0.0.1:3000" @driver.find_element(:link, "ログイン").click @driver.find_element(:id, "username").clear @driver.find_element(:id, "username").send_keys "qb" @driver.find_element(:id, "password").clear @driver.find_element(:id, "password").send_keys "homuhomu" @driver.find_element(:name, "login").click select_option @driver.find_element(:css,'select'), "Walpurgis Night" @driver.find_element(:link, "New issue").click select_option @driver.find_element(:id,'issue_tracker_id'), "Feature" @driver.find_element(:id, "issue_subject").clear @driver.find_element(:id, "issue_subject").send_keys "As Incubator, I want magical girl." @driver.find_element(:id, "issue_description").clear @driver.find_element(:id, "issue_description").send_keys "foobaa" select_option @driver.find_element(:id,'issue_priority_id'), "High" select_option @driver.find_element(:id,'issue_assigned_to_id'), "qb incubator" @driver.find_element(:name, "commit").click @driver.find_element(:link, "Issues").click latest_issue = @driver.find_element(:xpath, "//table[@class='list issues']/tbody/tr[1]") assert_equal "Feature", latest_issue.find_element(:class, "tracker").text, "tracker" assert_equal "New", latest_issue.find_element(:class, "status").text, "status" assert_equal "High", latest_issue.find_element(:class, "priority").text, "priority" assert_equal "As Incubator, I want magical girl.", latest_issue.find_element(:class, "subject").text, "subject" assert_equal "qb incubator", latest_issue.find_element(:class, "assigned_to").text, "assignee" @driver.find_element(:link, "Sign out").click end def element_present?(how, what) @driver.find_element(how, what) true rescue Selenium::WebDriver::Error::NoSuchElementError false end def select_option(my_select, option_text) my_select.find_elements( :tag_name => "option" ).find do |option| option.text == option_text end.click end def verify(&blk) yield rescue Test::Unit::AssertionFailedError => ex @verification_errors << ex end end