ScalaTest in sbt:タグなしで単一のテストを実行する方法はありますか?


150

sbtで実行することで、単一のテストを実行できることを知っています。

testOnly *class -- -n Tag

タグなしで単一のテストを実行するようにsbt / scalatestに指示する方法はありますか?例えば:

testOnly *class -- -X 2

「クラスの2番目のテストを実行します。何であれ」という意味になります。私たちにはたくさんのテストがあり、誰もそれらにタグを付けることを気にしませんでした、それでタグなしで単一のテストを実行する方法はありますか?


1
あなたの主題は「Scalatest-sbt」と言います。sbtがハイフンで連結されている場合、人々は通常プラグインを考えます。しかし、ただ明確にするために、あなたが使用して話しているScalaTestを SBT 0.12のようにSBTの現代版から、ではないjoshcough / scalatest-SBT Aプラグイン4年前に書かれたSBT 0.5.2-P3用。正しい?
Eugene Yokota

正しい。これは古い質問であり、それ以来、(私が知る限り)それは不可能だとわかりました。誰かが実際になんとか方法を見つけた場合に備えて、私はそれを閉じていませんが、これに答える必要はもうありません。
2013

そこでは(両方ビル・ベナーズとマークハラーズからの参加を得て)この上のスレッドですgroups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXMは、ない解決策はまだ
セス・Tisue

1
単一のテストsbt#911(github.com/sbt/sbt/issues/911)の実行に関する一般的なサポートのケースもあります。
Eugene Yokota

14
あなたはしているが、コマンドラインから実行している場合は、その注意あなたが後にすべてのものを同封する必要がsbt引用符で、例えばsbt "test-only *SingleTestSuite"
クリス・マーティン

回答:


202

これは対話モードで(ScalaTest 2.1.3以降)サポートされています。

testOnly *MySuite -- -z foo

名前にサブストリング「foo」が含まれるテストのみを実行します。

部分文字列では-tなく完全一致の場合は、の代わりに使用します-z


@SethTisue -t完全一致に使用する実際の例を投稿できますか?それを機能させることができません。
rmin

@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81。(これが問題の解決に役立つ場合は、答えを更新する方法を教えてください。)
Seth Tisue

10
明確にするために、コマンドラインから実行する場合は、単一の引数として指定する必要があります。sbt "testOnly * MySuite--z foo"
Sogartar

2
特定の統合テスト(おそらくの下に配置されているsrc/it)を実行したい場合、先頭itにを追加する必要がありtestOnlyます。たとえば、コマンドラインで:sbt "it:testOnly *MyIntegrationTestSuite"
laylaylom 2017

2
複数の部分文字列でフィルタリングするにはどうすればよいですか?テストは階層(WordSpec)にグループ化 でき、名前の部分はテストによって区切られwhenshouldテスト間で繰り返すことができます。特定のテストを1つ選択するには、「名前にこのANDとそれを含む」と言う必要があります。
Vituel

98

他の回答に伴う具体例を追加したかった

テストするクラスの名前を指定する必要があるため、次のプロジェクトがある場合(これはPlayプロジェクトです):

プロジェクトをプレイ

LoginSBTコンソールから次のコマンドを実行して、テストのみをテストできます。

test:testOnly *LoginServiceSpec

SBTコンソールの外部からコマンドを実行している場合は、次のようにします。

sbt "test:testOnly *LoginServiceSpec"

27
Upvote明らかに二重引用符が必要であるため、:sbt "test:testOnly *LoginServiceSpec"
ジェイソン・ウィーラー

5
ここで私にとって最も役立つ答え。👍ただし、コマンドは少し簡略化できます。SBTコンソール:testOnly *LoginServiceSpec、および外部:sbt "testOnly *LoginServiceSpec"
Jonik

49

テストクラス内でタグなしのテストを1つ実行する方法はわかりませんが、この質問に遭遇した人には役立つようにワークフローを提供しています。

sbtセッション内から:

test:testOnly *YourTestClass

(アスタリスクはワイルドカードですcom.example.specs.YourTestClass。フルパスを指定できます)。

そのテストクラス内のすべてのテストが実行されます。おそらくあなたは失敗したテストに最も関心があるので、失敗した実装を修正して実行します:

test:testQuick

...失敗したテストのみを実行します。(最後に実行されたtest:testOnlyコマンドの繰り返しはtest:testQuickこの場合と同じですが、テストメソッドを適切なテストクラスに分割する場合は、ワイルドカードを使用して、test:testQuick失敗したテストをより効率的に再実行できます。)

ScalaTestでのテストの命名法は、特定のテストメソッドではなくテストクラスであるため、すべてのタグなしメソッドが実行されることに注意してください。

テストクラスにテストメソッドが多すぎる場合は、それらを個別のクラスに分割するか、適切にタグを付けます。(これは、テスト中のクラスが単一責任の原則に違反しており、リファクタリングを使用している可能性があることを示す信号である可能性があります。)


10
「テストは実行されませんでした」に直面している人の場合:*YourTestClassクラス名である必要があります。ファイル名ではありません。
MKatleast3 2017

1
私にとっては、テスト専用ではなく、テスト専用でした。
Jan Clemens Stoffregen

11

タイラーの例を単純化するために。

test:-prefixは必要ありません。

だから彼の例によれば:

- sbtコンソールで:

testOnly *LoginServiceSpec

そしてターミナルで:

sbt "testOnly *LoginServiceSpec"

0

これは、ランナーの使用に関するScalatestページと-tおよび-zオプションに関する拡張ディスカッションです。

この投稿は、を使用するテストファイルで機能するコマンドを示していますFunSpec

テストファイルは次のとおりです。

package com.github.mrpowers.scalatest.example

import org.scalatest.FunSpec

class CardiBSpec extends FunSpec {

  describe("realName") {

    it("returns her birth name") {
      assert(CardiB.realName() === "Belcalis Almanzar")
    }

  }

  describe("iLike") {

    it("works with a single argument") {
      assert(CardiB.iLike("dollars") === "I like dollars")
    }

    it("works with multiple arguments") {
      assert(CardiB.iLike("dollars", "diamonds") === "I like dollars, diamonds")
    }

    it("throws an error if an integer argument is supplied") {
      assertThrows[java.lang.IllegalArgumentException]{
        CardiB.iLike()
      }
    }

    it("does not compile with integer arguments") {
      assertDoesNotCompile("""CardiB.iLike(1, 2, 3)""")
    }

  }

}

このコマンドは、iLike(SBTコマンドラインから)describeブロックで4つのテストを実行します。

testOnly *CardiBSpec -- -z iLike

引用符を使用することもできるため、これも機能します。

testOnly *CardiBSpec -- -z "iLike"

これは単一のテストを実行します:

testOnly *CardiBSpec -- -z "works with multiple arguments"

これで、「〜で始まる」という2つのテストが実行されます。

testOnly *CardiBSpec -- -z "works with"

ファイル内の-tテストを実行するオプションを取得できませんCardiBSpec。このコマンドはテストを実行しません:

testOnly *CardiBSpec -- -t "works with multiple arguments"

-tテストがdescribeブロックにネストされていない場合、オプションが機能するように見えます。別のテストファイルを見てみましょう。

class CalculatorSpec extends FunSpec {
  it("adds two numbers") {
    assert(Calculator.addNumbers(3, 4) === 7)
  }
}

-t 単一のテストを実行するために使用できます。

testOnly *CalculatorSpec -- -t "adds two numbers"

-z 単一のテストの実行にも使用できます。

testOnly *CalculatorSpec -- -z "adds two numbers"

これらの例を実行する場合は、このリポジトリを参照してください。


0

上記のすべての答えは貴重です。ここで、ScalaTestテストランナーの完全なドキュメントへのポインターを提供したかっただけです。ランナーは、上記の応答で説明されているオプションを渡すことができるアプリケーションです。ドキュメントはScalaTest Runner Optionsにあります


これは質問に対する具体的な回答ではないため、コメントとして投稿する方がよいでしょう。
jwvh

このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
Dima Kozhevin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.