golang开发技能

ops/2025/2/5 21:36:54/

本文主要介绍go相关 开发技巧、调试技巧、工具使用、单元测试、基准测试、性能测试相关。

1、Go命令:go test工具详解

这里先大致介绍测试工具“go test”,go test 本身可以携带很多参数,熟悉这些参数可以让我们的测试过程更加方面。具体使用参见下一节。

(1)运行整个项目

go test

(2)只运行某个测试文件

注:math_test.go 和 math.go 是一对,缺一不可且前后顺序不可调。

go test math_test.go math.go

(3)加 -v 查看详细结果

go test -v math_test.go math.go

(4)只测试某个函数,-run支持正则。如下例子中 TestAdd,如果还有一个测试函数为TestAdd02那么它也会被运行。

go test -v -run="TestAdd"

(5)生成test的二进制文件:加 -c 参数

go test -v -run="TestAdd" -c

(6)执行这个test测试文件:加 -o 参数

go test -v -o math.test

(7)只测试安装/重新安装 依赖包,而不运行代码:加 -i 参数

go test -i

2、单元测试:如何进行单元测试

计算机中单元测试(Unit Testing)又称模块测试。用于对程序模块进行正确性检验。

程序单元是应用的最小可测试部件,一般来说都是对某一个函数方法进行测试,以尽可能的保证没有问题或者问题可被我们预知。为了达到这个目的,我们可以使用各种手段、逻辑,模拟不同的场景进行测试。

那么我们如何在写Golang代码时,进行单元测试呢? —— 其实很简单。

2.1、单元测试

准备如下两个Go文件。

math.go

package mathfunc Add(x, y int) int {return x + y
}

math_test.go

package mathimport "testing"func TestAdd(t *testing.T) {t.Log(Add(1, 2))
}

然后使用 go test 工具去执行。输出如下:

[root746495-0 /data/go/gostudy/gocode/chapter1_basic]# go test .
ok      chapter1        0.002s

2.2、测试框架遵循规则

观察上述事例知道 Go语言测试框架要遵循以下原则。 

(1)单元测试代码的go文件必须以 _test.go 结尾。前面最好是被测试的文件名(不是必须),例如要测试 math.go 那么对应的测试文件命名为 math_test.go 最好。

(2)单元测试的函数名必须以 Test 开头,后面直接跟要测试的函数名。比如要测试Add函数,测试的函数就命名为TestAdd。

(3)单元测试的函数必须接收一个指向 testing.T 类型的指针,并且不能返回任何值。

2.3、表组测试

Add(1,2)是一次单元测试的场景,而Add(2,4)、Add(3,6) 又是另外两种单元测试的场景。

对于类似这种多种输入场景的测试,我们可以同时放在TestAdd里进行测试,即 表组测试

修改 math_test.go 如下:

package mathimport "testing"func TestAdd(t *testing.T) {sum := Add(1, 2)if sum == 3 {t.Log("the result is ok")} else {t.Fatal("the result is wrong!")}sum = Add(2, 4)if sum == 6 {t.Log("the result is ok")} else {t.Fatal("the result is wrong!")}
}

执行 go test . -v

[root746495-0 /data/go/gostudy/gocode/chapter1_basic]# go test . -v
=== RUN   TestAddmath_test.go:8: the result is okmath_test.go:15: the result is ok
--- PASS: TestAdd (0.00s)
PASS
ok      chapter1        0.002s

如果输出场景实在太多,也可以使用如下所示的 表格测试法

将 math_test.go 修改如下:

package mathimport "testing"type TestTable struct {xarg intyarg int
}func TestAdd(t *testing.T) {tables := []TestTable{{1, 2},{2, 4},{4, 8},{5, 10},{6, 12},}for _, table := range tables {result := Add(table.xarg, table.yarg)if result == (table.xarg + table.yarg) {t.Log("the result is ok")} else {t.Fatal("the result is wrong")}}
}

执行  go test . -v  输出如下:

[root5259746495-0 /data/go/gostudy/gocode/chapter1_basic]# go test . -v
=== RUN   TestAddmath_test.go:21: the result is okmath_test.go:21: the result is okmath_test.go:21: the result is okmath_test.go:21: the result is okmath_test.go:21: the result is ok
--- PASS: TestAdd (0.00s)
PASS
ok      chapter1        0.002s

3、调试技巧:使用gdb调试Go程序

如果使用 vscode 或者 golang 可以直接上手,关于ide调试这里不做过多介绍。

接下来主要介绍下GDB命令行调试。

—— 关于gdb调试后续用到再说吧。

4、Go命令:Go命令指南

这些在go语言入门中都已经介绍过了。

5、性能分析:pprof工具的简单使用

pprof 是Go程序性能分析常用的工具,关于pprof有很多的包,分别是:

  • runtime/pprof:Go的内置故,比较基础不常用。
  • pkg/profile:对runtime/pprof进行简化,一行代码即可,等程序执行结束后才可以分析。
  • net/http/pprof:最好用的库,可以暴露http服务实时获取分析。

km上有很多资料、也有过分享;后面需要的时候再研究研究。


http://www.ppmy.cn/ops/155977.html

相关文章

第五章:元婴-React用户功能实战

文章目录 登录页面布局JWT 令牌鉴权用户功能实现用户查询页面用户更改状态用户添加页面用户添加页面表单构建用户编辑页面用户编辑表单页面登录页面布局 import React, { useEffect, useState } from react import { Button, Form, Input, message } from antd import style fr…

索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢

索引的底层数据结构 MySQL中常用的是Hash索引和B树索引 Hash索引:基于哈希表实现的,查找速度非常快,但是由于哈希表的特性,不支持范围查找和排序,在MySQL中支持的哈希索引是自适应的,不能手动创建 B树的…

doris:STRUCT

STRUCT<field_name:field_type [COMMENT comment_string], ... > 表示由多个 Field 组成的结构体&#xff0c;也可被理解为多个列的集合。 不能作为 Key 使用&#xff0c;目前 STRUCT 仅支持在 Duplicate 模型的表中使用。一个 Struct 中的 Field 的名字和数量固定&…

PDF 擦除工具

该软件仅仅适用于非人民币玩家&#xff0c;如果有wps会员等类似的软件的没有大用处 PDF Eraser允许用户擦除PDF文件中任何元素&#xff0c;并且支持添加文本和图像。除此之外PDF Eraser允许用户删除不必要的PDF页面&#xff0c;为了兼顾一些大型的扫描的PDF文档&#xff0c;PDF…

ubuntu 网络管理--wpa_supplicant、udhcpc

ubuntu 网络管理--wpa_supplicant 1 介绍wpa_supplicant 无线认证wpa_passphrase 配置工具 NetworkManager 网络管理udhcpc 与 dhclient对比dhclient概述主要功能 udhcpc概述主要功能 2 联系依赖关系配置文件 3 区别4 如何选择5 示例使用 wpa_supplicant 手动连接无线网络使用 …

MVC 文件夹:架构之美与实际应用

MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…

HTTPS域名443端口证书到期问题排查与解决

在现代Web开发中&#xff0c;HTTPS协议广泛用于确保客户端和服务器之间的通信安全。然而&#xff0c;HTTPS依赖于SSL/TLS证书来加密通信并验证网站的身份。当证书过期时&#xff0c;客户端可能会遇到连接错误。本文将介绍如何排查和解决因证书过期引起的问题&#xff0c;尤其是…

CSS工程化概述

CSS的问题 类名冲突的问题 当你写一个 css 类的时候&#xff0c;你是写全局的类呢&#xff0c;还是写多个层级选择后的类呢&#xff1f; 你会发现&#xff0c;怎么都不好 过深的层级不利于编写、阅读、压缩、复用。过浅的层级容易导致类名冲突。 一旦样式多起来&#xff0…