scala - 如何在 expect() 中看到错误值时生成 [error] 而不是 [info]

标签 scala testing sbt chisel

考虑以下代码:

import chisel3._
import chisel3.util._
import chisel3.iotesters._

class Inverter extends Module {
  val io = IO(new Bundle {
    val a = Input(UInt(4.W))
    val s = Output(UInt(4.W))
  })
  io.s := ~io.a
}

class InverterTester(c: Inverter) extends PeekPokeTester(c) {
  poke(c.io.a, 8)
  step(1)
  expect(c.io.s, 8) // Should be 7 here
}

object TestMain extends App {
  chisel3.iotesters.Driver.execute(args, () => new Inverter()) {
    c => new InverterTester(c)
  }
}

现在我运行 sbt 'test:runMain TestMain' 并得到这一行(info 为紫色):

[info] [0.002] EXPECT AT 1   io_s got 7 expected 8 FAIL

sbt 的退出值为零。

我需要那条线是错误的(红色):

[error] [0.002] EXPECT AT 1   io_s got 7 expected 8 FAIL

以及使上述 sbt 命令以非零值退出。

如何在对现有代码进行最少更改的情况下实现它?

最佳答案

首先是简单的部分。您可以像这样使用 chisel.execute 的结果来获得非零结果代码。

  val result = chisel3.iotesters.Driver.execute(args, () => new Inverter()) {
    c => new InverterTester(c)
  }
  System.exit(if(result) 0 else 1)

不幸的是,更改日志记录级别需要更改 chisel-testers 存储库中的每个单独的后端。以下是更改三者之一的 TreadleBackend.scala 的示例。

  def expect(signal: InstanceId, expected: BigInt, msg: => String)
    (implicit logger: TestErrorLog, verbose: Boolean, base: Int) : Boolean = {
    signal match {
      case port: Element =>
        val name = portNames(port)
        val got = treadleTester.peek(name)
        val good = got == expected

        if (!good) {
          logger error
                  s"""EXPECT AT $stepNumber $msg  $name got ${bigIntToStr(got, base)} expected ${bigIntToStr(expected, base)}""" +
                          s""" ${if (good) "PASS" else "FAIL"}"""
        }
        else if (verbose) {
          logger info
                  s"""EXPECT AT $stepNumber $msg  $name got ${bigIntToStr(got, base)} expected ${bigIntToStr(expected, base)}""" +
                          s""" ${if (good) "PASS" else "FAIL"}"""
        }
        if(good) treadleTester.expectationsMet += 1
        good
      case _ => false
    }
  }

这不是一个不合理的问题,我认为 logger.error 在预期失败时更有意义。有人担心更改此设置可能会对正在寻找该字符串的现有用户产生意想不到的后果。

但我想鼓励您看一看 freechipsproject/chisel-testers2 repo 。这是团队投入大部分测试开发时间的地方。它会更容易改变,它有很多其他用于构建单元测试的好特性,我们正在寻找方法让它比 chisel-testers 更好。

关于scala - 如何在 expect() 中看到错误值时生成 [error] 而不是 [info],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55253375/

相关文章:

scala - 如何在 SBT 0.7.x 中添加依赖项

scala - 对 Union 类型使用 Any 是个好主意吗?

grails - 如何在不使用 UI 的情况下自动执行 Java 应用程序测试?

python - 生成嵌套字典中所有可能的组合

scala - 标记为 "unused import"的包语句

scala - 如何在 SBT 任务中使用反射从源代码加载类?

scala - 如何让gradle为自定义源集生成junit测试结果报告?

scala - 条件状态 monad 表达式

scala - SBT 插件不使用自定义解析器

c# - 如何为包含异步服务调用的 RelayCommand 编写单元测试?