sbt의 ScalaTest : 태그없이 단일 테스트를 실행하는 방법이 있습니까?


150

sbt에서 실행하면 단일 테스트를 실행할 수 있다는 것을 알고 있습니다.

testOnly *class -- -n Tag

태그없이 단일 테스트를 실행하도록 sbt / scalatest에 지시하는 방법이 있습니까? 예를 들면 다음과 같습니다.

testOnly *class -- -X 2

"클래스에서 두 번째 테스트를 실행하십시오. 무엇이든간에"입니다. 많은 테스트를 수행했으며 아무도 태그를 지정하지 않아도되므로 태그없이 단일 테스트를 실행할 수있는 방법이 있습니까?


1
피험자는 "Scalatest-sbt"라고 말합니다. sbt가 하이픈으로 연결되면 사람들은 일반적으로 플러그인을 생각합니다. 그러나 명확히하기 위해, 4 년 전에 작성된 sbt 0.5.2-p3 용 플러그인 joshcough / scalatest-sbt 가 아니라 sbt 0.12와 같은 최신 버전의 sbt에서 ScalaTest 를 사용하는 것에 대해 이야기 하고 있습니다. 옳은?
유진 요코타

옳은. 이것은 오래된 질문이며 그 이후로는 불가능하다는 것을 알았습니다. (아는 한) 불가능합니다. 누군가가 실제로 방법을 알아낼 수있는 경우를 대비하여 닫지 않았지만 더 이상 답변을받을 필요가 없습니다.
Nacht

groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM 에는 ( Bill Venners와 Mark Harrah의 참여와 함께) 스레드가 있지만 아직 해결책은 없습니다.
Seth Tisue

1
단일 테스트 sbt # 911 ( github.com/sbt/sbt/issues/911 ) 실행에 대한 일반적인 지원 사례도 있습니다 .
유진 요코타

14
명령 행에서 실행하는 경우 모든 것을 sbt따옴표로 묶어야합니다 (예 :sbt "test-only *SingleTestSuite"
Chris Martin

답변:


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

2
여러 하위 문자열을 필터링하려면 어떻게해야합니까? 테스트는 계층 (WordSpec)으로 그룹화 될 수 있고, 이름 부분으로 분리 when하고 should 시험 사이에 반복 할 수있다. 하나의 특정 테스트를 선택하려면 "이름에이 AND가 포함되어 있습니다"라고 말해야합니다.
Vituel

98

다른 답변과 함께 구체적인 예를 추가하고 싶었습니다.

테스트하려는 클래스의 이름을 지정해야하므로 다음 프로젝트 (Play 프로젝트)가있는 경우

프로젝트 플레이

LoginSBT 콘솔에서 다음 명령을 실행하여 테스트 만 테스트 할 수 있습니다 .

test:testOnly *LoginServiceSpec

SBT 콘솔 외부에서 명령을 실행중인 경우 다음을 수행하십시오.

sbt "test:testOnly *LoginServiceSpec"

27
큰 따옴표가 필요하기 때문에 공감하십시오.sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler

5
여기에 가장 유용한 답변입니다. 👍 그러나 명령을 약간 단순화 할 수 있습니다. SBT 콘솔에서 : testOnly *LoginServiceSpec및 외부 :sbt "testOnly *LoginServiceSpec"
Jonik

49

테스트 클래스 내에서 태그가 지정되지 않은 단일 테스트를 실행하는 방법을 볼 수 없지만이 질문에 부딪 치는 사람에게는 유용한 것으로 보이므로 워크 플로를 제공하고 있습니다.

sbt 세션 내에서 :

test:testOnly *YourTestClass

(별표는 와일드 카드이므로 전체 경로를 지정할 수 com.example.specs.YourTestClass있습니다.)

해당 테스트 클래스 내의 모든 테스트가 실행됩니다. 아마도 실패한 테스트에 가장 관심이 있으므로 실패한 구현을 수정 한 다음 실행하십시오.

test:testQuick

... 실패한 테스트 만 실행합니다. (가장 최근에 실행 된 test:testOnly명령을 반복하는 것은 test:testQuick이 경우 와 동일 하지만 테스트 방법을 적절한 테스트 클래스로 나눌 경우 와일드 카드를 사용하여 test:testQuick실패한 테스트를보다 효율적으로 다시 실행할 수 있습니다.)

ScalaTest의 테스트 명명법은 특정 테스트 방법이 아니라 테스트 클래스이므로 태그가없는 모든 메서드가 실행됩니다.

테스트 클래스에 테스트 메소드가 너무 많으면 별도의 클래스로 분류하거나 적절하게 태그를 지정하십시오. (이는 테스트중인 클래스가 단일 책임 원칙 을 위반 하고 리팩토링을 사용할 수 있음을 나타내는 신호일 수 있습니다 .)


10
"테스트가 실행되지 않았습니다"에 직면 한 사용자 : *YourTestClass클래스 이름이어야합니다. 파일 이름이 아닙니다.
MKatleast3

1
그것은 나를 위해 테스트 전용 대신 testOnly였습니다.
Jan Clemens Stoffregen 10

11

타일러의 예를 단순화하기 위해.

test:-접두사가 필요하지 않습니다.

그의 예에 따르면 :

에서 sbt-console :

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)""")
    }

  }

}

이 명령은 iLikedescribe 블록에서 SBT 명령 줄 의 네 가지 테스트를 실행합니다 .

testOnly *CardiBSpec -- -z iLike

따옴표를 사용할 수도 있으므로 다음과 같이 작동합니다.

testOnly *CardiBSpec -- -z "iLike"

단일 테스트가 실행됩니다.

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

"works with"로 시작하는 두 가지 테스트가 실행됩니다.

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"

이 예제를 실행하려면 이 저장소를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.