当前位置: 首页 > 知识库问答 >
问题:

编写测试以检查runtimeerrors

刘永望
2023-03-14

我正在为一个解释器编写测试,该解释器需要大量语法上有效的输入。这是我如何做的一个最小的例子:

package minimalexample

import (
    "testing"
)

func access(i int) string {
    return []string{"a", "b"}[i]
}

func TestAccess(t *testing.T) {
    tests := []struct {
        testdatum int
        expected  string
    }{
        {0, "a"},
        {2, ""},
        {1, "c"},
        {4, ""},
    }

    for _, tt := range tests {
        testAccess(tt, t)
    }
}

func testAccess(tt struct {
    testdatum int
    expected  string
}, t *testing.T) {

    defer func() {
        if err := recover(); err != nil {
        t.Errorf("Runtime error for testdatum %v: %q", tt.testdatum, err)

        }
    }()
    result := access(tt.testdatum)
    if result != tt.expected {
        t.Errorf("%v evaluates to %q, though it should be %q", tt.testdatum, result, tt.expected)
    }

}

处理panic的想法来自https://golang.org/doc/entiful_go#recover,但是我不知道在测试中使用它是否像上面的示例中那样是一种好的做法,或者有某种原因,为什么在修复运行时错误之前,最好让测试失败。

这种设置的好处是,我可以看到所有TestCase会发生什么,即使其中一个会引起恐慌。我仍然犹豫不决地说这是一个好的解决方案的原因是,我不确定关心运行时错误是测试人员的工作,还是应该由开发人员处理,开发人员必须修复代码以使测试通过。另一个原因是,在运行了一系列这些测试之后,我从vscode中得到了一个消息,我不明白,但怀疑与彻底的延迟有关:“运行贡献的命令:'_vscode_delegate_cmd_kms3v2s2'失败了。”

共有1个答案

邴景山
2023-03-14

我不认为在测试中恢复panic以更清晰地捕捉它有任何错误,除了它可能表明您(或包作者)使用panic进行正常错误处理的设计模式不佳。

参见https://go-proverbs.github.io/

别怕.

    null

关键是恐慌应该少用,因为通常错误更合适。而且应该更少地使用恢复,因为恐慌意味着事情出了很大的问题,不太可能有任何方法来修复它。

因此,您永远不应该使用panic,其目的是在典型使用下恢复panic。

再说一遍,这不是一个规则,它只是我在Go中错误处理的哲学

    null
    null
 类似资料:
  • 测试用来验证非测试的代码是否按照期望的方式运行的 Rust 函数。测试函数体通常执行如下三种操作: 设置任何所需的数据或状态 运行需要测试的代码 断言其结果是我们所期望的 让我们看看 Rust 提供的专门用来编写测试的功能:test 属性、一些宏和 should_panic 属性。 作为最简单例子,Rust 中的测试就是一个带有 test 属性注解的函数。属性(attribute)是关于 Rust

  • 如果现有的特征测试不能完成你所需要的工作,你就必须编写一个新的。这些宏是创建模块。它们为其它宏提供了检查各种 特征是否存在并且报告结果的方式。 本章包括一些建议和一些关于现有的测试的为什么要那样编写的原因。通过阅读现有的测试,你还可以学到许多关于编写 Autoconf测试的方法。如果在一个或多个Autoconf测试中出现了错误,这些信息可以帮助你理解它们意味着什么,这有助 于你找到最佳的解决问题的

  • 由于你写的大部分 Redux 代码是函数,而且其中大部分是纯函数,所以很好测,不需要模拟。 准备工作 我们推荐使用 Jest) 作为测试引擎,需要注意的是 Jest 运行在 Node 环境中,因此你不能访问 DOM。 npm install --save-dev jest 如果想要和 Babel 一起使用,还需要安装 babel-jest npm install --save-dev babel-

  • 假设我们编写了一个hello.js,并且输出一个简单的求和函数: // hello.js module.exports = function (...rest) { var sum = 0; for (let n of rest) { sum += n; } return sum; }; 这个函数非常简单,就是对输入的任意参数求和并返回结果。 如

  • 第一个测试案例: import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; class FirstJUnit5Tests { @Test void myFirstTest() { assertEquals(2, 1 + 1);

  • 我不会告诉你有关后台任务的单元测试的任何内容,因为Hangfire没有添加任何特定方法 (除了 IJobCancellationToken 接口参数)去改变任务。使用您最喜爱的工具,并照常写入单元测试。本节介绍如何测试创建的后台任务。 所有的代码示例都使用静态 BackgroundJob 类来告诉你如何做这个或那些东西,只是出于简单演示的目的。但是当你想测试调用的静态方法时,会变得很痛苦。 不用担