使用 sbt 和 testng 时,如何获取测试中抛出的异常的完整堆栈跟踪?

Posted

技术标签:

【中文标题】使用 sbt 和 testng 时,如何获取测试中抛出的异常的完整堆栈跟踪?【英文标题】:How can I get complete stacktraces for exceptions thrown in tests when using sbt and testng? 【发布时间】:2011-11-06 11:01:50 【问题描述】:

堆栈跟踪被截断 - 例如它们以[info] ...结尾

使用 last 或更改 traceLevel 没有帮助 - 它只是打印 sbt 包装器的完整堆栈跟踪。

这是使用 testng 进行测试(我也相信使用 scalatest 和 sl4j)

【问题讨论】:

【参考方案1】:

使用documentation here中的提示:

(引用)

您可以通过四种方式配置使用 sbt 运行时显示的输出:1) 关闭颜色,2) 显示短堆栈跟踪,3) 完整堆栈跟踪,以及 4) 显示所有内容的持续时间。为此,您必须将 -o 参数传递给 ScalaTest,并在 -o 之后放置以下任意组合:

D - 显示持续时间 S - 显示短堆栈跟踪 F - 显示完整的堆栈跟踪 W - 无颜色

例如,“-oDF”将显示完整的堆栈跟踪和持续时间(每次测试花费的时间)。

要将参数从 sbt 传递给 ScalaTest,您可以全局添加测试选项,如下所示:

testOptions in Test += Tests.Argument("-oD")

(请参阅网站了解其余报价)

您可以使用以下 sbt 命令在测试中启用完整的堆栈跟踪:

> set testOptions in YourProjectName += Tests.Argument("-oF")

根据 Sasha 的评论,这也可以在每次测试运行时从命令行完成,如下所示。

$ sbt test -- -oF

【讨论】:

也可以在命令行测试执行期间使用-- -oF param:sbt test -- -oF启用完整堆栈跟踪 -oF 标志的问题在于它还显示了诸如不正确匹配之类的简单事情的完整堆栈跟踪。 2 不等于 3 不需要完整的堆栈跟踪。有什么想法可以解决这个问题吗? 澄清一下。如果您以交互方式工作并且已经在正确的模块中,这就足够了:set testOptions += Tests.Argument("-oF") 交互式会话中的所有下一次运行都将是“stacktrace-ed”。 $ sbt test -- -oF 不起作用,顺便说一句。 sbt.version=1.4.3【参考方案2】:

作为让 SBT 打印完整堆栈跟踪的替代方法,您能否在测试运行器周围放置一个 try-catch 块?例如,来自 REPL:

scala> try  throw new Exception  catch  case e => e 
res1: java.lang.Throwable = java.lang.Exception

scala> res1.printStackTrace
java.lang.Exception
    at $line2.$read$$iw$$iw$.liftedTree1$1(<console>:8)
    at $line2.$read$$iw$$iw$.<init>(<console>:8)
    at $line2.$read$$iw$$iw$.<clinit>(<console>)
    ...

【讨论】:

try throw new Exception catch case e: Throwable =&gt; e.printStackTrace

以上是关于使用 sbt 和 testng 时,如何获取测试中抛出的异常的完整堆栈跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 @AfterMethod 中的 TestNG/Selenium 获取测试结果状态?

使用 Scala 从 SBT 获取堆栈跟踪

如何使用 maven-surefire-plugin 在同一个项目中执行 JUnit 和 TestNG 测试?

如何在 sbt 中运行和编译准确的一项测试?

如何使用注释在 testng + maven 中分离单元测试和集成测试?

在 testNG ITestListener 中获取测试方法的注释