Sbt içinde scalaTest: Etiketler olmadan tek bir test çalıştırmanın bir yolu var mı?


150

Tek bir testin sbt içinde çalıştırılarak çalıştırılabileceğini biliyorum.

testOnly *class -- -n Tag

Sbt / scalatest'e etiketsiz tek bir test çalıştırmasını söylemenin bir yolu var mı? Örneğin:

testOnly *class -- -X 2

"sınıftaki ikinci testi çalıştır. Ne olursa olsun" anlamına gelir. Bir sürü testimiz var ve kimse bunları etiketlemekle uğraşmadı, bu yüzden etiketi olmadan tek bir test yapmanın bir yolu var mı?


1
Konunuz "Scalatest-sbt" diyor. SBT tireli olduğunda insanlar normalde bir eklenti düşünürler. Ancak, sadece açıklığa kavuşturmak için, 4 yıl önce yazılan sbt 0.5.2-p3 için bir eklenti değil, joshcough / scalatest-sbt değil, sbt 0.12 gibi sbt'nin modern bir versiyonundan ScalaTest kullanmaktan bahsediyorsunuz . Doğru?
Eugene Yokota

Doğru. Bu eski bir soru ve o zamandan beri hayır, mümkün olmadığını anladım (bildiğim kadarıyla). Birisi aslında bir yol bulmayı başarabildiyse kapatmadım, ama buna cevap vermem gerekmiyor.
Nacht

Bunun üzerinde groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM adresinde (hem Bill Venners hem de Mark Harrah'ın katılımıyla) bir konu var , ancak henüz bir çözüm yok
yaşında Seth Tisue

1
Ayrıca, tek bir sbt # 911 sınaması ( github.com/sbt/sbt/issues/911 ) için genel destek için bir durum vardır .
Eugene Yokota

14
Komut satırından çalıştırıyorsanız, her şeyi sbttırnak içine almanız gerektiğini unutmayın , örneğinsbt "test-only *SingleTestSuite"
Chris Martin

Yanıtlar:


202

Bu, artık etkileşimli modda (ScalaTest 2.1.3'ten beri) desteklenmektedir:

testOnly *MySuite -- -z foo

yalnızca adı "foo" alt dizesini içeren testleri çalıştırmak için.

Tam eşlemesi yerine alt dize için kullanmak -tyerine -z.


@SethTisue -tTam eşleme için çalışan bir çalışma örneği yayınlayabilir misiniz? İşe alamıyorum.
rmin

@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 . (bu sorununuzu çözmenize yardımcı olursa, cevabımı nasıl güncellemem gerektiğini bana bildirin.)
Seth Tisue

10
Sadece açıklığa kavuşturmak için, komut satırından çalıştırırsanız, tek bir argüman olarak olmalıdır: sbt "testOnly * MySuite - -z foo"
Sogartar

2
Herhangi birisinin belirli bir entegrasyon testi (sözde altına yerleştirilmiş src/it) çalıştırmak istemesi itdurumunda , bunun başına başlaması gerekir testOnly. Örneğin, komut satırında: sbt "it:testOnly *MyIntegrationTestSuite".
laylaylom

2
Birden çok alt dizeye nasıl filtre uygulayabilirim? Testler bir hiyerarşide (WordSpec) gruplandırılabilir ve ad bölümleri testler tarafından ayrılabilir whenve shouldtestler arasında tekrarlanabilir. Belirli bir testi seçmek için "adı bunu VE içerir" demeliyim.
Vituel

98

Diğer cevaplara eşlik edecek somut bir örnek eklemek istedim

Test etmek istediğiniz sınıfın adını belirtmeniz gerekir, bu nedenle aşağıdaki projeniz varsa (bu bir Play projesidir):

Play Projesi

LoginSBT konsolundan aşağıdaki komutu çalıştırarak yalnızca testleri test edebilirsiniz :

test:testOnly *LoginServiceSpec

Komutu SBT konsolunun dışından çalıştırıyorsanız, aşağıdakileri yaparsınız:

sbt "test:testOnly *LoginServiceSpec"

27
Görünüşe göre çift tırnak işareti gerekli:sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler

5
Burada benim için en yararlı cevap. 👍 Ancak komutlar biraz basitleştirilebilir; SBT konsolunda: testOnly *LoginServiceSpecve dışında:sbt "testOnly *LoginServiceSpec"
Jonik

49

Bir test sınıfı içinde tek bir etiketsiz testi çalıştırmanın bir yolunu görmüyorum, ancak bu soruyla çalışan herkes için yararlı göründüğü için iş akışımı sağlıyorum.

Bir sbt oturumu içinden:

test:testOnly *YourTestClass

(Yıldız işareti bir joker karakterdir, tam yolu belirtebilirsiniz com.example.specs.YourTestClass.)

Bu test sınıfındaki tüm testler yürütülecektir. Muhtemelen en çok başarısız testlerle ilgileniyorsunuz, bu yüzden başarısız uygulamaları düzeltin ve çalıştırın:

test:testQuick

... sadece başarısız olan testleri gerçekleştirir. (En son yürütülen test:testOnlykomutu tekrarlamak test:testQuickbu durumda olduğu gibi olacaktır , ancak test yöntemlerinizi uygun test sınıflarına ayırırsanız, test:testQuickbaşarısız testleri yeniden çalıştırmak için daha etkili bir yol oluşturmak için bir joker karakter kullanabilirsiniz .)

ScalaTest'te test için isimlendirmenin belirli bir test yöntemi değil, bir test sınıfı olduğunu unutmayın, bu nedenle tüm etiketsiz yöntemler yürütülür.

Bir test sınıfında çok fazla test yönteminiz varsa, bunları ayrı sınıflara ayırın veya uygun şekilde etiketleyin. (Bu, test edilen sınıfın tek sorumluluk ilkesini ihlal ettiğini ve yeniden düzenleme kullanabileceğini gösteren bir işaret olabilir.)


10
"Hiçbir test yürütülmedi" ile karşı karşıya olanlar için: *YourTestClasssınıf adı olmalıdır. Dosya adı değil.
MKatleast3

1
Sadece benim için değil, sadece testti.
Jan Clemens Stoffregen

11

Sadece Tyler örneğini basitleştirmek için.

test:-prefix gerekmez.

Onun örneğine göre:

In sbt-Konsol:

testOnly *LoginServiceSpec

Ve terminalde:

sbt "testOnly *LoginServiceSpec"

0

İşte üzerinde Scalatest sayfası koşucusu kullanarak ve uzun uzun tartışıldıktan -tve -zseçenekler .

Bu yazı, kullanılan bir test dosyası için hangi komutların çalıştığını gösterir FunSpec.

İşte test dosyası:

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

  }

}

Bu komut, iLikeaçıklama bloğundaki dört testi çalıştırır (SBT komut satırından):

testOnly *CardiBSpec -- -z iLike

Tırnak işaretleri de kullanabilirsiniz, böylece bu da işe yarar:

testOnly *CardiBSpec -- -z "iLike"

Bu tek bir test gerçekleştirir:

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

Bu, "şununla çalışır" ile başlayan iki testi çalıştırır:

testOnly *CardiBSpec -- -z "works with"

Dosyada -therhangi bir test çalıştırma seçeneğini alamıyorum CardiBSpec. Bu komut herhangi bir test çalıştırmaz:

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

-tTestler describebloklara yerleştirilmediğinde seçenek işe yarıyor gibi görünüyor . Şimdi başka bir test dosyasına bakalım:

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

-t tek testi çalıştırmak için kullanılabilir:

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

-z tek bir testi çalıştırmak için de kullanılabilir:

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

Bu örnekleri çalıştırmak istiyorsanız bu repoya bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.