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

Posted

技术标签:

【中文标题】sbt 中的 ScalaTest:有没有办法在没有标签的情况下运行单个测试?【英文标题】:ScalaTest in sbt: is there a way to run a single test without tags? 【发布时间】:2012-06-24 23:22:48 【问题描述】:

我知道可以通过在 sbt 中运行来运行单个测试,

testOnly *class -- -n Tag

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

testOnly *class -- -X 2

这意味着“运行班级中的第二个测试。不管它是什么”。我们有一堆测试,没有人费心标记它们,那么有没有办法在没有标记的情况下运行单个测试?

【问题讨论】:

你的主题说“Scalatest-sbt”。当 sbt 连字符时,人们通常会想到一个插件。但是,为了澄清一点,您说的是使用现代版本的 sbt(如 sbt 0.12)中的 ScalaTest,而不是 4 年前编写的用于 sbt 0.5.2-p3 的插件 joshcough/scalatest-sbt。对吗? 正确。这是一个老问题,从那时起我就发现不,这是不可能的(据我所知)。我没有关闭它,以防有人确实设法找到了方法,但我不再需要回答这个问题。 groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM 有一个关于此的主题(Bill Venners 和 Mark Harrah 都参与其中),但还没有解决方案 还有一个一般支持运行单个测试 sbt#911 (github.com/sbt/sbt/issues/911) 的案例。 请注意,如果您从命令行运行,you have to enclose everything after sbt in quotes,例如sbt "test-only *SingleTestSuite" 【参考方案1】:

现在在交互模式下支持(从 ScalaTest 2.1.3 开始):

testOnly *MySuite -- -z foo

只运行名称中包含子字符串“foo”的测试。

对于完全匹配而不是子字符串,使用-t 而不是-z

【讨论】:

@SethTisue 您能否发布一个使用-t 进行精确匹配的工作示例?我无法让它工作。 @rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81。 (如果这可以帮助您解决问题,请告诉我应该如何更新我的答案。) 澄清一下,如果你从命令行运行它,它应该是单个参数:sbt "testOnly *MySuite -- -z foo" 如果有人想要运行特定的集成测试(应该放在src/it 下),他们需要在it 前面加上testOnly。例如,在命令行上:sbt "it:testOnly *MyIntegrationTestSuite". 如何过滤多个子字符串?测试可以按层次结构(WordSpec)分组,由whenshould 分隔的名称部分可以在测试之间重复。要选择一个特定的测试,我需要说“名称包含这个和那个”。【参考方案2】:

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

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

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

test:testOnly *LoginServiceSpec

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

sbt "test:testOnly *LoginServiceSpec"

【讨论】:

赞成,因为显然双引号是必要的:sbt "test:testOnly *LoginServiceSpec" 这里对我最有用的答案。 ? 但是命令可以稍微简化;在 SBT 控制台中:testOnly *LoginServiceSpec,在外部:sbt "testOnly *LoginServiceSpec" 看来这是 sbt 0.13 的语法。使用sbt "Test/testOnly *LoginServiceSpec 或更好的事件,如其他地方提到的sbt "testOnly *LoginServiceSpec"【参考方案3】:

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

在 sbt 会话中:

test:testOnly *YourTestClass

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

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

test:testQuick

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

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

如果您在测试类中有太多测试方法,请将它们分成单独的类或适当地标记它们。 (这可能表明被测类违反了single responsibility principle 并且可以使用重构。)

【讨论】:

对于面临“未执行测试”的人:*YourTestClass 必须是类名。不是文件名。 对我来说是 testOnly 而不是 test-only。 喜欢*的含义。【参考方案4】:

只是为了简化 Tyler 的例子。

test:-prefix 不需要。

所以按照他的例子:

sbt-console:

testOnly *LoginServiceSpec

在终端中:

sbt "testOnly *LoginServiceSpec"

【讨论】:

【参考方案5】:

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

这篇文章展示了哪些命令适用于使用 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"

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

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"

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

【讨论】:

哇,伙计!这真的是我在生活中遇到的一个创新的测试套件。脱帽致敬。

以上是关于sbt 中的 ScalaTest:有没有办法在没有标签的情况下运行单个测试?的主要内容,如果未能解决你的问题,请参考以下文章

使用scalatest,sbt目录结构时出错

如何在 ScalaTest / SBT 中按顺序运行测试套件?

如何使用 scalatest 运行 sbt 测试?我有一个错误:对象 scalatest 不是包 org 的成员

如何使用 SBT Jenkins 插件运行特定测试以进行 ScalaTest 测试

scalatest : 对象 scalatest 不是包 org 的成员

Scala sbt:sbt 中的多个依赖项