Sbt में ScalaTest: क्या टैग के बिना एक ही परीक्षण चलाने का एक तरीका है?


150

मुझे पता है कि एक एकल परीक्षण को दौड़कर, sbt में चलाया जा सकता है,

testOnly *class -- -n Tag

क्या टैग के बिना एक भी परीक्षण चलाने के लिए sbt / स्केलटैस्ट बताने का एक तरीका है? उदाहरण के लिए:

testOnly *class -- -X 2

इसका अर्थ होगा "कक्षा में दूसरी परीक्षा चलाना। जो भी हो"। हमारे पास परीक्षणों का एक समूह है और कोई भी उन्हें टैग करने की जहमत नहीं उठाता है, तो क्या बिना टैग लगाए एकल परीक्षण चलाने का कोई तरीका है?


1
आपका विषय "स्कैलेस्ट-एसबीटी" कहता है। जब sbt हाइफ़न होता है तो लोग सामान्य रूप से एक प्लगइन के बारे में सोचते हैं। लेकिन, अभी स्पष्ट करने के लिए, आप का उपयोग कर के बारे में बात कर रहे हैं ScalaTest एसबीटी 0.12 की तरह एसबीटी का आधुनिक संस्करण से, नहीं joshcough / scalatest-एसबीटी एसबीटी 0.5.2-पी 3 4 साल पहले लिखा के लिए एक प्लगइन। सही बात?
यूजीन योकोटा

सही बात। यह एक पुराना प्रश्न है और मैंने तब से यह समझ लिया है कि नहीं, यह संभव नहीं है (जहाँ तक मुझे पता है)। अगर किसी ने वास्तव में एक तरह से यह पता लगाने में कामयाब रहा, तो मैंने इसे बंद नहीं किया है, लेकिन मुझे अब इसका जवाब देने की आवश्यकता नहीं है।
Nacht

इस पर एक धागा पर (दोनों बिल वेनर्स और मार्क Harrah से भागीदारी के साथ) है groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , लेकिन अभी तक कोई समाधान नहीं
सेठ Tisue

1
एक एकल परीक्षण sbt # 911 ( github.com/sbt/sbt/issues/911 ) चलाने पर सामान्य समर्थन के लिए भी एक मामला है ।
यूजीन योकोटा

14
ध्यान दें कि यदि आप कमांड लाइन से भाग रहे हैं, तो आपको sbtउद्धरण के बाद सब कुछ घेरना होगा , जैसेsbt "test-only *SingleTestSuite"
क्रिस मार्टिन

जवाबों:


202

यह अब इंटरेक्टिव मोड के भीतर समर्थित है (ScalaTest 2.1.3 के बाद से):

testOnly *MySuite -- -z foo

केवल उन परीक्षणों को चलाने के लिए जिनके नाम में विकल्प "फू" शामिल है।

प्रतिस्थापन के बजाय सटीक मिलान के लिए, के -tबजाय का उपयोग करें -z


@SethTisue क्या आप एक कामकाजी उदाहरण पोस्ट करने में सक्षम होंगे जो -tसटीक मिलान के लिए उपयोग करता है ? मैं इसे काम करने में असमर्थ हूं।
rmin

@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 । (अगर यह आपकी समस्या को ठीक करने में आपकी मदद करता है, तो मुझे बताएं कि मुझे अपना जवाब कैसे अपडेट करना चाहिए।)
सेठ टिस्यू

10
बस स्पष्ट करने के लिए, यदि आप इसे कमांड लाइन से चलाते हैं, तो यह एकल तर्क के रूप में होना चाहिए: sbt "testOnly * MySuite - -z foo"
Sogartar

2
यदि कोई व्यक्ति एक विशेष एकीकरण परीक्षण (माना जाता है कि नीचे रखा गया src/it) चलाना चाहता है , तो उन्हें पहले itसे तैयारी करने की आवश्यकता है testOnly। उदाहरण के लिए, कमांड लाइन पर sbt "it:testOnly *MyIntegrationTestSuite":।
Laylaylom

2
मैं कई सबस्ट्रिंग पर कैसे फ़िल्टर कर सकता हूं? टेस्ट एक पदानुक्रम (WordSpec) में वर्गीकृत किए जा सकते हैं, और नाम भागों को अलग किया जा सकता है whenऔर shouldपरीक्षणों के बीच दोहरा सकते हैं। एक विशिष्ट परीक्षण को चुनने के लिए मुझे यह कहना होगा "नाम में यह और वह है"।
विटुल

98

मैं अन्य उत्तरों के साथ एक ठोस उदाहरण जोड़ना चाहता था

आपको उस वर्ग का नाम निर्दिष्ट करना होगा जिसे आप परीक्षण करना चाहते हैं, इसलिए यदि आपके पास निम्नलिखित परियोजना है (यह एक Play परियोजना है):

खेलो परियोजना

आप Loginएसबीटी कंसोल से निम्न कमांड चलाकर सिर्फ परीक्षण कर सकते हैं :

test:testOnly *LoginServiceSpec

यदि आप SBT कंसोल के बाहर से कमांड चला रहे हैं, तो आप निम्न कार्य करेंगे:

sbt "test:testOnly *LoginServiceSpec"

27
अपवोट क्योंकि जाहिरा तौर पर दोहरे उद्धरण आवश्यक हैं:sbt "test:testOnly *LoginServiceSpec"
जेसन व्हीलर

5
यहां मेरे लिए सबसे उपयोगी उत्तर। Can लेकिन आज्ञाओं को थोड़ा सरल बनाया जा सकता है; SBT कंसोल में: testOnly *LoginServiceSpecऔर बाहर:sbt "testOnly *LoginServiceSpec"
जोनीक

49

मुझे टेस्ट क्लास के भीतर एक भी नकलविहीन टेस्ट चलाने का कोई रास्ता नहीं दिखता है, लेकिन मैं अपने वर्कफ़्लो को प्रदान कर रहा हूं क्योंकि यह इस प्रश्न को चलाने वाले के लिए उपयोगी साबित होता है।

एक sbt सत्र के भीतर से:

test:testOnly *YourTestClass

(तारांकन एक वाइल्डकार्ड है, आप पूर्ण पथ निर्दिष्ट कर सकते हैं com.example.specs.YourTestClass।)

उस परीक्षण वर्ग के भीतर सभी परीक्षणों को निष्पादित किया जाएगा। संभवतः आप असफल परीक्षणों से सबसे अधिक चिंतित हैं, इसलिए किसी भी असफल कार्यान्वयन को सही करें और फिर चलाएं:

test:testQuick

... जो केवल उन परीक्षणों को निष्पादित करेगा जो विफल रहे। (सबसे हाल ही में निष्पादित test:testOnlyकमांड को दोहराना test:testQuickइस मामले में समान होगा , लेकिन यदि आप अपने परीक्षण के तरीकों को उपयुक्त परीक्षण कक्षाओं में तोड़ते हैं, तो आप test:testQuickअसफल परीक्षणों को फिर से चलाने के लिए एक अधिक कुशल तरीका बनाने के लिए वाइल्डकार्ड का उपयोग कर सकते हैं ।)

ध्यान दें कि ScalaTest में परीक्षण के लिए नामकरण एक परीक्षण वर्ग है, न कि एक विशिष्ट परीक्षण विधि, इसलिए सभी असंगत तरीकों को निष्पादित किया जाता है।

यदि आपके पास एक परीक्षण वर्ग में बहुत अधिक परीक्षण विधियां हैं, तो उन्हें अलग-अलग कक्षाओं में तोड़ दें या उन्हें उचित रूप से टैग करें। (यह एक संकेत हो सकता है कि परीक्षण के तहत वर्ग एकल जिम्मेदारी सिद्धांत के उल्लंघन में है और रिफैक्टिंग का उपयोग कर सकता है।)


10
जो "कोई परीक्षण निष्पादित नहीं किए गए" का सामना कर रहे हैं: *YourTestClassको कक्षा का नाम होना चाहिए फ़ाइल का नाम नहीं।
एमकेटलस्ट 3

1
यह केवल परीक्षण के बजाय केवल मेरे लिए था।
जनवरी क्लेमेंस स्टॉफरेगन

11

बस टायलर के उदाहरण को सरल बनाने के लिए।

test:-विशेष की जरूरत नहीं है।

तो उनके उदाहरण के अनुसार:

में sbtसांत्वना:

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

  }

}

यह कमांड iLikeवर्णन ब्लॉक में चार परीक्षण चलाता है (SBT कमांड लाइन से):

testOnly *CardiBSpec -- -z iLike

आप उद्धरण चिह्नों का भी उपयोग कर सकते हैं, इसलिए यह भी काम करेगा:

testOnly *CardiBSpec -- -z "iLike"

यह एक एकल परीक्षण चलाएगा:

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

यह दो परीक्षण चलाएगा जो "काम करता है" से शुरू होता है:

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"

यदि आप इन उदाहरणों को चलाना चाहते हैं तो इस रेपो को देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.