testing - 如何使用标准的 Go 测试包实现 BDD 实践?

标签 testing go

我想先写测试,再写让测试通过的代码。

我可以这样写测试函数:

func TestCheckPassword(t *testing.T) {
    isCorrect := CheckPasswordHash("test", "$2a$14$rz.gZgh9CHhXQEfLfuSeRuRrR5uraTqLChRW7/Il62KNOQI9vjO2S")

    if isCorrect != true {
        t.Errorf("Password is wrong")
    }
}

但我想为每个测试函数提供更多描述性信息。

例如,我正在考虑为我的应用程序创建身份验证模块。 现在,用简单的英语,我可以很容易地描述我对这个模块的要求:

  1. 它应该接受一个非空字符串作为输入。
  2. 字符串的长度必须介于 6 到 48 个字符之间。
  3. 如果密码字符串适合提供的哈希字符串,函数应返回 true,否则返回 false。

这些非技术业务人员可以理解的信息,除了放在评论中,还有什么方法可以放在测试中?

最佳答案

在 Go 中,编写测试以执行相关检查的一种常见方法是创建一片测试用例(称为 “表”,方法称为 “表”驱动测试”),我们简单地循环并逐一执行。

测试用例可能具有任意属性,通常由匿名结构建模。
如果您想为测试用例提供描述,您可以在描述测试用例的结构中添加一个附加字段。这将作为测试用例的文档和(部分)输出,以防测试用例失败。

为简单起见,让我们测试以下简单的 Abs()功能:

func Abs(x int) int {
    if x < 0 {
        return -x
    }
    return x
}

实现似乎是正确和完整的。如果我们想为此编写测试,通常我们会添加 2 个测试用例来覆盖 2 个可能的分支:test when x是负数(x < 0),而当x是非负的。实际上,它通常很方便,建议也测试特殊的 0输入和极端情况:输入的最小值和最大值。

如果我们仔细想想,这个Abs()当以 int32 的最小值调用时,函数甚至不会给出正确的结果。 ,因为那是 -2147483648 ,其绝对值为2147483648这不适合 int32因为 int32 的最大值是:2147483647 .所以上面的实现将溢出并错误地将负最小值作为负最小值的绝对值。

列出每个可能分支的案例的测试函数包括0和角落案例,带有描述:

func TestAbs(t *testing.T) {
    cases := []struct {
        desc string // Description of the test case
        x    int32  // Input value
        exp  int32  // Expected output value
    }{
        {
            desc: "Abs of positive numbers is the same",
            x:    1,
            exp:  1,
        },
        {
            desc: "Abs of 0 is 0",
            x:    0,
            exp:  0,
        },
        {
            desc: "Abs of negative numbers is -x",
            x:    -1,
            exp:  1,
        },
        {
            desc: "Corner case testing MaxInt32",
            x:    math.MaxInt32,
            exp:  math.MaxInt32,
        },
        {
            desc: "Corner case testing MinInt32, which overflows",
            x:    math.MinInt32,
            exp:  math.MinInt32,
        },
    }

    for _, c := range cases {
        got := Abs(c.x)
        if got != c.exp {
            t.Errorf("Expected: %d, got: %d, test case: %s", c.exp, got, c.desc)
        }
    }
}

关于testing - 如何使用标准的 Go 测试包实现 BDD 实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48882966/

相关文章:

dictionary - 构造深层结构不起作用

regex - Golang 匹配域名通配符

python - Tensorflow 二进制错误 Python vs Go

elasticsearch - Golang : Using ElasticSearch library called Goes, 如何为 bool should 方法编写可执行代码?

testing - 使用 Webpack+karma+etc 进行 Redux 异步测试

typescript - 无法生成 Jest 覆盖率报告

java - 测试图灵机仿真程序

go - golang中的多文件项目

node.js - 从 Node 运行 Mocha 测试 - 'describe' 未定义

java - 在没有注释的情况下模拟Java中的静态方法