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

ミニテストの仕組みの簡単な分析

ミニテストとは何ですか?

MinitestはRubyテストライブラリです 、コードTDDスタイルのテストを作成できます。

これは、Rails&DHHのお気に入りのデフォルトのテストフレームワークです。

一部の人々は、その単純さと、主要な代替手段(RSpec)と比較してコードが少ないことからそれを好みます。

この写真でわかるように

ミニテストの仕組みの簡単な分析

さて、この投稿は、どちらを選ぶべきか、どちらが「より良い」かについてではありません。

この投稿は、ミニテストの仕組みに関するものです。 。

疑問に思っている場合:一番好きな方を使用してください。ただし、両方に精通している必要があります🙂

物事がどのように機能するかを学びたい場合は、この投稿をお楽しみください…

どのテストライブラリがお気に入りかは関係ありません!

フードの下を見てみましょう

人々が(私を含めて)推奨することの1つは、ソースコードを読むことです。これは、物事がどのように機能するかを学ぶのに最適な方法だからです また、これまでに見たことのない新しいRubyのトリックを見つけるのに最適な方法です。

それが私がMinitestで行ったことであり、私が学んだことをあなたと共有するつもりです。

実際のテストコードから始めて、これがMinitestの動作とどのように関連しているかを説明します。

class Thingy < Minitest::Test
  def test_it_works
    assert_equal 1, 1
  end
end

では、Minitestはこれらのテスト方法(test_it_worksなど)をどのように見つけますか )&それらを実行しますか?

答えは、メタプログラミングの「魔法」のほんの少しです:

def self.methods_matching(re)
  public_instance_methods(true).grep(re).map(&:to_s)
end

これはRunnableから来ています lib/minitest.rbで定義されているクラス 。このコードは、現在のクラスのすべてのインスタンスメソッドを検索し、正規表現に一致するものを選択します。

したがって、methods_matching(/^test_/)を呼び出すと test_で始まるすべてのメソッド名を含む配列を取得します 。

ミニテストの仕組み

Minitestはこれらのtest_を見つけます メソッドを呼び出してから呼び出します。

これはlib/minitest/test.rbで発生します ファイル(より具体的には、runnable_methods メソッド。メソッドのリストもランダムな順序で返します。

重要なポイント
これは、Minitest::Testが原因で機能します Runnableのサブクラスです 。

パズルの最後のピースはrunです Runnableのクラスメソッド 、追加のフィルタリングを実行してから、run_one_methodを呼び出します すべてのメソッド名とレポーターオブジェクトを使用します。

コードは次のとおりです

filtered_methods.each do |method_name|
  run_one_method self, method_name, reporter
end

そして、これはrunを呼び出すことになります Minitest::Testのインスタンスメソッド :

capture_exceptions do
  before_setup; setup; after_setup

  self.send self.name
end

Sendは、文字列または記号を使用して任意のオブジェクトで別のメソッドを呼び出すことができるメタプログラミングメソッドです。

capture_exceptions ブロックは、コードによって発生したテストの失敗と例外を記録するために使用されます。

def capture_exceptions # :nodoc:
  yield
rescue *PASSTHROUGH_EXCEPTIONS
  raise
rescue Assertion => e
  self.failures << e
rescue Exception => e
  self.failures << UnexpectedError.new(e)
end

これが私がコードを読み、読んでいるコードの1つの側面または機能に焦点を合わせ、玉ねぎのように層を剥がし続けるのが好きな方法です。

このyieldキーワードのように、何かが何を意味するのかわからない場合は、調べてください。

これは学習プロセスの一部です!

結論

この投稿では、Minitestがメタプログラミングを使用してテストメソッドを見つけて呼び出す方法を学びました。また、テストエラーと例外がレポート用の配列にキャプチャされる方法も学びました。

この種の「コード分析」記事が好きですか?

コメントで教えてください🙂

また、お気に入りのソーシャルネットワークでこれを共有することを忘れないでください スキルの向上を目指している7000人以上のRuby開発者にまだ参加していない場合は、以下のニュースレターを購読してください。


  1. Rubyでの静的分析

    ソースコードを解析して、すべてのメソッド、それらが定義されている場所、およびそれらが取る引数を見つけたいとします。 どうすればこれができますか? あなたの最初のアイデアはそれのために正規表現を書くことかもしれません… しかし、もっと良い方法はありますか? はい! 静的分析 は、ソースコード自体から情報を抽出する必要がある場合に使用できる手法です。 これは、ソースコードをトークンに変換する(解析する)ことによって行われます。 さっそく始めましょう! パーサージェムの使用 Rubyには標準ライブラリで利用可能なパーサーがあります。名前はRipperです。出力を操作するのは難し

  2. Excel にデータ分析を追加する方法 (2 つのクイック ステップ)

    データ分析 は、複雑な統計および財務分析を実行するのに役立つ Excel アドイン プログラムです。 相関などのいくつかの数学演算が簡単になりました 、フーリエ解析 、移動平均 、回帰 など。デフォルトでは、 Data Analysis Toolpak インストールされていません。プラグインをインストールすると、 Data に表示されます。 タブ。この記事では、 Data Analysis Toolpak を追加する方法を紹介します。 エクセルで。それでは、これ以上の議論はせずに始めましょう。 データ分析ツールパックの基本 データ分析ツールパック は、統計および財務分析のためのデータ分