$git usage: git [--version] [--help] [-C <path>] [-c <name>=<value>][--exec-path[=<path>]] [--html-path] [--man-path] [--info-path][-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare][--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]<command> [<args>]
结合上面的准则,大家可以细心体会一下 。六. 测试和发布你的CLI程序编写优秀CLI程序的最后一个环节是测试和发布你的程序 。测试确保你的程序可以按预期工作,并符合质量标准 。发布可以使你的程序可供用户使用和访问 。
在本节中,我将说明如何使用testing、testify/assert、mock包对你的代码进行单元测试,如何使用go test、coverage、benchmark工具来运行测试和测量程序性能以及如何使用goreleaser包来构建跨平台的二进制文件 。
1. 使用testing、testify的assert及mock包对你的代码进行单元测试单元测试是一种验证单个代码单元(如函数、方法或类型)的正确性和功能的技术 。单元测试可以帮助你尽早发现错误,提高代码质量和可维护性,并促进重构和调试 。
要为你的Go CLI程序编写单元测试,你应该遵循一些最佳实践:
- 使用内置的测试包来创建测试函数,以Test开头,后面是被测试的函数或方法的名称 。例如:func TestSum(t *testing.T) { ... };
- 使用*testing.T类型的t参数,使用t.Error、t.Errorf、t.Fatal或t.Fatalf这样的方法报告测试失败 。你也可以使用t.Log、t.Logf、t.Skip或t.Skipf这样的方法来提供额外的信息或有条件地跳过测试 。
- 使用Go子测试(sub test)[26],通过t.Run方法将相关的测试分组 。例如:
func TestSum(t *testing.T) {t.Run("positive numbers", func(t *testing.T) {// test sum with positive numbers})t.Run("negative numbers", func(t *testing.T) {// test sum with negative numbers})}
- 使用表格驱动(table-driven)的测试来运行多个测试用例,比如下面的例子:
func TestSum(t *testing.T) {tests := []struct{name stringa intb intwant int}{{"positive numbers", 1, 2, 3},{"negative numbers", -1, -2, -3},{"zero", 0, 0 ,0},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {got := Sum(tt.a , tt.b)if got != tt.want {t.Errorf("Sum(%d , %d) = %d; want %d", tt.a , tt.b , got , tt.want)}})}}
- 使用外部包,如testify/assert或mock来简化你的断言或对外部的依赖性 。比如说:
import ("github.com/stretchr/testify/assert""github.com/stretchr/testify/mock")type Calculator interface {Sum(a int , b int) int}type MockCalculator struct {mock.Mock}func (m *MockCalculator) Sum(a int , b int) int {args := m.Called(a , b)return args.Int(0)}
2. 使用Go的测试、覆盖率、性能基准工具来运行测试和测量性能Go提供了一套工具来运行测试和测量你的代码的性能 。你可以使用这些工具来确保你的代码按预期工作,检测错误或bug,并优化你的代码以提高速度和效率 。要使用go test、coverage、benchmark工具来运行测试和测量你的Go CLI程序的性能,你应该遵循一些步骤,比如说 。
- 将以_test.go结尾的测试文件写在与被测试代码相同的包中 。例如:sum_test.go用于测试sum.go 。
- 使用go测试命令来运行一个包中的所有测试或某个特定的测试文件 。你也可以使用一些标志,如-v,用于显示verbose的输出,-run用于按名字过滤测试用例,-cover用于显示代码覆盖率,等等 。例如:go test -v -cover ./...
推荐阅读
- 可以让你零代码快速开发REST API的几个开源项目
- HTTP缓存如何提高Web应用程序的性能?
- 搭建私有云平台,无需开发,一键部署,让你省事又省心。懂视生活
- APP开发用什么语言好?Java和PHP的区别在哪?
- GPT-4解放程序员!GitHub推出Copilot X,动动嘴就能写代码
- iOS使用FFmpeg命令行
- 从零开发一套基于React的加载动画库
- 短视频开发,如何正确的使用前后端分离?
- 2023年优秀编程语言趋势
- 程序员|作为一个程序员为什么今年的工作感觉更难找了呢