ScalaTest ใน sbt: มีวิธีรันการทดสอบเดียวโดยไม่มีแท็กหรือไม่?


150

ฉันรู้ว่าการทดสอบเดียวสามารถวิ่งได้โดยวิ่งใน sbt

testOnly *class -- -n Tag

มีวิธีบอก sbt / scalatest เพื่อทำการทดสอบเดียวโดยไม่มีแท็กหรือไม่? ตัวอย่างเช่น:

testOnly *class -- -X 2

มันจะหมายถึง "ทำการทดสอบครั้งที่สองในชั้นเรียนไม่ว่ามันจะเป็นอะไร" เรามีการทดสอบมากมายและไม่มีใครสนใจติดแท็กดังนั้นจึงมีวิธีเรียกใช้การทดสอบเดียวโดยไม่ต้องมีแท็กหรือไม่


1
หัวข้อของคุณพูดว่า "Scalatest-sbt" เมื่อ sbt ถูกยัติภังค์คนปกติจะคิดว่าปลั๊กอิน แต่เพียงเพื่อชี้แจงคุณกำลังพูดคุยเกี่ยวกับการใช้ScalaTestจากรุ่นที่ทันสมัยของ SBT เช่น SBT 0.12 ไม่joshcough / scalatest-SBTปลั๊กอินสำหรับ SBT 0.5.2-P3 เขียน 4 ปีที่แล้ว แก้ไข?
Eugene Yokota

แก้ไข. นี่เป็นคำถามเก่าและฉันก็พบว่าไม่มีมันเป็นไปไม่ได้ (เท่าที่ฉันรู้) ฉันไม่ได้ปิดมันในกรณีที่มีคนจัดการเพื่อหาวิธี แต่ฉันไม่ต้องการคำตอบนี้อีกต่อไป
Nacht

มีหัวข้อเกี่ยวกับเรื่องนี้ (ด้วยการมีส่วนร่วมจากทั้ง Bill Venners และ Mark Harrah) ที่groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXMแต่ยังไม่มีวิธีแก้ปัญหา
Seth Tisue

1
นอกจากนี้ยังมีกรณีสำหรับการสนับสนุนทั่วไปในการใช้งานการทดสอบ sbt # 911 เดียว ( github.com/sbt/sbt/issues/911 )
Eugene Yokota

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 สามารถทำซ้ำระหว่างการทดสอบ หากต้องการเลือกการทดสอบหนึ่งรายการฉันต้องพูดว่า "ชื่อมีสิ่งนี้และที่"
Vituel

98

ฉันต้องการเพิ่มตัวอย่างที่เป็นรูปธรรมเพื่อติดตามคำตอบอื่น ๆ

คุณต้องระบุชื่อของคลาสที่คุณต้องการทดสอบดังนั้นหากคุณมีโครงการต่อไปนี้ (นี่เป็นโครงการ Play):

เล่นโครงการ

คุณสามารถทดสอบการLoginทดสอบโดยการรันคำสั่งต่อไปนี้จากคอนโซล SBT:

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ในกรณีนี้ แต่ถ้าคุณแบ่งวิธีการทดสอบของคุณออกเป็นคลาสการทดสอบที่เหมาะสมคุณสามารถใช้ wildcard เพื่อสร้างtest:testQuickวิธีที่มีประสิทธิภาพมากขึ้นในการรันการทดสอบที่ล้มเหลวอีกครั้ง)

โปรดทราบว่าระบบการตั้งชื่อสำหรับการทดสอบใน ScalaTest เป็นคลาสการทดสอบไม่ใช่วิธีการทดสอบที่เฉพาะเจาะจงดังนั้นวิธีการที่ไม่ได้ติดแท็กทั้งหมดจะถูกดำเนินการ

หากคุณมีวิธีการทดสอบมากเกินไปในคลาสทดสอบให้แบ่งคลาสออกเป็นชั้น ๆ หรือแท็กพวกเขาอย่างเหมาะสม (นี่อาจเป็นสัญญาณว่าคลาสที่อยู่ภายใต้การทดสอบนั้นละเมิดหลักการความรับผิดชอบเดี่ยวและสามารถใช้การปรับโครงสร้างใหม่ได้)


10
สำหรับผู้ที่กำลังเผชิญกับ "ไม่ทำการทดสอบ": *YourTestClassต้องเป็นชื่อคลาส ไม่ใช่ชื่อไฟล์
MKatleast3

1
มันเป็นเพียงการทดสอบเท่านั้นแทนการทดสอบสำหรับฉัน
Jan Clemens Stoffregen

11

เพียงแค่ทำให้ตัวอย่างของ Tyler ง่ายขึ้น

test:- แก้ไขไม่จำเป็น

ดังนั้นตามตัวอย่างของเขา:

ในsbt- พื้นรองเท้า:

testOnly *LoginServiceSpec

และใน terminal:

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"

ดูrepo นี้หากคุณต้องการเรียกใช้ตัวอย่างเหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.