プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Rspec】基本的な書き方、タグなど
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Rspec】基本的な書き方、タグなど

12.01

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

Rspecコードの基本形

Rspecの基本形は下記のようになります。

1
2
3
4
5
6
7
8
9
10
11
describe [テスト対象],type:[specの種類] do
  context [状態] do
    before do
      [事前準備]
    end
 
    it [仕様] do
      [期待動作]
    end
  end
end

RspecにはSystem SpecやModel Spec等様々なSpecの種類が存在しますが基本的にどのSpecを使う場合でも同じ感じで記述します。

構文の役割

Rspecの構文にはそれぞれ役割があるので把握しておきましょう。

describe

テスト対象の機能を記述します。

System Specでは

一連の操作により動作確認をしたい機能や処理の名前を記述します。

Model Specでは

モデルクラス名やメソッド名を記述します。

例

1
文字列に一致するメッセージを検索する

context

テストの様々な条件の概要を記述します。Rspecではcontextはdescribeのエイリアスになっているのでdescribeの代わりにcontextを使ったとしても動作はします。

例

1
2
一致するデータが見つかる時
一致するデータが見つからない時

before

テストコードを実行する前にこちらに記述された内容を実行してくれるのでテストの「前提条件」を記述するために使います。describeの中に複数のテストケースを記述する場合はこちらに事前処理をまとめて記述すれば共通化にもなります。なお、beforeの処理は後続のitの処理が実行されるたびに実行されることになります。

また、beforeブロックの中で変数を使う場合はテスト全体でアクセスできる必要があるためローカル変数ではなくインスタンス変数(@付きの変数)にする必要があります。

after

テストの後処理を記述します。Rspecではデータベースの後片付けをデフォルトでやってくれるのでこのフックを使うことはほとんどありません。

it

期待する動作の詳細や条件を記載します。実際にテストコードとして具体的に記述するのはこのブロック内になります。こちらが期待通り動作すればテスト成功の集計が1件増加することになります。例外が発生した場合はエラー(Error)、例外は起きていないが想定外の場合は失敗(Failure)にカウントされます。

なお、DBの状態は次のitが実行される場合は元に戻されるため、あるテストケースの結果によって別のテストケースが影響を受けるということが無いようになっています。(逆に言えばテストデータは他のテストケースの影響を受けないこと前提で作る必要があります。)

itの中に記述するチェック内容

一例ですが、下記のように記述をします。

1
expect(page).to have_content '内容'

expect(page)

というのがpageが画面のことを表していてpageに期待するという意味になります。RSpec2.10以前はshouldを使っていましたがメタプログラミングを使っておりバグが発生したためexpectに置き換わりました。

to_have_content '内容'

「内容」という内容がページ内にあるはずだということを指定します。これをRspecでは「マッチャ(Matcher)」といいます。

itの命名規則

英語で記述する場合は下記のように動詞から始めるのが通常のようです。

1
is invalid without a name(名前がなければ無効な状態である。)

ネストさせる。

基本的に業務ではdescribe文をネストさせて下記のように階層構造でテストコードを記述することが一般的です。

1
2
3
4
5
6
7
describe '○○アプリ',type:system do
  describe '検索' do
  end
 
  describe '登録' do
  end
end

一番外側のdescribe

Specファイルのテーマを記述します。(例で言えば○○アプリ)

内側のdescribe

細かい機能を記述します。

タグとは?

いくつかあるテストのうち特定のテストコードのみタグ付けして実行することができる機能です。

タグの書き方

タグ名にはfocusというタグ名がよく使われます。

1
2
3
4
it "仕様",タグ名:
true do
  #仕様
end

なお、タグはitだけでなく「describeブロック」や「contextブロック」にも付けることは可能です。その場合はブロック内の全テストにそのタグが適用されます。

実行方法

特定のタグを実行する

1
rspec --tag タグ名

特定のタグをスキップする

タグ名の最初にチルダを付けるとそのタグの実行だけを逆にスキップすることが可能です。

1
rspec --tag ~タグ名

スポンサーリンク
  • 2019 12.01
  • miyabisan2
  • コメントを書く
  • Rspec, Ruby, Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 06.18

    【Ruby on Rails】「コントローラー」の基本、実装方法、より良い設計方法

  2. 2019 12.01

    【Rspec】RspecのインストールやRailsで使うための準備や実行方法

  3. 2020 09.16

    【Ruby on Rails】ビューヘルパー(エスケープ関連、タグ関連など)

  4. 2020 03.21

    【RSpec】「Shoulda Matchers」について

  5. 2020 11.02

    【Ruby on Rails】「Redis」の基本、Railsへの導入

  6. 2021 01.09

    【Ruby on Rails】「bullet」、「N+1問題」について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Rspec】System Spec(システムスペック…

【Rspec】FactoryBotでデータを準備する。

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー