ScalaTest trong sbt: có cách nào để chạy thử nghiệm đơn lẻ mà không có thẻ không?


150

Tôi biết rằng một bài kiểm tra duy nhất có thể được chạy bằng cách chạy, trong sbt,

testOnly *class -- -n Tag

Có cách nào để nói sbt / scalatest chạy một bài kiểm tra không có thẻ không? Ví dụ:

testOnly *class -- -X 2

nó có nghĩa là "chạy thử nghiệm thứ hai trong lớp. Dù đó là gì". Chúng tôi có một loạt các bài kiểm tra và không ai bận tâm gắn thẻ chúng, vậy có cách nào để chạy một bài kiểm tra mà không có thẻ không?


1
Chủ đề của bạn nói "Scalatest-sbt". Khi sbt được gạch nối, mọi người thường nghĩ về một plugin. Nhưng, để làm rõ, bạn đang nói về việc sử dụng ScalaTest từ một phiên bản hiện đại của sbt như sbt 0.12, chứ không phải joshcough / scalatest-sbt một plugin cho sbt 0.5.2-p3 được viết 4 năm trước. Chính xác?
Eugene Yokota

Chính xác. Đây là một câu hỏi cũ và từ đó tôi đã nhận ra rằng không, điều đó là không thể (theo như tôi biết). Tôi đã không đóng nó trong trường hợp ai đó thực tế đã tìm ra cách, nhưng tôi không còn cần phải trả lời điều này nữa.
thuyền

Có một chủ đề về điều này (với sự tham gia của cả Bill Venners và Mark Harrah) tại nhóm.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , nhưng chưa có giải pháp nào
Seth Tisue

1
Ngoài ra còn có một trường hợp hỗ trợ chung về việc chạy một thử nghiệm sbt # 911 ( github.com/sbt/sbt/issues/911 ).
Eugene Yokota

14
Lưu ý rằng nếu bạn đang chạy từ dòng lệnh, bạn phải kèm theo mọi thứ sau sbtdấu ngoặc kép , ví dụ:sbt "test-only *SingleTestSuite"
Chris Martin

Câu trả lời:


202

Điều này hiện được hỗ trợ (kể từ ScalaTest 2.1.3) trong chế độ tương tác:

testOnly *MySuite -- -z foo

chỉ chạy các bài kiểm tra có tên bao gồm chuỗi con "foo".

Đối với kết hợp chính xác thay vì chuỗi con, sử dụng -tthay vì -z.


@SethTisue Bạn có thể đăng một ví dụ hoạt động sử dụng -tđể khớp chính xác không? Tôi không thể làm cho nó hoạt động.
rmin

@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 . (nếu điều này giúp bạn khắc phục vấn đề của bạn, hãy cho tôi biết tôi nên cập nhật câu trả lời của mình như thế nào.)
Seth Tisue

10
Chỉ cần làm rõ, nếu bạn chạy nó từ dòng lệnh, nó sẽ là một đối số duy nhất: sbt "testOnly * MySuite - -z foo"
Sogartar

2
Trong trường hợp bất cứ ai muốn chạy thử nghiệm cụ thể tích hợp (được cho là đặt dưới src/it), họ cần phải thêm vào trước itđể testOnly. Chẳng hạn, trên dòng lệnh : sbt "it:testOnly *MyIntegrationTestSuite".
laylaylom

2
Làm thế nào tôi có thể lọc trên nhiều chuỗi con? Các thử nghiệm có thể được nhóm trong một hệ thống phân cấp (WordSpec) và các phần tên được phân tách bằng whenshould có thể lặp lại giữa các thử nghiệm. Để chọn một thử nghiệm cụ thể tôi cần nói "tên chứa cái này VÀ cái kia".
Vituel

98

Tôi muốn thêm một ví dụ cụ thể để đi kèm với các câu trả lời khác

Bạn cần chỉ định tên của lớp mà bạn muốn kiểm tra, vì vậy nếu bạn có dự án sau (đây là dự án Play):

Chơi dự án

Bạn chỉ có thể kiểm tra các Loginbài kiểm tra bằng cách chạy lệnh sau từ bảng điều khiển SBT:

test:testOnly *LoginServiceSpec

Nếu bạn đang chạy lệnh từ bên ngoài bảng điều khiển SBT, bạn sẽ làm như sau:

sbt "test:testOnly *LoginServiceSpec"

27
Upvote vì rõ ràng dấu ngoặc kép là cần thiết:sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler

5
Câu trả lời hữu ích nhất cho tôi ở đây. Nhưng các lệnh có thể được đơn giản hóa một chút; trong bảng điều khiển SBT: testOnly *LoginServiceSpecvà bên ngoài:sbt "testOnly *LoginServiceSpec"
Jonik

49

Tôi không thấy cách để chạy một bài kiểm tra đơn lẻ trong lớp kiểm tra nhưng tôi đang cung cấp quy trình làm việc của mình vì nó có vẻ hữu ích cho bất kỳ ai gặp phải câu hỏi này.

Từ trong một phiên sbt:

test:testOnly *YourTestClass

(Dấu hoa thị là ký tự đại diện, bạn có thể chỉ định đường dẫn đầy đủ com.example.specs.YourTestClass.)

Tất cả các bài kiểm tra trong lớp kiểm tra đó sẽ được thực hiện. Có lẽ bạn quan tâm nhất đến các bài kiểm tra thất bại, vì vậy hãy sửa mọi lỗi triển khai và sau đó chạy:

test:testQuick

... sẽ chỉ thực hiện các bài kiểm tra thất bại. (Lặp lại test:testOnlylệnh được thực hiện gần đây nhất sẽ giống như test:testQuicktrong trường hợp này, nhưng nếu bạn chia phương thức kiểm tra của mình thành các lớp kiểm tra phù hợp, bạn có thể sử dụng ký tự đại diện để thực hiện test:testQuickmột cách hiệu quả hơn để chạy lại các bài kiểm tra thất bại.)

Lưu ý rằng danh pháp cho kiểm tra trong ScalaTest là một lớp kiểm tra, không phải là một phương thức kiểm tra cụ thể, vì vậy tất cả các phương thức không được mã hóa đều được thực thi.

Nếu bạn có quá nhiều phương thức kiểm tra trong một lớp kiểm tra, hãy chia chúng thành các lớp riêng biệt hoặc gắn thẻ chúng một cách thích hợp. (Đây có thể là một tín hiệu cho thấy lớp đang thử nghiệm vi phạm nguyên tắc trách nhiệm duy nhất và có thể sử dụng tái cấu trúc.)


10
cho những người đang đối mặt "Không có bài kiểm tra nào được thực hiện": *YourTestClassphải là tên lớp. Không phải tên tập tin.
MKatleast3

1
đó là testOnly thay vì chỉ dùng thử cho tôi.
Jan Clemens Stoffregen

11

Chỉ để đơn giản hóa ví dụ về Tyler.

test:-prefix là không cần thiết.

Vì vậy, theo ví dụ của mình:

Trong sbt-console:

testOnly *LoginServiceSpec

Và trong thiết bị đầu cuối:

sbt "testOnly *LoginServiceSpec"

0

Đây là trang Scalatest về việc sử dụng người chạythảo luận mở rộng về các tùy chọn -t-z .

Bài đăng này cho thấy những lệnh nào hoạt động cho một tệp thử nghiệm sử dụng FunSpec.

Đây là tập tin thử nghiệm:

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

  }

}

Lệnh này chạy bốn bài kiểm tra trong iLikekhối mô tả (từ dòng lệnh SBT):

testOnly *CardiBSpec -- -z iLike

Bạn cũng có thể sử dụng dấu ngoặc kép, vì vậy điều này cũng sẽ hoạt động:

testOnly *CardiBSpec -- -z "iLike"

Điều này sẽ chạy một thử nghiệm duy nhất:

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

Điều này sẽ chạy hai bài kiểm tra bắt đầu bằng "hoạt động với":

testOnly *CardiBSpec -- -z "works with"

Tôi không thể có -ttùy chọn để chạy bất kỳ thử nghiệm nào trong CardiBSpectệp. Lệnh này không chạy bất kỳ kiểm tra nào:

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

Có vẻ như -ttùy chọn này hoạt động khi các kiểm tra không được lồng trong describecác khối. Chúng ta hãy xem một tệp thử nghiệm khác:

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

-t có thể được sử dụng để chạy thử nghiệm duy nhất:

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

-z cũng có thể được sử dụng để chạy thử nghiệm duy nhất:

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

Xem repo này nếu bạn muốn chạy các ví dụ này.


0

Tất cả các câu trả lời ở trên đều có giá trị, tôi chỉ muốn đưa ra một con trỏ ở đây để xem tài liệu đầy đủ về Người chạy thử nghiệm ScalaTest. Người chạy là ứng dụng cho phép bạn vượt qua tùy chọn được mô tả trong các phản hồi ở trên. Tài liệu có tại ScalaTest Runner Options


Vì đây không phải là một câu trả lời cụ thể cho câu hỏi, nó sẽ được đăng tốt hơn dưới dạng một bình luận.
jwvh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.