ScalaTest di sbt: apakah ada cara untuk menjalankan tes tunggal tanpa tag?

150

Saya tahu bahwa satu tes dapat dijalankan dengan menjalankan, di sbt,

testOnly *class -- -n Tag

Apakah ada cara untuk memberitahu sbt / scalatest untuk menjalankan tes tunggal tanpa tag? Sebagai contoh:

testOnly *class -- -X 2

itu berarti "jalankan tes kedua di kelas. Apa pun itu". Kami memiliki banyak tes dan tidak ada yang mau memberi tag pada mereka, jadi apakah ada cara untuk menjalankan tes tunggal tanpa memiliki tag?

Nacht
sumber
1
Subjek Anda mengatakan "Scalatest-sbt". Ketika sbt ditulis dgn tanda penghubung, orang biasanya akan memikirkan sebuah plugin. Tapi, hanya untuk memperjelas, Anda berbicara tentang menggunakan ScalaTest dari versi modern sbt seperti sbt 0.12, bukan joshcough / scalatest-sbt plugin untuk sbt 0.5.2-p3 yang ditulis 4 tahun lalu. Benar?
Eugene Yokota
Benar. Ini adalah pertanyaan lama dan sejak saat itu saya telah menemukan bahwa tidak, itu tidak mungkin (sejauh yang saya tahu). Saya belum menutupnya kalau-kalau seseorang memang berhasil menemukan cara, tetapi saya tidak lagi perlu dijawab.
Nacht
Ada utas tentang hal ini (dengan partisipasi dari Bill Venners dan Mark Harrah) di groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , tetapi belum ada solusi
Seth Tisue
1
Ada juga kasus untuk dukungan umum pada menjalankan tes tunggal sbt # 911 ( github.com/sbt/sbt/issues/911 ).
Eugene Yokota
14
Perhatikan bahwa jika Anda menjalankan dari baris perintah, Anda harus menyertakan semuanya setelah sbttanda kutip , misalnyasbt "test-only *SingleTestSuite"
Chris Martin

Jawaban:

202

Ini sekarang didukung (sejak ScalaTest 2.1.3) dalam mode interaktif:

testOnly *MySuite -- -z foo

untuk menjalankan hanya tes yang namanya termasuk "foo" substring.

Untuk pencocokan tepat daripada substring, gunakan -tsebagai ganti -z.

Seth Tisue
sumber
@SethTisue Apakah Anda dapat memposting contoh yang berfungsi yang menggunakan -tuntuk pencocokan tepat? Saya tidak bisa membuatnya bekerja.
rmin
@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 . (jika ini membantu Anda memperbaiki masalah Anda, beri tahu saya bagaimana saya harus memperbarui jawaban saya.)
Seth Tisue
10
Hanya untuk memperjelas, jika Anda menjalankannya dari baris perintah, itu harus sebagai argumen tunggal: sbt "testOnly * MySuite - -z foo"
Sogartar
2
Jika ada yang ingin menjalankan tes integrasi tertentu (seharusnya ditempatkan di bawah src/it), mereka harus itmelakukannya testOnly. Misalnya, pada baris perintah: sbt "it:testOnly *MyIntegrationTestSuite".
laylaylom
2
Bagaimana saya bisa memfilter pada banyak substring? Tes dapat dikelompokkan dalam hierarki (WordSpec), dan bagian-bagian nama dipisahkan oleh whendan should dapat mengulangi antara tes. Untuk memilih satu tes khusus saya perlu mengatakan "nama berisi ini DAN itu".
Vituel
98

Saya ingin menambahkan contoh konkret untuk menyertai jawaban lainnya

Anda perlu menentukan nama kelas yang ingin Anda uji, jadi jika Anda memiliki proyek berikut (ini adalah proyek Play):

Mainkan Project

Anda dapat menguji hanya Logintes dengan menjalankan perintah berikut dari konsol SBT:

test:testOnly *LoginServiceSpec

Jika Anda menjalankan perintah dari luar konsol SBT, Anda akan melakukan hal berikut:

sbt "test:testOnly *LoginServiceSpec"
Tyler
sumber
27
Suara positif karena tampaknya tanda kutip ganda diperlukan:sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler
5
Jawaban paling berguna untuk saya di sini. đź‘Ť Tapi perintahnya bisa sedikit disederhanakan; dalam konsol SBT:, testOnly *LoginServiceSpecdan di luar:sbt "testOnly *LoginServiceSpec"
Jonik
49

Saya tidak melihat cara untuk menjalankan satu tes tanpa tanda dalam kelas uji tetapi saya memberikan alur kerja saya karena tampaknya berguna bagi siapa saja yang mengalami pertanyaan ini.

Dari dalam sesi sbt:

test:testOnly *YourTestClass

(Tanda bintang adalah wildcard, Anda dapat menentukan path lengkap com.example.specs.YourTestClass.)

Semua tes dalam kelas tes itu akan dieksekusi. Agaknya Anda yang paling khawatir dengan tes gagal, jadi koreksi implementasi yang gagal dan kemudian jalankan:

test:testQuick

... yang hanya akan menjalankan tes yang gagal. (Mengulangi perintah yang paling baru dieksekusi test:testOnlyakan sama dengan test:testQuickdalam kasus ini, tetapi jika Anda memecah metode pengujian Anda menjadi kelas tes yang sesuai, Anda dapat menggunakan wildcard untuk membuat test:testQuickcara yang lebih efisien untuk menjalankan kembali tes gagal.)

Perhatikan bahwa nomenklatur untuk pengujian di ScalaTest adalah kelas uji, bukan metode pengujian khusus, jadi semua metode yang tidak ditandai dijalankan.

Jika Anda memiliki terlalu banyak metode pengujian dalam kelas uji, bagi mereka menjadi beberapa kelas yang terpisah atau beri tag dengan benar. (Ini bisa menjadi sinyal bahwa kelas yang diuji melanggar prinsip tanggung jawab tunggal dan dapat menggunakan refactoring.)

cfeduke
sumber
10
untuk yang menghadapi "Tidak ada tes yang dijalankan": *YourTestClassharus nama kelas. Bukan nama file.
MKatleast3
1
itu testOnly bukan hanya test untuk saya.
Jan Clemens Stoffregen
11

Hanya untuk menyederhanakan contoh Tyler.

test:-prefix tidak diperlukan.

Jadi menurut contohnya:

Dalam sbt-console:

testOnly *LoginServiceSpec

Dan di terminal:

sbt "testOnly *LoginServiceSpec"
pme
sumber
0

Inilah halaman Scalatest tentang menggunakan pelari dan diskusi panjang tentang opsi -tdan-z .

Posting ini menunjukkan perintah apa yang berfungsi untuk file uji yang menggunakan FunSpec.

Inilah file tesnya:

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

  }

}

Perintah ini menjalankan empat tes di iLikeblok uraian (dari baris perintah SBT):

testOnly *CardiBSpec -- -z iLike

Anda juga dapat menggunakan tanda kutip, jadi ini juga akan berfungsi:

testOnly *CardiBSpec -- -z "iLike"

Ini akan menjalankan tes tunggal:

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

Ini akan menjalankan dua tes yang dimulai dengan "bekerja dengan":

testOnly *CardiBSpec -- -z "works with"

Saya tidak bisa mendapatkan -topsi untuk menjalankan tes apa pun di CardiBSpecfile. Perintah ini tidak menjalankan tes apa pun:

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

Sepertinya -topsi berfungsi ketika tes tidak bersarang di describeblok. Mari kita lihat file tes lain:

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

-t dapat digunakan untuk menjalankan tes tunggal:

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

-z juga dapat digunakan untuk menjalankan tes tunggal:

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

Lihat repo ini jika Anda ingin menjalankan contoh-contoh ini.

Kekuasaan
sumber