テストコードのいろいろをまとめます。 テスト対象スコープ理想をいえば全ての可能性を網羅することが最適ですが、事実上不可能です。 大事なのは重要もしくはミスが起こりやすいところが網羅されているかです。 少なくとも以下のポイントに当てはまるところは重点的にテストコードを書くべきです。 メソッド内にコメントを書かなければ理解できないようなメソッドロジックが複雑なためにどうしてもコメントで補記しないとわからないメソッドはどうしても存在してしまいます。 こういったメソッドはテストを書くことでさらに仕様を明確にできます。 2回以上修正したメソッドなんのミスもなく、書いた後に1度も修正しないようなメソッドよりも、書いた後に拡張した、なんらかのミスで修正したメソッド に重点的にテストは書くべきです。 外部アプリケーションと連携する部分こちらが何を想定して何が想定外なのが明確になります。 外部アプリケーションの仕様が先方都合や提供もとの都合で変更される可能性も十分あるためそのときメンテナンスコストをふくめて も十分書く価値があります。 なお、その場合、モック・スタブを使い外部アプリケーションに依存せずにテストが通ることは必須です。 基本的なこと他のテストに依存したテストコードはかかない×hogehogeのテストはhogeのテストが終わった後でないと成功しない メソッドを修正したらテストが通らなかったのでテストをコメントアウトしてコミットしない
メソッドにバグが発見されたときには、そのバグを再現するテストコードを書いた上で修正作業をするデグレ防止。 メソッドのバグだけ直すのは直したとみなしません。 1テストメソッドでテストすることは1つのみ状態が変わる場合や、前提が変わる場合などは必ず、メソッドをわけてください。 特にコントローラ系で複数のことをしようとすると正常にテスト結果がかえらない場合さえあります。 環境へ依存するコードはかかないWindowsでも、MacでもLinuxでも動くようにする fixtures のデータに極力依存しないようにする例えば特別な条件のユーザ数を出力するメソッドがあった場合、単純に数をテストするテストコードを書いた場合、テストデータを増やすたびに変更が必要なります。 テストの数がふえてくると足枷になりかねないので、極力依存しないほうがベストです。 ただこういう場合の多くは、本来テストしたいのは数ではなく、「その条件にはてまっているか?」であるので、この場合、かえってきたデータ全てがその条件をみたしているかをチェックするべきです。 なおこの場合、複数の条件があればそれを全て包括するだけのテストが書かれていることが条件です。 テストに実装をあわせないテストは本番用のデータをシュミレートして再現しますが、 テストが増えてくると実際の運用上ありえない状態を再現してしまうことがあります。 例えば A テーブル と B テーブルのあるカラムの情報はつねに一緒であるはずなのに、テストデータ上は一緒でないために本番とは違う状態になるなど。 この場合テストが通らないからといって A テーブル と B テーブルの情報が違う場合に対応できるように書き換えるアプローチはNGです。 テスト用にコードを書き換えるなければテストが通らない実装にはしないrubyは動的にメソッドを書き換える機構があったり、モック、スタブも使えるのでそれを利用しましょう。 ディレクトリルール以下のルールに従ってtestファイルを作成してください。 test/file # テストで利用するcsvなどのファイル modelの単体テストトランザクションをはさむ場合modelのテストが行われる場合、以下のような手順がふまれます。 class UnshiuTest < Test::Unit::TestCase これによりfixtureの更新処理にはロールバックではなくDBへのinsert/deleteが行われるようになります。 controllerの機能テスト共通系のメソッドをmoduleでくくりだしているので、それを利用してください。 利用例) class Hoge < Test::Unit::TestCase 詳細は以下を確認してださい lib/test_util.rb ログイン状態にするTestUtil::Base::PcControllerTest, TestUtil::Base::MobileControllerTest等を利用している場合はmodule側で AuthenticatedTestHelper をincludeしているので
個別クラスでincludeする必要はありません。 以下はそれを利用しない一般的なacts_as_authenticatedを使った場合の例です。 1. AuthenticatedTestHelperをインクルードする include AuthenticatedTestHelper 2. login_as の引数にloginのカラム値を渡してあげる。 login_as :quentin このメソッドが呼ばれたあとはログイン状態とみなします。 テスト全体でログイン状態でいたい場合は、setupに書いておけば問題ありません。 画像が関係するcontrollerのテストをする以下の説明は file_column でデータをファイルとして保持している場合です。 画像をファイルデータとして保持している場合、テストデータとして画像の実ファイルが必要になります。 def setup テスト後は必要ないので以下のようにteardownでファイルを消します def teardown テスト画像ファイルデータは下記ディレクトリ以下に格納して下さい。 test/fixture/file_column/#{model_name}/
携帯画面のテストをするagentが通常のままだとテンプレートの選択などに失敗するので偽装が必要です。 以下のようにMobileControllerTest?を継承しておくとそのへんを勝手にやってくれます。 class TestClass < Test::Unit::TestCase ただし setup メソッドで事前にリクエストにユーザエージェントを設定しているので以下のようにmoduleで定義してある上位の setupメソッドを呼び出してください。 def setup 携帯でのform内容はキャリアごとに変換がおこなわれることを忘れない日本語で何かをsubmitした場合などキャリアごとに処理方法(文字コードなど)が違います。
アプリケーション側はjpmobileがうまいことやっているので開発者はキャリアの差を意識する必要はありません。 1テストの中でpost/getするのは1つ画面の遷移が必要な場合はintegrationテストになります。複数のpost/getをするのは意味的には1のリクエストの中で複数のpost/getをしていることになるので、テストコードして正しくありません。 テストコードテクニック日本語でテストメソッドを定義する正常系だけなら test_xxx などといった形でもあまり問題はありませんが、テストパターンが増え複雑なテストになると、無駄にメソッド名が長くなったり 本来の意味がわからなくなってしまいます。そんな場合におすすめな日本語でテストメソッドを書く方法です。 define_method('test: hogehogeのテストをする')
setupやfixturesも何の問題もなく利用できます。 find_by_idを利用するfind(1) はもし id が存在しない場合やそのレコードが削除済みの場合、例外をなげてしまいます。 デフォルトで生成されるテストデータ .yml ファイルはつかわないほうがいいrails よりgenerateされたテストデータ用の fixtures ymlファイルは以下のような構文です。 one: これにそって one, two, three と増やしていくと10をこえたあたりで面倒になります。ついでにスペルミスする可能性も増えます。 1: や a: でも何の問題もないので無理に英語にする必要はありません。 |