golang高级教程_Go中的高级测试-教程 - Go语言中文社区

golang高级教程_Go中的高级测试-教程


golang高级教程

欢迎各位编码员! 在本教程中 ,我们将研究Go语言开发人员在官方Golang / go回购中使用的一些更高级的测试实践。

我觉得这种方法,实际上是研究生产系统中已完成的工作,有望使您对测试自己的生产级Go程序的最佳方法有所了解。

如果您刚开始测试基于Go的程序,那么建议您阅读我的其他教程: go中测试的简介

影片教学

本教程以视频格式提供。 如果您希望支持我和我的内容,请喜欢并订阅! :D

通过表驱动测试实现良好的覆盖率

让我们从strings包开始我们的旅程。 如果您在src/strings/查看strings_test.go文件的顶部,您应该会看到许多已定义和填充的数组。

例如,看一下lastIndexTests ,它是IndexTest类型的数组:

var lastIndexTests = []IndexTest{
{"", "", 0},
{"", "a", -1},
{"", "foo", -1},
{"fo", "foo", -1},
{"foo", "foo", 0},
{"foo", "f", 0},
{"oofofoofooo", "f", 7},
{"oofofoofooo", "foo", 7},
{"barfoobarfoo", "foo", 9},
{"foo", "", 3},
{"foo", "o", 2},
{"abcABCabc", "A", 3},
{"abcABCabc", "a", 6},
}

该数组用于测试strings.go文件中的LastIndex函数,其中包含许多否定和肯定的情况。 这些IndexTest元素中的每一个均具有标准string ,分隔符和out整数值,并具有如下所示的struct

type IndexTest struct {
s string
sep string
out int
}

然后,由所有这些测试用例运行的TestLastIndex()函数触发这些测试,并检查从lastIndex函数返回的结果是否与数组中概述的预期结果匹配。

对于许多不同的功能,多次执行相同的操作,这有助于确保在对这些功能进行任何代码更改时,预期的功能都不会更改。

使用测试数据目录

在某些情况下,您将无法像上面的示例一样将期望的输入和输出指定为元素数组。 您可能正在尝试测试如何读写文件系统上的文件或如何解析专有数据格式,等等。

如果是这种情况,那么一个选择是创建一个testdata目录,并在该目录中存储您可能需要测试的所有文件。

可以在标准库的src/archive/tar/下找到一个很好的例子,其中定义了testdata/目录,其中包含许多.tar文件,这些文件随后用于测试。

可以在reader_test.go文件中找到一些使用这些文件进行测试的相当复杂的示例。

func TestReader(t *testing.T) {
vectors := []struct {
file string // Test input file
headers []*Header // Expected output headers
chksums []string // MD5 checksum of files, leave as nil if not checked
err error // Expected error to occur
}{{
file: "testdata/gnu.tar",
headers: []*Header{{
Name: "small.txt",
Mode: 0640,
Uid: 73025,
Gid: 5000,
Size: 5,
ModTime: time.Unix(1244428340, 0),
Typeflag: '0',
Uname: "dsymonds",
Gname: "eng",
Format: FormatGNU,
}, {
Name: "small2.txt",
Mode: 0640,
Uid: 73025,
Gid: 5000,
Size: 11,
ModTime: time.Unix(1244436044, 0),
Typeflag: '0',
Uname: "dsymonds",
Gname: "eng",
Format: FormatGNU,
}},
chksums: []string{
"e38b27eaccb4391bdec553a7f3ae6b2f",
"c65bd2e50a56a2138bf1716f2fd56fe9",
},
},
// more test cases

在上面的函数中,您将看到核心开发人员将我们在此介绍的第一种技术与testdata/目录中的文件结合使用,以确保打开示例.tar文件时,文件及其校验和符合他们的期望。

模拟HTTP请求

一旦开始编写生产级API和服务,很可能会开始与其他服务进行交互,并且能够测试与这些服务交互的方式与测试代码库的其他部分一样重要。

但是,您可能正在与对数据库执行CRUD操作的REST API进行交互,因此,当您仅想测试事物是否正常运行时,您不希望这些更改实际上提交给数据库。

因此,为了解决这个问题,我们可以使用net/http/httptest包来模拟HTTP响应,这是我们在这种情况下最好的朋友。

package main_test

import (
"fmt"
"io"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)

func TestHttp(t *testing.T) {
//
handler := func(w http.ResponseWriter, r *http.Request) {
// here we write our expected response, in this case, we return a
// JSON string which is typical when dealing with REST APIs
io.WriteString(w, "{ "status": "expected service response"}")
}

req := httptest.NewRequest("GET", "https://tutorialedge.net", nil)
w := httptest.NewRecorder()
handler(w, req)

resp := w.Result()
body, _ := ioutil.ReadAll(resp.Body)
haha
fmt.Println(resp.StatusCode)
fmt.Println(resp.Header.Get("Content-Type"))
fmt.Println(string(body))
}

在上述测试案例中,我们基本上覆盖了我们期望从URL获得的响应,然后继续测试依赖于该响应的系统其他部分。

单独包装的使用

如果我们查看strings_test.go文件并在顶部检查软件包,则应注意,它与strings.go文件所在的软件包不在同一软件包中。

原因是什么? 它可以帮助您避免循环导入。 在某些情况下,您需要在*_test.go文件中导入一个包,以充分编写测试。 如果您导入的程序包已经包含您要测试的程序包的引用,则可能会看到循环依赖性问题。

区分您的单元测试和集成测试

我最初是从以下位置找到有关此提示的: Go Advanced Tips Tricks

如果您要为大型企业Go系统编写测试,那么很有可能要进行一组integrationunit测试,以确保系统的有效性。

但是,与单元测试相比,您经常会发现集成测试的运行时间要长得多,这是因为集成测试可能会扩展到其他系统。

在这种情况下,将集成测试放入*_integration_test.go文件,并在测试文件的顶部添加// +build integration是有意义的:

// +build integration

package main_test

import (
"fmt"
"testing"
)

func TestMainIntegration(t *testing.T) {
fmt.Println("My Integration Test")
}

为了运行这套集成测试,您可以像下面这样调用go test

➜ advanced-go-testing-tutorial git:(master) ✗ go test -tags=integration
My Integration Test
PASS
ok _/Users/elliot/Documents/Projects/tutorials/golang/advanced-go-testing-tutorial 0.006s

结论

因此,在本教程中,我们了解了Go语言维护人员采用的一些更高级的测试技术和技巧。

希望您发现这很有用,并且为您提供了改进和改进自己的Go测试所需的见识。 如果您觉得它有用,或有其他疑问,请随时在下面的评论部分中告诉我!

最初发布于 tutorialedge.net

翻译自: https://hackernoon.com/advanced-testing-in-go-tutorial-28b89d3a813

golang高级教程

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dfsgwe1231/article/details/107268095
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-20 11:08:56
  • 阅读 ( 805 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢