添加测试

By | 2021年9月16日

代码已经相对稳定,后面我们将会添加测试。

在开发期间测试您的代码可以暴露在您进行更改时发现的错误。在本主题中,您将为该Hello函数添加一个测试 。

注意:本主题是从创建 Go 模块开始的多部分教程的一部分。

Go 对单元测试的内置支持使您可以更轻松地进行测试。具体来说,使用命名约定、Go 的testing包和go test命令,您可以快速编写和执行测试。

  1. 在 greetings 目录中,创建一个名为 greetings_test.go 的文件。

    以 _test.go 结尾的文件名告诉go test命令该文件包含测试函数。

  2. 在 greetings_test.go 中,粘贴以下代码并保存文件。

    package greetings
    
    import (
       "testing"
       "regexp"
    )
    
    // TestHelloName calls greetings.Hello with a name, checking
    // for a valid return value.
    func TestHelloName(t *testing.T) {
       name := "Gladys"
       want := regexp.MustCompile(`\b`+name+`\b`)
       msg, err := Hello("Gladys")
       if !want.MatchString(msg) || err != nil {
           t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
       }
    }
    
    // TestHelloEmpty calls greetings.Hello with an empty string,
    // checking for an error.
    func TestHelloEmpty(t *testing.T) {
       msg, err := Hello("")
       if msg != "" || err == nil {
           t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
       }
    }
    

    在此代码中,您:

  • 在与您正在测试的代码相同的包中实现测试功能。
  • 创建两个测试函数来测试greetings.Hello 函数。测试函数名称的形式为,其中Name表示特定测试的一些内容。此外,测试函数将指向包类型的指针作为参数。您可以使用此参数的方法来报告和记录您的测试。
  • 实现两个测试:
    • TestHelloName调用该Hello函数,传递一个name值,该函数应该能够使用该值返回有效的响应消息。如果调用返回错误或意外响应消息(不包含您传入的名称的消息),则使用t参数的方法将消息打印到控制台并结束执行。
    • TestHelloEmpty``Hello用空字符串调用函数。此测试旨在确认您的错误处理工作正常。如果调用返回非空字符串或没有错误,则使用t参数的Fatalf 方法将消息打印到控制台并结束执行。
  1. 在greetings目录下的命令行,运行

    go test命令

    执行测试。

    go test命令执行测试Test文件(名称以 _test.go 结尾)中的测试函数(名称以test开头)。

    您可以添加-v标志以获取列出所有测试及其结果的详细输出。

    测试应该通过。

    $ go test
    PASS
    ok      example.com/greetings   0.364s
    
    $ go test -v
    === RUN   TestHelloName
    --- PASS: TestHelloName (0.00s)
    === RUN   TestHelloEmpty
    --- PASS: TestHelloEmpty (0.00s)
    PASS
    ok      example.com/greetings   0.372s
    
  2. 中断greetings.Hello函数以查看失败的测试。

    TestHelloName测试功能检查您指定为名称的返回值Hello函数的参数。要查看失败的测试结果,请更改greetings.Hello函数使其不再包含名称。

    在 greetings/greetings.go 中,粘贴以下代码代替 Hello函数。请注意,该修改会更改函数返回的值,就好像name参数已被意外删除一样。

    // Hello returns a greeting for the named person.
    func Hello(name string) (string, error) {
       // If no name was given, return an error with a message.
       if name == "" {
           return name, errors.New("empty name")
       }
       // Create a message using a random format.
       // message := fmt.Sprintf(randomFormat(), name)
       message := fmt.Sprint(randomFormat())
       return message, nil
    }
    
  3. 在greetings目录下的命令行,运行go test执行测试。

    这一次,在go test没有-v标志的情况下运行。输出将仅包含失败的测试的结果,这在您进行大量测试时非常有用。该TestHelloName测试将失败-TestHelloEmpty还通过。

    $ go test
    --- FAIL: TestHelloName (0.00s)
       greetings_test.go:15: Hello("Gladys") = "Hail, %v! Well met!", <nil>, want match for `\bGladys\b`, nil
    FAIL
    exit status 1
    FAIL    example.com/greetings   0.182s
    

在下一个主题中,您将看到如何编译和安装代码以在本地运行它。

请关注公众号获取更多资料

发表评论

电子邮件地址不会被公开。 必填项已用*标注