web-dev-qa-db-ja.com

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

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

testOnly *class -- -n Tag

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

testOnly *class -- -X 2

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

130
Nacht

これは(ScalaTest 2.1.3以降)以下でサポートされています:

testOnly *MySuite -- -z foo

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

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

183
Seth Tisue

他の回答に付随する具体的な例を追加したかった

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

Play Project

SBTコンソールから次のコマンドを実行すると、Loginテストのみをテストできます。

test:testOnly *LoginServiceSpec

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

sbt "test:testOnly *LoginServiceSpec"
78
Tyler

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

Sbtセッション内から:

test:testOnly *YourTestClass

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

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

test:testQuick

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

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

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

45
cfeduke

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

test:- prefixは不要です。

彼の例によると:

sbt- consoleで:

testOnly *LoginServiceSpec

そして、ターミナルで:

sbt "testOnly *LoginServiceSpec"
4
pme