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

三相パターンでより良いテストを書く

(これはPracticing Railsからの短い抜粋です。ここでサインアップして最初の章を無料で入手してください!)

つまり、あなたは新しいアプリに取り組んでおり、Railsはあなたのためにテストを生成しました:

test / models / bug_test.rb
require 'test_helper'

class BugTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
end

コメントを外して名前を付ければ、テストを書く準備ができていますよね?しかし、それでは何ですか?最初に何を書きますか?テストコードはどのようになりますか?

単純なパターンに従うと、それらのスタブされたコード行が明確で構造化されたテストケースに変わります。

三相テストパターン

テストケースは次の3つのフェーズで機能する必要があります。

  1. 最初に、いくつかの設定(「配置」)を行います
  2. 次に、何かをします(「行為」)
  3. 次に、予想していたことが実際に発生したことを確認します。 (「アサート」)

たとえば、Rubyの配列でメソッドをテストしていると想像してください。このパターンに従うと、テストは次のようになります。

test "Array#sort will sort an array of numbers" do
  # arrange
  unsorted_array = [7, 4, 2, 3]
  
  # act
  sorted_array = unsorted_array.sort

  # assert
  assert_equal [2, 3, 4, 7], sorted_array
end

十分に単純です。 しかし、テストのすべての部分に行く場所があり、テストの各段階で、テストの書き方がほぼわかります。

場合によっては、アレンジフェーズが不要になるか、アクトフェーズとアサーションフェーズが組み合わされます。ただし、テストを作成するときに、3つのフェーズすべてについて考えることは依然として役立ちます。

アサートフェーズの落とし穴

アサートフェーズにはトリックがあります。アサートフェーズで使用したのと同じロジックを使用しないでください。 あなたは常に同じ答えへの2つの道をたどるべきです。それ以外の場合は、アサートフェーズで再度呼び出されるため、呼び出しているコードのバグに気付くことはありません。

たとえば、数学をしている場合:

test "average returns the average of a set of numbers" do
  # arrange
  numbers = [1, 2, 3, 4]
  
  # act
  average = numbers.average

  # assert
  
  # this is bad
  assert_equal [1, 2, 3, 4].average, average

  # this is better
  assert_equal 2.5, average
end

[1, 2, 3, 4].averageを呼び出す averageであるため、Assertフェーズでも問題が発生します。 ほぼ何でも返すことができます そして、その主張は依然として通過するでしょう。

ここでは、それはかなり明確です。ただし、事態がさら​​に複雑になった場合でも、同じコードを2回実行するだけではないことを確認してください。それ以外の場合は、メソッドが呼び出されたことを確認するだけです。 、期待どおりに機能したわけではありません。

通常、回答への2番目のパスを取得する最も簡単な方法は、手動で回答を見つけてハードコードすることです。 もろい場合もありますが、気付かないうちにテストを中断するよりはましです。

なぜ3つのフェーズですか?

テストをこれらの3つのフェーズに分割すると、答える質問が簡単になります。 「このテストをどのように書くべきか」の代わりに、「このテストをどのように設定する必要があるか」、「何をテストするか」、「答えはどのように見えるか」という各フェーズに焦点を当てることができます。

>

これらの質問にはまだ簡単な答えがないかもしれませんが、答えはテスト全体を一度に考えるよりもはるかに簡単です。また、運が良ければ、関連するテスト間でフェーズを共有することもできるため、次のテストの作成にかかる労力が大幅に軽減されます。


  1. Swift3でアプリを作成する方法

    Swiftは、macOSおよびiOSデバイス用のアプリを作成または作成するために使用されます。 AppleはSwiftを明示的に設計して、デバイスから最速かつ最も効率的なパフォーマンスを実現し、Swift3はすでに印象的な機能セットを拡張しています。 Swift4の新機能 「Swiftはわずか6か月前にオープンソースプロジェクトとしてリリースされました」と、Appleの言語およびランタイム担当シニアマネージャーであるTedKremenekは述べています。 「それを行うことの大部分は、GitHubに大量のソースをプッシュするだけでなく、Swiftの進化を推進する完全にオープンなコミュニ

  2. Rubyのデコレータデザインパターン

    デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli