Go开发命令行程序指南( 六 )

  • 对标志、参数、子命令和选项应使用描述性的名称,以反映其含义和功能 。避免使用单字母名称,除非它们非常常见或非常直观(如-v按惯例表示verbose模式) 。
  • 为每个标志、参数、子命令和选项提供简短而清晰的描述,解释它们的作用以及它们如何影响你的程序的行为 。你可以用圆括号“( )”来表达额外的细节或例子 。
  • 使用标题或缩进将相关的标志、参数、子命令和选项组合在一起 。你也可以用空行或水平线(---)来分隔usage的不同部分 。
  • 在每组中按名称的字母顺序排列标志 。在每组中按重要性或逻辑顺序排列参数 。在每组中按使用频率排列子命令 。
  • git的usage就是一个很好的例子:
    $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程序的性能,你应该遵循一些步骤,比如说 。