テストデータを作ってテストする

testデータベースは毎回リセットされる

動作確認をしていると、あらかじめデータベースにその動きを確認するのに都合の良いデータを登録しておきたい場合もある。Railsのテスト環境では、test/fixturesフォルダ以下にテーブル名(複数形).yml、まはたテーブル名(複数形).csvという命名規則でファイルを保存しておけば、テスト起動時に、そのファイルの内容通りにデータベースを設定してくれるようだ。この仕組みによって、testデータベースは常に同じ内容にリセットされ、毎回同じ条件でテストすることが可能になる。

  • 初期状態では、以下のようなテストデータが自動生成されている。
# test/fixtures/slips.yml
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html

one:
  number: 1
  executed_on: MyString
  total_yen: 1

two:
  number: 1
  executed_on: MyString
  total_yen: 1
  • よって、前回rake test:unitsを実行した直後は、testデータベースのslipsテーブルは以下の内容にリセットされていたのだ。
sqlite> select * from slips;
id            number        executed_on   total_yen     created_at            updated_at          
------------  ------------  ------------  ------------  --------------------  --------------------
953125641     1             MyString      1             2008-03-02 17:50:37   2008-03-02 17:50:37 
996332877     1             MyString      1             2008-03-02 17:50:37   2008-03-02 17:50:37 
  • idを指定していない為なのか、通常では考えられない値になってしまっているが...。
  • idも含めてテストデータを設定するようにしてみると...
    • ここでは試しにcsvファイルで設定してみた。(1行目はフィールド名、2行目以降がフィールドに対応するデータになる。)
    • もし、slips.ymlとslips.csvが両方存在する場合は、slips.ymlの設定でリセットされる。(.ymlファイルが優先される。)
id, number, executed_on, total_yen
1, 1, 3/1, 1000
2, 2, 3/2, 2000
  • idも指定した通りの内容でデータベースがリセットされた。
sqlite> select * from slips;
id            number        executed_on   total_yen     created_at            updated_at          
------------  ------------  ------------  ------------  --------------------  --------------------
1             1             3/1           1000          2008-03-02 18:03:33   2008-03-02 18:03:33 
2             2             3/2           2000          2008-03-02 18:03:33   2008-03-02 18:03:33 

.ymlファイルの便利な使い方

  • slips.ymlファイルで以下のよう設定しておくと...
# test/fixtures/slips.yml
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html

one:
  id: 1
  number: 1
  executed_on: 3/1
  total_yen: 1000

two:
  id: 2
  number: 2
  executed_on: 3/2
  total_yen: 2000
      • yamlにおいては、コロン「:」直後の半角スペースは重要な意味を持つ。省略することは出来ない。
  • テストコードの中で、以下のように活用することができる。(ここではslips(:one)が何なのかを確認する為のテストコードになっている。)
require File.dirname(__FILE__) + '/../test_helper'

class SlipTest < ActiveSupport::TestCase
  # Replace this with your real tests.
  def test_truth
    assert true
  end
  
  def test_yaml
    assert_equal slips(:one), Slip.find(1), "yamlの:oneと、idが1のオブジェクトは同一のはず。"
  end
end
  • assert_equalメソッドは、引数1(slips(:one))と引数2(Slip.find(1))が等しいことをテストする。異なっているとfailuresに件数が報告され、引数3のメッセージも表示される。
  • 等しくないことをテストするassert_not_equalメソッドもある。
  • テストを実行すると以下のように成功した。slips(:one) = Slip.find(1)ということのようだ。
  • このことが、どんな時に便利か考えてみた。つまり、.ymlファイルを利用すれば、レコードに分かり易い名前を付けて管理することができるのだ。どのサンプルを使ってテストしているのか明確になり、テストコードが読み易くなると思う。
$ rake test:units
(in /Users/zari/railsapp/test_slip202)
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -Ilib:test "/Library/Ruby/Gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader.rb" "test/unit/slip_test.rb" 
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader
Started
..
Finished in 0.110645 seconds.

2 tests, 2 assertions, 0 failures, 0 errors