3

多くの場合、クラスは次のような構文で記述されたテストを使用してテストされます。これは、多数のテスト フレームワーク (たとえば、Ruby の Unit::Test; またはこの例のように MiniTest) によって提供されます。

class TestLolcat < MiniTest::Unit::TestCase
  def setup
    @lolcat = Lolcat.new
  end   
  def test_that_lolcat_can_have_cheezburger
    assert_equal true, @lolcat.i_can_has_cheezburger?
  end
end

または、代わりに、重複するテスト フレームワークのセットによって提供される、2 番目の種類の構文で記述されたテストを使用します (たとえば、RSpec; またはこの例のように、再び MiniTest):

describe Lolcat do
  before do
    @lolcat = Lolcat.new
  end
  it "must be able to have cheezburger" do
    @lolcat.i_can_has_cheezburger?.must_equal true
  end
end

(おそらく、クラス メソッドと属性のテストにも適した他の構文ファミリが存在しますが、これらは私が興味を持っている 2 つです。)

私が知りたいのは、これら 2 つの構文ファミリのそれぞれの正しい名前は何ですか?

私が尋ねている理由について詳しく知りたい場合は、行の下を参照してください。


私がこの質問をしている理由は、Web を検索しても明確なコンセンサスが得られなかったからです。たとえば、MiniTest のドキュメントでは、上記の最初の構文を「単体テスト」構文、2 番目の構文を「仕様」構文と呼んでいます。対照的に、Michael Hartlは、 2 番目の種類の構文で記述されたクラス メソッドと属性のテストを「単体テスト」と説明しています。この構文で記述されたテストが、複数のクラスの相互作用から生じる高レベルの機能をテストする場合、彼はそれらを「統合テスト」と呼んでいます。

また、最初と2番目の種類の構文をそれぞれ"Test::Unit style""RSPec-esque"または"TDD"構文と"BDD"構文として説明する人も見てきました。2 番目の種類の構文の他の名前には、 'should'-like 構文およびit構文が含まれます。

私の理解 (Hartl が正しいことを漠然と示唆しています) は次のとおりです。

  • TDD練習であり、テスト構文ではありません。具体的には、通常、失敗するテスト (単体テストや統合テストなど) を作成し、テストに合格するようにコードを記述し、必要に応じてリファクタリングし、サイクルを再開するという慣行です。
  • BDDプラクティスですが、構文のテストに関する限定的な処方箋を作成します。具体的には、TDD に従いますが、テスト名の最初の単語として「should」を使用し、必要に応じてコンテキストを提供するためにテスト コードをネストするという方法です。
  • 単体テスト練習であり、テスト構文ではありません。具体的には、コードの個々のユニット (クラス メソッドや属性など) をテストする方法
  • 単体テストは、使用される構文に関係なく、単体テストの過程で記述されるテストです。
  • 統合テスト練習であり、テスト構文ではありません。具体的には、複数のクラスの相互作用から生じる高レベルの機能をテストする方法です。

ただし、これでもまだ完全には解明されていません。明らかに、私はテスト プラクティス、テスト タイプ、またはテスト構文の命名法の専門家ではありません。上記の例で示した 2 種類の構文について、私が思いついた最適な名前は、それぞれ"'assert' syntax""'it ... do' syntax"です。これらの名前が広く使用されていない限り、StackOverflow ユーザーの皆さん、アドバイスが必要です!

4

4 に答える 4

3

BDDとTDDについて少し歴史を共有すれば、物事が明らかになるかもしれません。

2003年に、TDDに選択されたユニットテストフレームワークはJUnitでした。Dan Northは、「test」の代わりに「should」を使用して、JUnitの代わりにJBehaveを書き始めました。つまり、BDD構文です。これは、Rubyで行っていること(およびRSpecが行うこと)とあまり似ていませんが、それでも、RSpecは同じもののRubyバージョンとして作成されました。JBehaveはテストコードをネストしませんでした。ユニットレベルの例では「すべき」であり、フルシステムシナリオを実行するための他のいくつかのガビンがありました。ダンはシナリオランナーをRubyに移行し、そこでRSpecストーリーランナーになり、最終的にはCucumberになりました。

したがって、「it...should」構文は間違いなくユニットレベルのBDDです。ほとんどの人はフルシステムシナリオとしてBDDに精通していますが、BDDが始まった場所ではありません。今日、BDDは実際には1つのプラクティスではありません。これは、プロジェクトのビジョン化に至るまでのミニ方法論です。そのような紛らわしいことに遭遇した場合に備えて。また、JBehave 2.0はシナリオとステップで動作するように書き直され、JUnitとMockitoがそれまでにうまく機能したため、モックフレームワークとともにユニットレベルのテストが失われました。しかし、それにもかかわらず、そこから「すべき」が始まりました。

さて...「すべき」の代わりに「しなければならない」を使用するとすぐに、 「すべき」が提供する不確実性の感覚が失われます。「should」を使用すると、多くの質問をすることができますが、その中で最も重要なのは「shouldit?」です。したがって、「should」の代わりに「must」を使用するものは、実際にはもはやBDD構文ではありません。それはハイブリッドです。

ちなみに、BDDについて話すときは「テスト」という言葉を避けようとしているので、テストの過程で作成された単体テストではありません。これらは、コードを設計する過程で記述された、クラスの動作の例です。

于 2012-06-25T08:09:19.810 に答える
3

それぞれに受け入れられている定義があるかどうかはわかりません。

私はそれらをこれらの方法で考えるのが好きです。

ミニテストバージョンはより多くの主張です

rspecバージョンは仕様の詳細です

後者は、「テスト」の強調からあなたを遠ざけ、利害関係者の観点から要件を追い出すために作成されました。

于 2012-06-21T12:08:09.657 に答える
0

ソフトウェアを扱うときは、「何を」と「どのように」を区別する必要がありますプログラムは何をすべきか、そしてどのように機能するかです。

私見では、開発のすべての段階で2つの違いを覚えておくことが重要です。この区別は、インターフェースに対するコーディング責任主導型の設計契約とアサーションによる設計、単体テストなど、いくつかの原則をサポートします。

残念ながら、2つの概念を切り離すのは必ずしも簡単ではありません。並べ替えなどの古典的な例は扱いが簡単です。並べ替え(方法)にはいくつかのアルゴリズムがあり、そのすべてが、アサーション、コントラクト、不変として簡単に表現できる要素の並べ替えられたセット(何)になります。ビジネスコードの場合、状況が不明確になる可能性があります。

私は、2つの構文が基本的に同じことを達成すると信じていますが、2番目のアプローチは、「方法」ではなく「何」の観点から考えることを容易にします。2つのステートメントを考えてみましょう。

値%2=0をアサートします

値は偶数である必要があります

それらは同じ不変条件を強制しますが、2番目のものは「何」にもっと重点を置き、より人間が読める形式になっています。

Smalltalkは、たとえばshould言葉遣いを使用しますが、テストはRubyのように命令型コードです。

SetTestCase>>testAdd
    empty add: 5.
    self should: [empty includes: 5]

残念ながら、私の余談はまだあなたの質問に答えず、コメントするには長すぎました。

于 2012-06-21T12:45:35.310 に答える
0

テスト メソッドのグローバルに受け入れられる構文名はありません。ほとんどの単体テスト ツールは、JUnit がすべてのテスト メソッド名を "test" で始めることを推奨するなど、特定の規則を推奨していますが、これは @Test アノテーションによって不要になりました。

ほとんどの単体テスト ツールは、開発者が同意する特定の規則を提案します。テスト メソッド名には構文がありません。これは、テスト メソッドの機能を簡単に把握できる開発者が対象であるためです。

テスト コンテキストでの定義を探している場合は、Gerard Meszaros による本「xUnit Test Patterns」を参照してください。著者は、さまざまな用語についていくつかの説明を提供しています。彼の「テストダブル」の定義は、何度か言及されています。

于 2012-06-21T12:43:21.043 に答える