「Rubyでテスト自動化を実現しよう」の感想・忘備録

Kindle本「Rubyでテスト自動化を実現しよう」のまとめ。

点数

78

感想

selenuim webdriverとtest-unitの使い方が書かれていた。
Jenkinsの説明もあったが、必要かどうかよくわからなかった。
また、test-unitの結果をXMLで生成するための手順もあったが、説明が雑すぎてよくわからなかった。

主な内容

assertメソッド

test-unitには多くのassertメソッドが用意されている。

assert_equal a, b
assert_not_equal a, b 
assert a
assert_match a, b
assert_raise(XxxError) do ... end

start_with?メソッド

Rubyのstart_with?メソッドは、先頭が引数文字列で始まっていればtrue、そうでなければfalseを返す。

startupメソッドとshutdownメソッド

各テストメソッドの実行前後はsetup, teardownだが、テスト全体の前後はstartup, shutdownを使うことになる。ただし、setup, teardownはインスタンスメソッドであるのに対し、startup, shutdownはクラスメソッドなので注意。 「class << self~end」の間に定義する必要がある。

class MyTestCase < Test::Unit::TestCase
  class << self
    def startup
      puts "startup"
      @@ calc = Calculator.new
    end
  end

  def test_add
    assert_equal 7, @@calc.add(5, 2)
  end
end

omitメソッドとpendメソッド

テスト項目は存在するが未実装の場合など、テストをスキップしたい場合に使う。 2つの違いは特にない。

def test_test1
  omit("not implemented yet")
end
def test_test2
  pend("not implemented yet")
end

パラメータ指定

test-unitにはdataメソッドが用意されており、引数にハッシュを渡すことでパラメータを変えてテストをすることができる。

class MyTestCase < Test::Unit::TestCase
  data(
    'test_data1' => [5, 2, 7],
    'test_data2' => [6, 2, 8]
  )
  def test_add(data)
    a, b, result = data
    calc = Calculator.new
    assert_equal result, calc.add(a, b)
  end
end
  • Rubyでは最後の引数がハッシュの場合は{}を省略できる
  • Rubyでは変数1, 変数2 = [要素1, 要素2]で配列の各要素が左辺の変数に代入される
  • Rubyではクラス定義に任意の式を書くことができ、クラス定義の際に実行される (https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html

例外テスト

assert_raiseを使って、例外発生を確認するテストを定義できる。

def test_div
  assert_equals(ZeroDivisionError) do
    calc = Calculator.new
    calc.div(5, 0)
  end
end

Jenkins

cronを使いやすくしたもので、設定や実行結果をブラウザ上で管理できる。 Jenkinsが行うタスクはプロジェクトとして管理される。
以下、手順。

  1. jenkins.warをダウンロードしてjava -jar jenkins.warを実行
  2. http://localhost.8080へアクセス
  3. プロジェクトを作成
  4. Add build step⇒Execute shellで実行コマンドをセット
  5. Configure⇒Build periodicallyで実行スケジュールをセット

テスト結果をJenkins上でグラフ表示

test-unitの結果をXMLで生成し、Jenkinsプラグインでグラフ表示する必要がある。

  1. CI::Reporterをインストール
    sudo gem install ci_reporter_test_unit
  2. テストケースのコードにrequireを追加
    require 'ci/reporter/rake/test_unit'
  3. Rakefileを作成
    rakeコマンドでテストを実行するとXMLが生成される
  4. Jenkins⇒Manage Jenkins⇒Manage Plugins⇒Available⇒jUnit plugin
  5. Execute shellのAdd post-build-actionでPublish JUnit test result reportを選択し、Test report XMLsにtest/reports/*.xmlを入力

コードカバレッジツールの活用

SimpleCovはRubyで書かれたコードカバレッジ取得ツール。

  1. インストール
    sudo gem install simplecov
  2. テストケースの先頭に追加
    require 'simplecov' SimpleCov.start

モックオブジェクトの活用

RubyではMochaライブラリを使ってモックを実現することができる。

  1. インストール
    sudo gem install mocha
  2. テストケースの先頭に追加
    require 'mocha/test_unit'
  3. モックを使いたい箇所に以下のような記述を追加
    cal = Calcilator.new calc.expects(:add).returns(200) # この行を追加することでaddの戻り値は200固定になる
    assert_equal 200, calc.add(1,2)

Selenium WebDriverのChromeでプログラム終了時にブラウザを閉じないようにする

caps = Selenium::WebDriver::Remote::Capabilities.chrome(:chrome_options => {detach: true})
driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps

https://stackoverflow.com/questions/43621277/chrome-browser-closes-automatically-after-the-program-finishes-in-cucumber-webdrhttps://stackoverflow.com/questions/43621277/chrome-browser-closes-automatically-after-the-program-finishes-in-cucumber-webdr

Selenium WebDriver参考サイト

https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings


【新しい記事】

【古い記事】

コメントを残す

メールアドレスが公開されることはありません。