Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

例を含む最も信頼のおける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("rspec@rubyguides.com") }

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テストフレームワークを使用してテストを作成する方法を学習しました。

今度はあなた自身のテストを書き始める番です!


  1. 6 つの実用的な例を含む Bash シェル関数のチュートリアル

    Bash シェル関数は、グループに単一の名前を使用して、後で実行するために複数の UNIX / Linux コマンドをグループ化する方法です。 . Bash シェル関数は、通常の Unix コマンドと同じように実行できます。シェル関数は、それらを解釈するための新しいプロセスを作成することなく、現在のシェル コンテキストで実行されます。bash エイリアスと関数の両方を使用すると、より長い、またはより複雑なコマンドのショートカットを定義できます。ただし、エイリアスは、このチュートリアルで説明されているように、これらの関数が許可する制御フロー、引数、およびその他の巧妙なものを許可しません。 この

  2. 5 つの実用的な例を含む Bash スクリプト入門チュートリアル

    進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取