酔いどれエンジニアのブログ

有限会社wisdomのスタッフブログです。主にプログラミングやアプリケーション開発の話題を書いていきます。

ブログシステムを作りながらRailsを学ぶ(9) ユースケースシナリオに対するテストのfeature(Turnip)を作成する

前回、「記事を閲覧する」のユースケースシナリオを記述しました。 そして第6回にはTurnipというテストツールをインストールを入れました。 今回はユースケースシナリオを元にTurnipで動くテストを記述していきます。

まずはユースケースシナリオを見返してみます。

ユースケースシナリオを見返す

■ 基本フロー
1. ユーザーはブログシステムにアクセスする。
2. システムはブログの記事一覧を表示する。(ex-1
3. ユーザーは見たい記事の「もっと見る」リンクを押下する。
4. システムは選択された記事の詳細を表示する。(ex-2

■ 代替フロー
ex-1) 記事が1件もなかった場合
1. システムは登録されている記事がない旨を表示する。
2. このユースケースを終了する。

ex-2) 選択された記事が削除されていた場合
1. システムは選択した記事は削除された可能性がある旨を表示する。
2. このユースケースを終了する。

■付帯事項
・一覧は登録日時順が新しいものから順に表示する。
・一覧に一度に表示する記事の数は20件。
・一覧に表示している記事より古い記事が存在する場合「古い記事」リンクが表示される。
 「古い記事」を押すと表示している記事より古い20件までの記事が表示される。
・一覧に表示している記事より新しい記事が存在する場合「新しい記事」リンクが表示される。
 「新しい記事」を押すと表示している記事より新しい20件までの記事が表示される。

大きく見て基本フロー1つと、代替フロー2つの、3つのパターンがあることがわかります。
また、付帯情報から、20件が境界値となり、テストパターンが作られることが分かると思います。
ただし、これらを確認するテストケースを今から作るケースに全て入れてしまうと、テストケースが膨れ上がってしまうため、別のテストフェーズで行うべきかもしれません。
これらのことを加味してテストを作って行きます。

テストに関係するフォルダとファイルを作成する

hoge-blog配下に以下の様にファイルとフォルダを作成します。

hoge-blog
  - spec
    - features
      - articles_index.feature
    - steps
      - articles_index_steps.rb
    - spec_helper.rb
spec
rspecコマンド実行時にデフォルトでテストを検索しにいくフォルダ
features
featureファイルを格納するフォルダ。
featureファイルにはその機能が実装できたと言う基準となるシナリオを記述します。
steps
stepsファイルを格納するフォルダ。 stepsファイルにはfeatureに記述するステップの実態を記述します。
spec_helper.rb
テストに対する共通の設定などを記述します。

featureファイルにフローに対応するシナリオを記述する

基本フローと代替フローをに対応するシナリオを記述すると以下のようになる。

# encoding: utf-8
# language: ja

機能: 記事を閲覧する 
シナリオ: 記事を正常に閲覧する
  前提 テストデータは20件データを使用する

  もし ブログシステムにアクセスする
  ならば 記事が20件表示されている

  かつ 18件目の記事の「もっと見る」リンクを押下する
  ならば 18件目の記事の内容が表示される

シナリオ: 記事が1件もなかった
  前提 テストデータは0件データを使用する

  もし ブログシステムにアクセスする
  ならば 「まだ記事は書かれていません」と表示される

シナリオ: 選択された記事が削除されていた
  前提 テストデータは20件データを使用する

  もし ブログシステムにアクセスする
  ならば 記事が20件表示されている

  かつ 18件目の記事をデータベースから削除する
  かつ 18件目の記事の「もっと見る」リンクを押下する
  ならば 「この記事は削除された可能性があります。」と表示される

それでは実行してみましょう

$ rspec

#.rspecファイルを作ってない場合
$ rspec -r turnip/rspec  

#specフォルダ配下に作ってないか、任意のものだけ実行したい場合
$ rspec  spec/features/articles_index.feature 

#フル指定。
$ rspec  -r turnip/rspec spec/features/articles_index.feature 

実行結果が以下のようになったと思います。 コメントを見るとわかるようにアクションや判定にあたる箇所に対応するStepが見つからなかったため、Pendingされてしまいますが、今はこれでOKです。

***

Pending:
  記事を閲覧する 記事を正常に閲覧する テストデータは20件データを使用する -> ブログシステムにアクセスする -> 記事が20件表示されている -> 18件目の記事の「もっと見る」リンクを押下する -> 18件目の記事の内容が表示される
    # No such step: 'テストデータは20件データを使用する'
    # ./spec/features/articles_index.feature:68
  記事を閲覧する 記事が1件もなかった テストデータは0件データを使用する -> ブログシステムにアクセスする -> 「まだ記事は書かれていません」と表示される
    # No such step: 'テストデータは0件データを使用する'
    # ./spec/features/articles_index.feature:68
  記事を閲覧する 選択された記事が削除されていた テストデータは20件データを使用する -> ブログシステムにアクセスする -> 記事が20件表示されている -> 18件目の記事をデータベースから削除する -> 18件目の記事の「もっと見る」リンクを押下する -> 「この記事は削除された可能性があります。」と表示される
    # No such step: 'テストデータは20件データを使用する'
    # ./spec/features/articles_index.feature:68

Finished in 0.0016 seconds
3 examples, 0 failures, 3 pending

付帯事項を加味したシナリオを付け加える

それでは更に付帯事項をテストケースにつけてもう少し複雑にしてみます。 加える点は以下の通りです。

  • 表示順が新しいものからになっているか
  • 一度に表示さている記事の数は20件か
  • 古い記事が存在する場合「古い記事」リンクが表示されるか
  • 「古い記事」を押すと古い記事が表示されるか
  • 新しい記事が存在する場合「新しい記事」リンクが表示されるか
  • 「新しい記事」を押すと新しい記事が表示されるか
# encoding: utf-8
# language: ja

機能: 記事を閲覧する 
シナリオ: 記事を正常に閲覧する
  前提 テストデータは20件データを使用する

  もし ブログシステムにアクセスする
  ならば 20件目から1件目までの記事が順番に表示されている
  かつ「古い記事」リンクが表示されていない
  かつ「新しい記事」リンクが表示されていない


  かつ 18件目の記事の「もっと見る」リンクを押下する
  ならば 18件目の記事の内容が表示される

シナリオ: 記事を迷いながらも正常に閲覧する
  前提 テストデータは50件データを使用する

  もし ブログシステムにアクセスする
  ならば 50件目から31件目までの記事が順番に表示されている
  かつ「古い記事」リンクが表示されている
  かつ「新しい記事」リンクが表示されていない

  かつ 「古い記事」リンクを押下する
  ならば 30件目から11件目までの記事が順番に表示されている
  かつ「古い記事」リンクが表示されている
  かつ「新しい記事」リンクが表示されている

  かつ 「古い記事」リンクを押下する
  ならば 10件目から1件目までの記事が順番に表示されている
  かつ「古い記事」リンクが表示されていない
  かつ「新しい記事」リンクが表示されている

  かつ 「新しい記事」リンクを押下する
  ならば 30件目から11件目までの記事が順番に表示されている
  かつ「古い記事」リンクが表示されている
  かつ「新しい記事」リンクが表示されている

  かつ 18件目の記事の「もっと見る」リンクを押下する
  ならば 18件目の記事の内容が表示される


シナリオ: 記事が1件もなかった
  前提 テストデータは0件データを使用する

  もし ブログシステムにアクセスする
  ならば 「まだ記事は書かれていません」と表示される

シナリオ: 選択された記事が削除されていた
  前提 テストデータは20件データを使用する

  もし ブログシステムにアクセスする
  ならば 20件目から1件目までの記事が順番に表示されている

  かつ 18件目の記事をデータベースから削除する
  かつ 18件目の記事の「もっと見る」リンクを押下する
  ならば 「この記事は削除された可能性があります。」と表示される

付け加えたら実行して記述ミスがないことを確認します。

$ rspec

リモートリポジトリに送信する

ここまでで今回は終了ですので、変更をリモートリポジトリに送っておきましょう。

$ git add .
$ git commit -am "ユースケースシナリオに対するテストのfeatureを作成する"
$ git push origin edit_articles_index