3

Specs2 のコンテキストでは、純粋主義者は、単体テストを行うために単体テスト スタイルを使用する必要があると主張する場合があります。Specs2 の受け入れテスト スタイルは、受け入れテストを行うためのものです。それはちょっと明白に聞こえます;-)

しかし、私は単体テストを書くという受け入れテストのスタイルを好みます (主に一貫性のため)。これを行うべきではない技術的な理由はありますか?

すべてのテストを同じスタイルで書くという一貫性が気に入っていますが、ユニット テスト スタイルは、プロジェクト オーナー (それほど技術的な人ではない) にとってナビゲートするのが少し難しくなります。受け入れテスト スタイルでは、不足している機能に遭遇したときに新しいテストを追加できます。たとえば、次のようになります。

"Cool new feature" ! todo ^

以下の例からわかるように ( Specs2 サイトから改作)、特に仕様が大きくなるにつれて、受け入れテストのスタイルはオタクではない人にとってはもう少し読みやすくなり、懸念事項をより適切に分離することができます。また、より構成的なスタイルやライティング テストにつながる可能性もあります。

単体テストのスタイル:

  import org.specs2.mutable._

  class HelloWorldSpec extends Specification {

    "The 'Hello world' string" should {
      "contain 11 characters" in {
        "Hello world" must have size(11)
      }
      "start with 'Hello'" in {
        "Hello world" must startWith("Hello")
      }
      "end with 'world'" in {
        "Hello world" must endWith("world")
      }
    }
  }

受け入れテストのスタイル:

 import org.specs2._

  class HelloWorldSpec extends Specification { def is =

    "This is a specification to check the 'Hello world' string"       ^
                                                                      p^
    "The 'Hello world' string should"                                 ^
      "contain 11 characters"                                         ! e1^
      "start with 'Hello'"                                            ! e2^
      "end with 'world'"                                              ! e3^
      "do something cool"                                             ! todo^
      "do something cooler"                                           ! todo^
                                                                      end

    def e1 = "Hello world" must have size(11)
    def e2 = "Hello world" must startWith("Hello")
    def e3 = "Hello world" must endWith("world")
  }

いつの日か、文字列補間 (または何か) と追加の解析ルーチンを使用して、さらに読みやすい DSL を持つ複数のファイルで終了することさえあるかもしれません。

こんにちはTest.specs2

  s"
  This is a specification to check the 'Hello world' string
  =========================================================

  The 'Hello world' string should
  -------------------------------
  - $e1 contain 11 characters
  - $e2 && $e3 start with 'Hello' and end with 'world'
  - $todo do something cool
  - $todo do something cooler
  "

MyAppSpec2.scala

 import org.specs2._

  class HelloWorldSpec extends Specification { def is = HelloTest.specs2

    def e1 = "Hello world" must have size(11)
    def e2 = "Hello world" must startWith("Hello")
    def e3 = "Hello world" must endWith("world")
  }
4

1 に答える 1

3

単体テストの記述に「Acceptance」スタイルを使用できず、逆に単体テストの記述に「Unit」スタイルを使用できない技術的な理由はありません(コード折り畳み付きのエディターを使用してテキストのみを表示できるため、または引数を使用しplanて仕様を実行し、例を実行せずに仕様の全文を取得できます)。

ただし、注意する必要がある2つの「技術的」事項:

  • 「ユニット」仕様は変数を使用して例を登録するため、万が一、異なるスレッドでそのような仕様を作成しようとすると、並行性の問題が発生する可能性があります。

  • 「acceptance」仕様は、結果として例の最後の値を使用します。したがって、デフォルトでは、例で1行に1つの期待値を記述したい場合はあまり便利ではありません。これを回避するには、ThrownExpectation特性をミックスインするか、and期待値の間に演算子を使用する必要があります

最後に、Scala 2.10がリリースされたときに、受け入れ仕様に文字列補間を使用する可能性を確実に調査します。

于 2012-11-19T03:25:40.317 に答える