【Go语言测试】使用基准分析 Go 函数的性能
这篇博文是对 justforfunc 第 28 集的补充,您可以在下方观看。
https://youtu.be/2AulMm-hsdI
在上一篇博文中,我讨论了在 Go 中合并 n 个通道的两种不同方式,但我们没有讨论哪种方式更快。与此同时,YouTube 评论中提出了第三种合并频道的方法。
这篇博文将展示第三种方式,并从性能角度比较所有方式,并使用基准进行分析。
第三种渠道合并方式
两集前,我们讨论了如何使用单个 goroutine 和 nil 通道合并两个通道。我们将这里的该函数称为 mergeTwo。一个 justforfunc 查看器提出了一种使用此函数和递归的方法,以提供一种合并 n 个通道的方法。
使用递归合并 N 个通道
解决方案非常聪明。如果我们有:
- 一个频道,我们返回那个频道。
- 两个或更多通道,我们合并一半通道,然后使用使用高效函数的结果合并它们。
没有频道怎么办?我们将返回一个已经关闭的通道。
【Go语言测试】如何在 Go 中编写基准测试
这篇文章继续了我几周前开始的测试包系列。您可以在此处阅读上一篇关于编写表驱动测试的文章。您可以在 https://github.com/davecheney/fib 存储库中找到下面提到的代码。
介绍
Go 测试包包含一个基准测试工具,可用于检查 Go 代码的性能。这篇文章解释了如何使用测试包来编写一个简单的基准测试。
您还应该查看 Profiling Go 程序的介绍性段落,特别是有关在您的机器上配置电源管理的部分。无论好坏,现代 CPU 严重依赖主动热管理,这会给基准测试结果增加噪音。
编写基准
我们将重用上一篇文章中的 Fib 函数。
func Fib(n int) int { if n < 2 { return n } return Fib(n-1) + Fib(n-2) }
基准放置在 _test.go 文件中,并遵循其测试对应物的规则。在第一个示例中,我们将对计算斐波那契数列中第 10 个数字的速度进行基准测试。
【Go语言测试】高级 Go 测试教程
🚀 我的新课程 - Golang 测试圣经现已推出,涵盖了启动和运行为 Go 应用程序创建测试所需的一切!
欢迎各位码农!在本教程中,我们将看看 Go 核心语言开发人员和流行的生产级工具等使用的更高级的测试实践的选择。
我觉得这种方法,即实际研究在生产系统中所做的事情,有望让您深入了解测试您自己的生产级 Go 程序的最佳方法。
注意 - 如果您对测试基于 Go 的程序完全不熟悉,那么我建议您查看我的另一个教程:go 测试简介
目标
在本教程结束时:
- 您将对如何测试 Go 系统有更深入的了解
- 您将知道如何分离您的单元和集成测试。
- 您将知道如何模拟您的 Go 应用程序可能发出的任何 HTTP 请求。
先决条件
在您阅读本文之前,您将需要以下内容:
【Go语言测试】使用 Testify 改进你的 Go 测试和模拟
🚀 我的新课程 - Golang 测试圣经现已推出,涵盖了启动和运行为 Go 应用程序创建测试所需的一切!
断言是我真正觉得 Go 中的标准库缺少的东西。您绝对可以通过 if 比较之类的方法和其他任何方法获得相同的结果,但这并不是编写测试文件的最简洁方式。
这就是像stretchr/testify 这样的人来拯救这一天的地方。这个包已经迅速成为最流行的测试包之一,如果不是全球 Go 开发人员最流行的测试包的话。
它优雅的语法允许您编写非常简单且有意义的断言。
入门
为了启动和运行 testify 包,我们必须做的第一件事就是安装它。现在,如果您使用的是 Go 模块,那么这只是在您的一个 *_test.go 文件的顶部导入包之后调用 go test ... 的情况。
但是,如果您仍然停留在旧版本的 Go 上,您可以通过键入以下内容来获取此包:
go get github.com/stretchr/testify
完成此操作后,我们应该开始将其合并到我们的各种测试套件中。
【Go语言中级开发】Go 接受接口返回结构
欢迎地鼠!在本文中,我们将介绍接受接口和返回结构的概念,以及这如何帮助改进您的代码,使其更具可测试性和可维护性。
概述
在编写 Go 应用程序时,我想记住的关键事项之一是“我怎样才能使这个特定的功能尽可能地可测试?”。
对于更复杂的应用程序,能够在我们的应用程序中使用所有不同的代码路径可能有点像噩梦,这取决于我们构建某些组件的方式。
在本文中,我将首先演示一种接受指向结构的指针的方法,以及这如何限制我们测试事物的能力。然后,我们将看看如何通过一些细微的更改来改进代码,这些更改应该使我们能够做一些花哨的事情,比如使用 mock 和 fake 对我们的代码进行单元测试。
传递指针
让我们首先看一个不遵循接受接口的包的标准示例,返回结构的咒语。
在这个例子中,我们将在我们的应用程序中定义一个用户包,它需要某种形式的数据库来获取用户,然后,在一些业务逻辑之后,它将能够持久化所做的任何更改。