scalaTest in sbt:有没有办法在没有标签的情况下运行单个测试?

时间:2012-06-22 16:04:29

标签: testing sbt scalatest

我知道可以通过在sbt中运行

来运行单个测试
testOnly *class -- -n Tag

有没有办法告诉sbt / scalatest在没有标签的情况下运行单个测试?例如:

testOnly *class -- -X 2

这意味着“在课堂上进行第二次测试。无论是什么”。我们有一堆测试,没有人费心去标记它们,所以有没有办法在没有标签的情况下运行单个测试?

5 个答案:

答案 0 :(得分:176)

现在支持(自ScalaTest 2.1.3起):

testOnly *MySuite -- -z foo

仅运行名称包含子字符串" foo"。

的测试

对于完全匹配而非子字符串,请使用-t代替-z

答案 1 :(得分:70)

我想添加一个具体的例子来配合其他答案

您需要指定要测试的类的名称,因此如果您有以下项目(这是一个Play项目):

Play Project

您可以通过从SBT控制台运行以下命令来测试Login测试:

test:testOnly *LoginServiceSpec

如果从SBT控制台外部运行命令,则执行以下操作:

sbt "test:testOnly *LoginServiceSpec"

答案 2 :(得分:43)

我没有看到在测试类中运行单个未标记测试的方法,但我提供了我的工作流程,因为它似乎对遇到此问题的任何人都有用。

从sbt会话中:

test:testOnly *YourTestClass

(星号是通配符,您可以指定完整路径com.example.specs.YourTestClass。)

将执行该测试类中的所有测试。大概你最关心的是测试失败,所以纠正任何失败的实现,然后运行:

test:testQuick

...只会执行失败的测试。 (在这种情况下,重复最近执行的test:testOnly命令与test:testQuick相同,但如果将测试方法分解为适当的测试类,则可以使用通配符生成test:testQuick一种更有效的方法来重新运行失败的测试。)

请注意,ScalaTest中的测试命名法是测试类,而不是特定的测试方法,因此所有未标记的方法都会被执行。

如果测试类中有太多测试方法,请将它们分成不同的类或适当地标记它们。 (这可能是一个信号表明被测试的课程违反了single responsibility principle并且可以使用重构。)

答案 3 :(得分:1)

只是为了简化泰勒的例子。

不需要

test:前缀。

所以根据他的例子:

sbt-控制台中:

testOnly *LoginServiceSpec

在终端机中:

sbt "testOnly *LoginServiceSpec"

答案 4 :(得分:1)

这是using the runnerthe extended discussion on the -t and -z options上的Scalatest页面。

本文介绍了哪些命令对使用extension = 'csv' all_filenames = [i for i in glob.glob('*.{}'.format(extension))] 的测试文件有效。

这是测试文件:

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)""") } } } describe块中的四个测试(从SBT命令行):

iLike

您也可以使用引号,因此也可以使用:

testOnly *CardiBSpec -- -z iLike

这将运行一个测试:

testOnly *CardiBSpec -- -z "iLike"

这将运行以“ works with”开头的两个测试:

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

如果要运行这些示例,请参见this repo。您可以找到有关运行测试here的更多信息。