例を含む最も信頼のおけるRSpecチュートリアル
RSpecを使用してRubyアプリケーションのテストを作成する方法を学びたいですか?
次に、適切な場所にいます !
このチュートリアルでは、その方法を説明します。
コンテンツ
- 1なぜテストを書く必要があるのですか?
-
- 1.0.1エラーに対するセーフティネットを構築します(特にリファクタリングに役立ちます)
- 1.0.2コードの文書化に役立ちます
- 1.0.3フィードバックループを提供します
- 1.0.4コードが期待どおりの結果を生成していることを確認するのに役立ちます
- 1.0.5Rubyの仕事に着手するのに役立ちます
-
- 2RSpec入門
- 3RSpecテストの例
- 4RSpecLetメソッド
- 5サブジェクトメソッドの使用方法
- 6すべてのテストの前にコードを実行する方法
- 7テストサブグループを作成する方法
- 8テストを一時的に無効にする方法
- 名前による9つの実行例
- 10のRSpecの期待とマッチャー
- 11RSpecフォーマッター
- 12遅いテストを見つける方法
- 13RSpecビデオチュートリアル
- 14まとめ
- 14.1関連
なぜテストを書く必要があるのですか?
その理由は次のとおりです。
エラーに対するセーフティネットを構築します(特にリファクタリングに役立ちます)
テストスイートがない場合は、何かが壊れる恐れがあるため、コードに触れたくないでしょう…
…テストを受けると自信が増します!
コードの文書化に役立ちます
テストでは、アプリケーションが何をすべきかを説明します。
フィードバックループを提供します
TDDを実行している場合、フィードバックループが発生します これは、次に何に焦点を当てるべきかを教えてくれます。気が散りやすい場合に役立ちます。
コードが期待どおりの結果を生成していることを確認するのに役立ちます
これは重要です!
複雑なロジックを記述している場合は、さまざまな入力で機能することを確認する必要があります &あなたが思いついた1つの例だけではありません。
テストは、コーナーケースを発見して文書化するのに役立ちます。
Rubyの仕事に着手するのに役立ちます
ほとんどの求職者はあなたのテストスキルを高く評価し、仕事に着手する可能性を高めます。
RSpec入門
RSpecがどのように機能するかを理解するために、ステップバイステップの例を見ていきましょう。 。
階乗数を見つける簡単なアプリケーションを作成します。
最初のステップ :
require 'rspec/autorun' describe Factorial do # ... end
これは、最初の RSpecを作成するための最初のコードです。 テスト。
rspecgemが必要です。
次に、describe
を作成する必要があります ブロックしてすべてのテストをグループ化します &テストしているクラスをRSpecに通知します。
次はit
ブロック:
describe Factorial do it "does something" do # ... end end
これはテスト名であり、すべてのコンポーネントをグループ化する方法です。 テスト自体の。
コンポーネントは次のとおりです。
- セットアップ
- 演習
- 確認
セットアップは、オブジェクトを作成する場所です。 作成する必要があります。
準備段階です。
次に、実行するメソッドを呼び出して、その戻り値を取得します。
最後に、期待を込めて結果を確認します (RSpec)またはアサーション(ミニテスト)。
RSpecテストの例
ここで、階乗法を記述したい場合は、オンラインまたは手動計算でいくつかの有効な値を見つける必要があります。
次に、それらをテストで使用します。
このように :
describe Factorial do it "finds the factorial of 5" do calculator = Factorial.new expect(calculator.factorial_of(5)).to eq(120) end end
このコードを(通常のRubyプログラムのように)実行すると、次のようになります。
uninitialized constant Factorial (NameError)
Factorial
がないため、これは正常です。 まだクラスです。
作成しましょう:
class Factorial end
次のエラーは次のようになります:
undefined method 'factorial_of'
factorial_of
を作成してこれを修正します 方法:
class Factorial def factorial_of end end
次に、コードを再度実行します:
wrong number of arguments (given 1, expected 0)
別のエラー!しかし、あなたは何を知っていますか?
それは良いことです 🙂
エラーはイライラするものではありません。
フィードバックです。
今:
factorial_of
にメソッド引数を1つ追加します 方法:
class Factorial def factorial_of(n) end end
今得られるのはテストの失敗です :
expected: 120 got: nil
これはまさにこの時点であなたがなりたい場所です!
次のタスクは、メソッドを実装することです:
class Factorial def factorial_of(n) (1..n).inject(:*) end end
そして、最初の合格テストを取得します :
. Finished in 0.00315 seconds (files took 0.09083 seconds to load) 1 example, 0 failures
これは、テスト駆動開発(TDD)と呼ばれるものです。
最初にテストを作成し、次にテストで次に何をする必要があるかをガイドします。
RSpecLetメソッド
多くのテストを作成し、同じオブジェクトを再利用する場合 これらのオブジェクトはlet
で定義できます ステートメント。
次のようになります:
describe Factorial do let(:calculator) { Factorial.new } it "finds the factorial of 5" do expect(calculator.factorial_of(5)).to eq(120) end end
これで、calculator
を再利用できます 同じdescribe
でのすべてのテストで ブロック。
let
について知っておくべきことの1つ それは「怠惰」だということです。
それはどういう意味ですか?
オブジェクトは、初めて使用するまで作成されません 。
これは、このオブジェクトの作成にデータベースエントリの作成やファイルへの書き込みなどの副作用がある場合に、違いを生む可能性があります。
これらの副作用を回避するのが最善ですが、それができない場合は、let!
を使用してください。 メソッド。
例 :
let!(:user) { User.create("[email protected]") }
let!
メソッドは遅延しないため、テストを実行する前にオブジェクトが作成されます。
サブジェクトメソッドの使用方法
let
の別のバージョン subject
です 。
唯一の違いは、subject
を1つしか持てないことです。 、そしてそれはインスタンスであることを意味します テストしているメインオブジェクトの。
RSpecはすでにデフォルトのsubject
を作成しています このように:
subject { Factorial.new }
これは「暗黙の主題」と呼ばれます。
次のように使用できます:
describe Factorial do it "finds the factorial of 5" do expect(subject.factorial_of(5)).to eq(120) end end
件名に名前を付けることができます:
subject(:calculator) { Factorial.new }
これは、let
を使用する場合と同じように動作します 、ただし、1行の期待値を使用できるようにします:
it { should be_empty }
すべてのテストの前にコードを実行する方法
RSpecには、すべてのテストの前後、またはテストのグループ全体を実行するために使用できる実行フックがあります。
例 :
describe Shop do before(:all) { Shop.prepare_database } after (:all) { Shop.cleanup_database } end
各例(example =RSpecでのテスト)に対してこのコードを実行する場合は、:each
を使用できます。 :all
の代わりに 。
テストサブグループを作成する方法
アプリでさまざまなシナリオをテストしている場合は、関連するテストをグループ化すると役立つ場合があります。
これは、コンテキストブロックを使用して行うことができます RSpecで。
次に例を示します:
describe Course do context "when user is logged in" do it "displays the course lessons" do end it "displays the course description" do end end context "when user it NOT logged in" do it "redirects to login page" do end it "it shows a message" do end end end
テストを一時的に無効にする方法
デバッグ目的でテストを無効にすることができます。
あなたがしなければならないのはit
を変更することだけです xit
へ 無効にしたいテストの場合。
例 :
xit "eats lots of bacon" do end
x
を削除することを忘れないでください 終わったら!
名前による例の実行
テストを無効にする代わりに、-e
を使用して実行するテストをフィルタリングできます。 フラグ。
例 :
> ruby person.rb -e bacon
このフィルタリングはテスト名に基づいているため、上記の例では、「ベーコン」という単語が含まれるすべてのテストに一致します。
RSpecの期待とマッチャー
私たちが使用してきたこの例を覚えているかもしれません:
expect(calculator.factorial_of(5)).to eq(120)
しかし、このeq(120)
とは何ですか 一部?
ええと、120は私たちが期待している値です…
…およびeq
これがマッチャーと呼ばれるものです。
マッチャーは、RSpecがメソッドの出力を比較する方法です。 期待値で 。
eq
の場合 、RSpecは==
を使用します 演算子(Ruby演算子の詳細を読む)。
しかし、他のマッチャーがいます 使用できます。
たとえば、be_something
マッチャー:
expect(nil).to be_nil
something
述語メソッドです(empty?
など) )テスト結果で呼び出されます。
その他の便利なマッチャー:
- インクルード(配列とハッシュの場合)
- start_with
- end_with
- match(正規表現マッチングの場合)
- be_between
- have_key / have_value(ハッシュ用)
- be_instance_of
- response_to
- have_attributes(インスタンス変数をテストするため)
特別な注意が必要なマッチャー raise_error
です マッチャー。
その理由は、それを使用するには、期待をブロック内にラップする必要があるためです。
このように :
expect{ :x.count }.to raise_error(NoMethodError)
change
マッチャーも次のように機能します:
expect{ stock.increment }.to change(stock, :value).by(100)
RSpecフォーマッター
デフォルトのRSpec出力は「進行状況」形式です。
この形式では、ドット(.
)が表示されます )それぞれ1つの合格テスト、F
を表す 失敗したテスト(予想と実際は一致しない)、またはE
エラーの場合。
ただし、使用できる別のフォーマットオプションがあります。
リストは次のとおりです:
- 進捗状況
- ドキュメント
- json
- html
-fフラグを使用して有効にできます:
> ruby factorial.rb -f d Person eats lots of healthy food writes many articles Finished in 0.00154 seconds (files took 0.09898 seconds to load) 2 examples, 0 failures
ドキュメント形式では、テストの説明を使用して出力を生成します。
遅いテストを見つける方法
RSpecには、テストのプロファイルを作成するための非常に便利なオプションが付属しています。 。
--profile
を渡すだけ フラグを立てると、各テストの実行にかかる時間を確認して、非常に遅いテストを修正できます。
ここに例があります :
> ruby factorial.rb --profile Factorial finds the factorial of 5 0.00043 seconds
RSpecビデオチュートリアル
概要
RSpecテストフレームワークを使用してテストを作成する方法を学習しました。
今度はあなた自身のテストを書き始める番です!
-
6 つの実用的な例を含む Bash シェル関数のチュートリアル
Bash シェル関数は、グループに単一の名前を使用して、後で実行するために複数の UNIX / Linux コマンドをグループ化する方法です。 . Bash シェル関数は、通常の Unix コマンドと同じように実行できます。シェル関数は、それらを解釈するための新しいプロセスを作成することなく、現在のシェル コンテキストで実行されます。bash エイリアスと関数の両方を使用すると、より長い、またはより複雑なコマンドのショートカットを定義できます。ただし、エイリアスは、このチュートリアルで説明されているように、これらの関数が許可する制御フロー、引数、およびその他の巧妙なものを許可しません。 この
-
5 つの実用的な例を含む Bash スクリプト入門チュートリアル
進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取