From a6dafaae7100d09eaa0d42a01df021775b1efebe Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 11 May 2025 11:11:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 15 ++++++ .vscode/settings.json | 6 +++ etc/unit_test.env | 1 + go.mod | 3 ++ skills/unit_test/README.md | 86 ++++++++++++++++++++++++++++++ skills/unit_test/add.go | 9 ++++ skills/unit_test/add_test.go | 32 +++++++++++ skills/unit_test/debug.png | Bin 0 -> 16590 bytes skills/unit_test/debug_button.png | Bin 0 -> 18041 bytes 9 files changed, 152 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 etc/unit_test.env create mode 100644 skills/unit_test/README.md create mode 100644 skills/unit_test/add.go create mode 100644 skills/unit_test/add_test.go create mode 100644 skills/unit_test/debug.png create mode 100644 skills/unit_test/debug_button.png diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..61b381c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${fileDirname}" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ad78f56 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "go.testEnvVars": { + "CONFIG_PATH": "application.yaml" + }, + "go.testEnvFile": "${workspaceFolder}/etc/unit_test.env" +} \ No newline at end of file diff --git a/etc/unit_test.env b/etc/unit_test.env new file mode 100644 index 0000000..000dbd2 --- /dev/null +++ b/etc/unit_test.env @@ -0,0 +1 @@ +DB_HOST=127.0.0.1 \ No newline at end of file diff --git a/go.mod b/go.mod index 348dd02..4944da1 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.24.1 require ( github.com/caarlos0/env/v6 v6.10.1 github.com/gin-gonic/gin v1.10.0 + github.com/stretchr/testify v1.9.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.7 gorm.io/gorm v1.26.0 @@ -15,6 +16,7 @@ require ( github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.1 // indirect @@ -32,6 +34,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect golang.org/x/arch v0.8.0 // indirect diff --git a/skills/unit_test/README.md b/skills/unit_test/README.md new file mode 100644 index 0000000..2e9bb81 --- /dev/null +++ b/skills/unit_test/README.md @@ -0,0 +1,86 @@ +# 单元测试 + +目的: 测试目标函数的功能是否正常 + +## 构建集成单元测试 + +目标函数: Add +站在使用者的角度进行单元测试: unittest.Add(1, 2) == 3 + +专门的包: 在同一个目录下,允许有2个包: 一个包就是普通包 unittest, 和一个单元测试包 unittest_test + +要求: +1. 单元测试包的文件名称: xxx_test.go, 必须以_test结尾,才是一个合格的单元测试包 +2. 必须是 xxx_test 包名 + + + +## 编写单元测试(run test) + +编写单元测试代码: Add + +1. 单元测试函数 必须以Test大头 +```go +// 针对Add函数的单元测试 +func TestAdd(t *testing.T) { + // 自己手动判断 + // /usr/local/go/bin/go test -timeout 300s -run ^TestAdd$ 122.51.31.227/go-course/go18/skills/unit_test -v -count=1 + // 如果没有打印日志, 配置vscode 打印单元测试的日志: -v -count=1 + // 加上这串配置 + // "go.testFlags": [ + // "-v", + // "-count=1" + // ], + t.Log(unittest.Add(1, 2)) + + // 通过程序断言来判断 + // if unittest.Add(1, 2) != 4 { + // t.Fatalf("1 + 2 != 4") + // } + // 专门的断言库 + should := assert.New(t) + should.Equal(3, unittest.Add(1, 2)) +} +``` + +## 单元测试调试(run debug) + +1. 需要加断点, 必须加在有代码的位置 + +```sh +go/bin/dlv dap --listen=127.0.0.1:59905 --log-dest=3 from /Users/yumaojun/Projects/go-course/go18/skills/unit_test +DAP server listening at: 127.0.0.1:59905 +Type 'dlv help' for list of commands. +``` + +2. 操作栏 + +![](./debug.png) + +1. Continue: 继续,继续到下一个断点处 +2. Step Over: 下一步,下一行 +3. Step In: 进入到这行里面的 执行逻辑 +4. Step Out: 从这行里面的执行路径出来 + +## 单元测试的配置 + +![](./debug_button.png) + +单元测试如何读取外部配置, vscode 帮我们执行CLI + +告诉vscode,读取单元测试的配置, vscode 如何读取单元测试: 只有一个办法通过环境变量 +1. 直接注入环境变量(Test Env Vars) : .vscode/settions.json +```json +{ + "go.testEnvVars": { + "CONFIG_PATH": "application.yaml" + } +} +``` +2. 将环境变量写入到一个文件中,让vscdoe读取 (Test Env File) +```json +{ + "go.testEnvFile": "${workspaceFolder}/etc/unit_test.env" +} +``` + diff --git a/skills/unit_test/add.go b/skills/unit_test/add.go new file mode 100644 index 0000000..88e57ab --- /dev/null +++ b/skills/unit_test/add.go @@ -0,0 +1,9 @@ +package unittest + +import "fmt" + +func Add(x, y int) int { + // + fmt.Println(y) + return x + x +} diff --git a/skills/unit_test/add_test.go b/skills/unit_test/add_test.go new file mode 100644 index 0000000..d8b10c5 --- /dev/null +++ b/skills/unit_test/add_test.go @@ -0,0 +1,32 @@ +package unittest_test + +import ( + "os" + "testing" + + unittest "122.51.31.227/go-course/go18/skills/unit_test" + "github.com/stretchr/testify/assert" +) + +// 针对Add函数的单元测试 +func TestAdd(t *testing.T) { + t.Log(os.Getenv("CONFIG_PATH")) + t.Log(os.Getenv("DB_HOST")) + // 自己手动判断 + // /usr/local/go/bin/go test -timeout 300s -run ^TestAdd$ 122.51.31.227/go-course/go18/skills/unit_test -v -count=1 + // 如果没有打印日志, 配置vscode 打印单元测试的日志: -v -count=1 + // 加上这串配置 + // "go.testFlags": [ + // "-v", + // "-count=1" + // ], + t.Log(unittest.Add(1, 2)) + + // 通过程序断言来判断 + // if unittest.Add(1, 2) != 4 { + // t.Fatalf("1 + 2 != 4") + // } + // 专门的断言库 + should := assert.New(t) + should.Equal(3, unittest.Add(1, 2)) +} diff --git a/skills/unit_test/debug.png b/skills/unit_test/debug.png new file mode 100644 index 0000000000000000000000000000000000000000..48207dbf046900c5f4417439782aa21214d4e4c2 GIT binary patch literal 16590 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 literal 0 HcmV?d00001