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 0000000..48207db Binary files /dev/null and b/skills/unit_test/debug.png differ diff --git a/skills/unit_test/debug_button.png b/skills/unit_test/debug_button.png new file mode 100644 index 0000000..15fe353 Binary files /dev/null and b/skills/unit_test/debug_button.png differ