【Go语言测试】使用 Testify 改进你的 Go 测试和模拟
🚀 我的新课程 - Golang 测试圣经现已推出,涵盖了启动和运行为 Go 应用程序创建测试所需的一切!
断言是我真正觉得 Go 中的标准库缺少的东西。您绝对可以通过 if 比较之类的方法和其他任何方法获得相同的结果,但这并不是编写测试文件的最简洁方式。
这就是像stretchr/testify 这样的人来拯救这一天的地方。这个包已经迅速成为最流行的测试包之一,如果不是全球 Go 开发人员最流行的测试包的话。
它优雅的语法允许您编写非常简单且有意义的断言。
入门
为了启动和运行 testify 包,我们必须做的第一件事就是安装它。现在,如果您使用的是 Go 模块,那么这只是在您的一个 *_test.go 文件的顶部导入包之后调用 go test ... 的情况。
但是,如果您仍然停留在旧版本的 Go 上,您可以通过键入以下内容来获取此包:
go get github.com/stretchr/testify
完成此操作后,我们应该开始将其合并到我们的各种测试套件中。
【Go语言高级开发】使用 Git Hooks 改进你的 Go 开发工作流程
Git hooks 是一种非常强大的改进开发工作流程的方法,无需记住运行额外的脚本或执行额外的任务。在本文中,我们将看看如何在项目存储库中定义自己的简单 git 钩子,它可以自动执行 linting + 格式化 Go 代码的任务。
这个相当简单的示例应该让您了解如何利用 git hooks 来实现您自己的狡猾计划。
现实生活中的例子
这方面的一个例子来自我当前的一个项目,其中团队必须在将机密文件推送到项目的存储库之前对其进行加密。加密文件是一件简单的事情,但由于我们正在处理的加密文件的数量,记住加密每个已更改的文件成为一项挑战,而且我们经常会运行我们的项目并挠头而我们试图弄清楚为什么它没有发现新的秘密。
解决方案
当试图解决这个问题时,我们可以使用的工具相当有限,并且不想使用会影响团队中有自己偏好的人的当前开发流程的东西。
【Go语言中级开发】Go Websocket 教程
嗨,开发人员! 在本教程中,我们将研究如何在我们自己的基于 Go 的程序中使用 WebSockets 来做一些很酷的实时事情。
在本教程结束时,我们应该已经涵盖了以下内容:
- 什么是 WebSocket
- 我们如何在 Go 中构建简单的 WebSocket 应用程序
出于本教程的目的,我们将使用 gorilla/websocket 包,因为我个人在一些生产应用程序中使用它并取得了巨大成功。
视频教程
https://youtu.be/dniVs0xKYKk
WebSockets - 它们是什么?
因此,我在许多不同的教程中多次介绍了这一点,但始终值得一提的是我们为什么使用 WebSocket 以及它们与传统 HTTP 请求的不同之处。
WebSockets 是升级后的 HTTP 连接,在连接被客户端或服务器终止之前一直存在。正是通过这个 WebSocket 连接,我们可以执行双工通信,这是一种非常奇特的方式,可以说我们可以使用这个单一连接从我们的客户端与服务器进行通信。
【Go语言中级开发】在 Go 中构建实时 YouTube 订阅者监视器
欢迎大家! 在本教程中,我们将获得一些乐趣,我们将在 Go 中创建一个实时的 YouTube 统计监控系统。
因此,我们将在本教程中研究许多不同的主题,例如创建 WebSocket 服务器和使用 WebSockets 与前端应用程序进行实时通信,以及如何与现有的 REST API 进行交互以 获取我们需要的订阅者统计信息。
目标
在本教程结束时:
- 您将对如何在自己的 Go 应用程序中使用 WebSockets 有更好的理解。
- 您将了解如何与 YouTube API 交互以检索您自己的 YouTube 频道的统计信息。
先决条件
- 您需要在开发机器上安装 Go 版本 1.11+。
视频教程
如果您愿意,本教程可在此处以视频格式提供:
https://youtu.be/n3BQLHtsrkM
入门
首先,我们要创建一个新目录来工作。我们将其命名为 youtube-stats/。
【Go语言容器化】Go 多阶段 Docker 教程
欢迎各位码农!在本教程中,我们将研究多阶段 Docker 镜像以及如何使用它们来最小化生产 Go 应用程序所需的容器大小。
在本教程结束时,我们将涵盖以下概念:
- 什么是多阶段 Dockerfile。
- 我们如何为我们的 Go 应用程序构建简单的多阶段 Dockerfile
Docker 是一种强大的容器化技术,可用于轻松启动隔离且可重现的环境,在其中构建和运行我们的应用程序。它越来越受欢迎,越来越多的云服务提供商提供本地 docker 支持,让您可以轻松部署容器化应用程序,让全世界看到!
注意 - 本教程是我之前的 Go + Docker 教程的后续,可以在此处找到:使用 Docker 容器化您的 Go 应用程序
多阶段 Dockerfile 的需求是什么?
为了了解多阶段 Dockerfile 为何有用,我们将创建一个简单的 Dockerfile,它具有一个阶段来构建和运行我们的应用程序,另一个 Dockerfile 具有构建器阶段和生产阶段。
一旦我们创建了这两个不同的 Dockerfile,我们应该能够比较它们,并希望自己看到多阶段 Dockerfile 比它们更简单的对应物更受欢迎!
【Go语言容器化】使用 Docker 容器化您的 Go 应用程序 - 教程
Docker 是一项真正出色的技术,它允许我们在一个简单的 Dockerfile 中指定我们希望所有应用程序存在的环境。 这有效地允许更轻松的协作,并使我们摆脱了在全球开发团队中非常普遍的“它在我的机器上工作”的问题。
因此,我觉得写一篇关于如何使用 Docker 容器化技术有效地容器化 Go 应用程序的教程是一个好主意。
在本教程结束时,您应该能够很好地掌握以下内容:
- Docker 的基础知识以及它对我们开发人员的用处
- 为你的 Go 应用程序编写一个简单的 Dockerfile
- 最后,我们将看看如何轻松地将这些应用程序部署到 DigitalOcean
为什么选择数字海洋? 我们会偷偷地希望他们开始赞助我即将发布的一些视频教程,这样我就可以开始全职专注于编写内容了! :D
视频教程
https://youtu.be/lIbdPrUpGz4
为什么选择 Docker?
在过去的几年里,我在许多不同的环境中多次被问到这个问题,并且我已经向各种经验水平的开发人员讨论了这项特殊的技术。
【Go语言中级开发】在 Go 中读取和写入文件
注意 - 如果你对在 Go 中使用 JSON 感兴趣,你可能也喜欢我的其他教程 - Go JSON 教程
在本教程中,我们将了解如何使用 go 编程语言有效地读取和写入文件系统中的文件。
我们将用于读取和写入这些文件的方法将与文件格式无关。这意味着您将能够使用我们将介绍的技术来读取和写入 .txt、.csv、.xls 等,这些文件的唯一不同之处在于其结构您写入每种文件类型的数据。
读取文件
为了读取本地文件系统上的文件,您必须使用 io/ioutil 模块。您首先必须通过调用 ioutil.ReadFile("/path/to/my/file.ext") 将文件的内容拉入内存,这将获取您希望读取的文件的路径唯一的参数。这将返回文件的数据,或者可以像您通常处理 go 中的错误一样处理的错误。
创建一个名为 main.go 的新文件以及另一个名为 localfile.data 的文件。将一段随机文本添加到 .data 文件中,以便我们完成的 go 程序可以读取一些内容,然后执行以下操作:
【Go语言中级开发】在 Go 1.11 中使用临时文件和目录
Go 1.11 带来了一些非常酷的新功能,例如实验性的 Go Modules 功能,以及使用 ioutil 包中的新 TempFile 和 TempDir 函数创建临时文件和目录的能力。
从这些函数调用创建的临时文件和目录是全局唯一的,这很棒,因为它简化了我们在 Go 程序中处理数百甚至数千个文件的方式。
在本教程中,我们将研究如何在自己的 Go 程序和一些潜在用例中使用它们。
创建临时文件
让我们从新的 TempFile 函数开始。假设我们正在创建一个对象识别系统,它可以提取数千张汽车图片并将它们用作训练集。
对于我们拉入的每辆汽车,我们都希望创建一个具有唯一名称的临时文件,我们不一定关心。
【Go语言中级开发】Go 接受接口返回结构
欢迎地鼠!在本文中,我们将介绍接受接口和返回结构的概念,以及这如何帮助改进您的代码,使其更具可测试性和可维护性。
概述
在编写 Go 应用程序时,我想记住的关键事项之一是“我怎样才能使这个特定的功能尽可能地可测试?”。
对于更复杂的应用程序,能够在我们的应用程序中使用所有不同的代码路径可能有点像噩梦,这取决于我们构建某些组件的方式。
在本文中,我将首先演示一种接受指向结构的指针的方法,以及这如何限制我们测试事物的能力。然后,我们将看看如何通过一些细微的更改来改进代码,这些更改应该使我们能够做一些花哨的事情,比如使用 mock 和 fake 对我们的代码进行单元测试。
传递指针
让我们首先看一个不遵循接受接口的包的标准示例,返回结构的咒语。
在这个例子中,我们将在我们的应用程序中定义一个用户包,它需要某种形式的数据库来获取用户,然后,在一些业务逻辑之后,它将能够持久化所做的任何更改。
【Go语言中级开发】Go 开发者的任务文件
欢迎Gophers!在本教程中,我将展示如何在 Go 应用程序开发中利用 Taskfiles 来获得名利。
(免责声明):本文是在 CircleCI 中采用 Taskfiles 来帮助他们采用 Go 的。我不能因为发现 Taskfiles 而获得任何功劳,因为这是另一个突出优势的团队。
如果您已经加入 Go 社区一段时间,您可能熟悉在 Go 应用程序中使用 Makefile 或类似的构建工具,您甚至可能选择了某种形式的脚本来捕获一些较长的命令以便更轻松发展。
你们当中的受虐狂甚至可能刚刚将所有常规命令都记入了记忆中。如何记住所有不同的构建参数和设置超出了我的范围,但对你能够记住的严重赞誉。
但毫无疑问,Taskfiles 是我最喜欢的新方法之一,它可以在一个地方捕获一些我必须在日常开发活动中运行的更繁琐的命令。
示例任务文件
让我们快速看一下在 taskfile.dev 主页上演示的示例 Taskfile.yml -