2013年11月25日月曜日

Railsでcapybaraとrspecを使ってExcelに出力する

Gemfileの設定
group :development do
  gem "rspec"
  gem "rspec-rails"
  gem "mocha"
  gem "axlsx"
  gem 'capybara'
  gem 'capybara-webkit'
  gem 'turnip'
  gem 'selenium-webdriver'
end
bundle install
spec/spec_helperの設定
  
  def excel
    @@excel ||= Axlsx::Package.new
  end
  def font1(v=nil)
    if v
      f = Struct.new(:value)
      @@font1 = f.new(v)
    else
      @@font1
    end
  end

  def font2(v=nil)
    if v
      f = Struct.new(:value)
      @@font2 = f.new(v)
    else
      @@font2
    end
  end

  def wb
    @@wb = excel.workbook
    font1(@@wb.styles.add_style :sz => 15, :name => "MS Pゴシック")
    font2(@@wb.styles.add_style :sz => 15, :name => "MS Pゴシック", :bg_color => "FFFF0000")
    @@wb
  end

  def worksheet
    @@worksheet ||= wb.add_worksheet(name: 'test')
  end

  config.before(:suite) do
    worksheet.add_row(['検証項目', '○/×'], :style => font1.value)
  end

  # テスト実行後に成否を取得してレポートに記入する
  config.after(:each) do
    # テストの検証項目名を取得する
    description = self.example.full_description
    if self.example.metadata[:description].empty?
      description += RSpec::Matchers.generated_description
    end

    #Modelの英語表記を日本語に返還
    Module.constants.select do |constant_name|
      constant = eval constant_name.to_s
      if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
        description.gsub!(/#{constant}/, constant.model_name.human)
      end
    end
    # テスト実行時に発生した例外を取得する
    exception = self.example.exception

    if exception
      worksheet.add_row([description, 'x'], :style => font2.value)
    else
      worksheet.add_row([description, 'o'], :style => font1.value)
    end
  end

  # テスト実行後に xlsx ファイルを保存する
  config.after(:suite) do
    excel.use_shared_strings = true # for Numbers
    excel.serialize("#{Time.new.strftime("%Y-%m-%d-%H:%M:%S")}_test_report.xlsx")
  end

  Dir.glob("spec/**/*steps.rb") { |f| load f, true }

  require 'capybara/dsl'
  require 'capybara/rspec'
  require 'capybara/webkit'
#  require 'capybara/poltergeist'
  require 'rspec/rails'
  require 'rspec/autorun'
  require 'turnip'
  require 'turnip/capybara'
  Capybara.default_driver = :selenium

spec/features/login.featureにシナリオを書く
  Feature: ポータル画面からログイン
  Scenario: トップページが正しく表示されることを確認
    When トップページを表示する
    Then QAポータルと表示されていること
    Then ログインと表示されていること

  Scenario: トップページからログインする
    When トップページを表示する
    Then idとpasswordを入力する
    Then ログインボタンをクリックする
    Then 画面にユーザ一覧が表示されていること
    Then ユーザ一覧をクリックする
    Then 所属会社と表示されていること

  Scenario: トップページからログインしてログアウトする
    When トップページを表示する
    Then idとpasswordを入力する
    Then ログインボタンをクリックする
    Then 画面にユーザ一覧が表示されていること
    Then ログアウトをクリックする
    Then ログインと表示されていること
spec/steps/login.steps.rbにソースを書く
#encoding: utf-8
step "トップページを表示する" do
  visit 'http://localhost:3000/users/sign_in'
end

step "QAポータルと表示されていること" do
  expect(page).to have_content('QAポータル')
end

step "ログインと表示されていること" do
  expect(page).to have_content('ログイン')
end

step "idとpasswordを入力する" do
  fill_in 'user_email', :with => 'joji.urano@gree.net'
  fill_in 'user_password', :with => 'akagisigeru'
end

step "ログインボタンをクリックする" do
  click_button "ログイン"
  sleep 1
end

step "画面にユーザ一覧が表示されていること" do
  expect(page).to have_content('ユーザ一覧')
end

step "ユーザ一覧をクリックする" do
  click_link "ユーザ一覧"
  sleep 1
end

step "所属会社と表示されていること" do
  expect(page).to have_content('所属会社')
end

step "ログアウトと表示されていること" do
  expect(page).to have_content('ログアウト')
end

step "ログアウトをクリックする" do
  click_link "ログアウト"
  sleep 1
end

step "ログインと表示されていること" do
  expect(page).to have_content('ログイン')
end
テストコマンドで実行
rspec -r turnip/rspec spec/features/login.feature 

0 件のコメント: