RegressyCommon

RegressyCommonは、Regressyでe2eテストを構築するためのライブラリです。

Ruby言語とtest-unitフレームワークを利用して、e2eテストを構築します。

インストール

Gemfileに追加し、bundleを実行します。

gem 'regressy_common'

And then execute:

$ bundle

Or install it yourself as:

$ gem install regressy_common

使い方

RegressyCommonは、ページオブジェクトモデルに基づくe2eテスト構築を支援するライブラリです。

ページオブジェクト、テストセット、テストスイートでテスト全体を構成します。

ディレクトリ構成

ディレクトリ構成の例を以下に示します。

your-e2e-project
├── app
│   ├── pages        # ここにページオブジェクトを格納します。
│   ├── test_sets    # ここにテストセットを格納します。
│   ├── test_suites  # ここにテストスイートを格納します。
│   :
└── config
  • ページオブジェクト: テスト対象サイトのページに対応するオブジェクト。 1ページに対して1オブジェクトが対応します。
  • テストセット: 関連した一連のテストの集合。 test-unit における TestCaseに相当。 ここで定義したテストからページオブジェクトを操作し、テストを実行します。
  • テストスイート: 関連した一連のテストセットの集合。 ここで定義したテストスイートから、関連するテストセットを操作します。

ページオブジェクト

  • ページを司るオブジェクトです。
  • テスト対象のサイトを構成する1ページに対して1オブジェクトを定義します。
  • 以下にページオブジェクトの基底クラスを例示します。
require 'test/unit'
require 'regressy_common'
module Pages
  class Base
    include Test::Unit::Assertions
    include RegressyCommon::Checker
    include RegressyCommon::Clicker
    include RegressyCommon::Sender
    include RegressyCommon::Selector

    def initialize(test_case)
      @test_case   = test_case
      @driver      = test_case.driver
      @target_host = test_case.target_host
    end

    def logger
      RegressyCommon::Utils::StandardLogger.instance
    end

    def take_snap(tag=nil)
      tag ||= %(#{self.class.name}##{caller_locations(1).first.label})
      RegressyCommon::SnapShot.new(@driver, tag).take_and_store
    end

    def set_window_size
      @driver.manage.window.resize_to(1600, 1024)
    end

    def access_to_target_page
      @driver.get(page_url)
      assert_element_exists(:xpath, xpath_page_title)
    end

    protected

    def page_url
      raise "should implement this method"
    end
    def xpath_page_title
      raise "should implement this method"
    end
  end
end
  • そして、基底クラスを継承するページクラス。
require 'pages/base'
class Pages::Index < Pages::Base

  def execute_search(word)
    assert_element_present(:xpath, xpath_search_input )
    send_keys(:xpath, xpath_search_input, word)
    retry_click(:xpath, xpath_search_submit)
    assert_element_present(:xpath, xpath_search_result)
  end

  protected

  def page_url
    %(#{@test_case.target_host}/)
  end
  def xpath_page_title
    %(//title[contains(text(), "Yahoo! JAPAN")])
  end
  def xpath_search_input
    %(//input[@type="search"])
  end
  def xpath_search_submit
    %(//button[@type="submit"])
  end
  def xpath_search_result
    %(//a[contains(@href, "regressy")])
  end
end

テストセット

  • テストの例。

    require 'regressy_common'
    require 'pages/index'
    class SampleTest < RegressyCommon::TestSets::Base
    def setup
    @target_host = 'https://yahoo.co.jp'
    super
    end
    def test_01_search
    index_page = Pages::Index.new(self)
    index_page.access_to_target_page
    index_page.take_snap
    
    index_page.execute_search("regressy")
    end
    end
    

テストスイート

  • テストスイートの例。 ``` require 'test/unit' require 'test/unit/testsuite' require 'test/unit/ui/console/testrunner' require 'test_sets/sample_test'

regression_test = Test::Unit::TestSuite.new("regression test") regression_test << SampleTest.suite # default local chrome regression_test << SampleTest.suite_with_capability(:local_firefox)

Test::Unit::UI::Console::TestRunner.run(regression_test)

ここで、ブラウザの種類を指定します。

## テストの実行

ruby app/test_suites/regression_test.rb

Loaded suite regression test Started ..

Finished in 33.660497466 seconds.

2 tests, 8 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications

100% passed

0.06 tests/s, 0.24 assertions/s


## ページオブジェクトで使用する共通機能

- checker
- clicker
- sender
- selector


## Development

After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/regressy_common. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).

## Code of Conduct

Everyone interacting in the RegressyCommon project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/regressy_common/blob/master/CODE_OF_CONDUCT.md).