Go语言文件操作工具的测试与日志功能实现
立即解锁
发布时间: 2025-09-14 00:07:59 阅读量: 4 订阅数: 38 AIGC 

# Go 语言文件操作工具的测试与日志功能实现
## 1. 测试辅助函数的使用
在编写文件列表功能的集成测试时,我们使用 `testdata` 目录和一组文件来支持测试用例。这种方法在目录结构不变时效果很好,但如果要测试文件删除功能,这可能不是最佳选择,因为文件在第一次测试后会被删除,每次运行测试都需要重新创建。
### 1.1 测试辅助函数的优势
为了解决这个问题,我们可以为每个测试自动创建和清理测试目录及文件。在 Go 语言中,可以通过编写测试辅助函数并在每个测试中调用该函数来实现。测试辅助函数与其他函数类似,但可以通过调用 `testing` 包中的 `t.Helper` 方法将其显式标记为测试辅助函数。这样,当辅助函数使用 `t.Fatal` 失败时,Go 会打印调用辅助函数的测试函数中的行号,而不是辅助函数内部的行号,这有助于排查测试错误。
### 1.2 创建测试辅助函数
以下是创建测试辅助函数的步骤:
1. **添加必要的包**:在 `main_test.go` 文件中,添加 `fmt`、`io/ioutil`、`os` 和 `path/filepath` 包到导入列表中。
```go
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"testing"
)
```
2. **定义辅助函数**:在文件末尾添加辅助函数 `createTempDir`,该函数接受一个 `testing.T` 类型的指针和一个 `map[string]int` 类型的 `files` 参数,用于定义每种扩展名要创建的文件数量。函数返回创建的目录名和一个清理函数。
```go
func createTempDir(t *testing.T, files map[string]int) (dirname string, cleanup func()) {
t.Helper()
tempDir, err := ioutil.TempDir("", "walktest")
if err != nil {
t.Fatal(err)
}
for k, n := range files {
for j := 1; j <= n; j++ {
fname := fmt.Sprintf("file%d%s", j, k)
fpath := filepath.Join(tempDir, fname)
if err := ioutil.WriteFile(fpath, []byte("dummy"), 0644); err != nil {
t.Fatal(err)
}
}
}
return tempDir, func() { os.RemoveAll(tempDir) }
}
```
### 1.3 编写文件删除功能测试
在 `main_test.go` 文件中,添加新的测试函数 `TestRunDelExtension` 来测试文件删除功能。
```go
func TestRunDelExtension(t *testing.T) {
testCases := []struct {
name string
cfg config
extNoDelete string
nDelete int
nNoDelete int
expected string
}{
{name: "DeleteExtensionNoMatch",
cfg: config{ext: ".log", del: true},
extNoDelete: ".gz", nDelete: 0, nNoDelete: 10,
expected: "" },
{name: "DeleteExtensionMatch",
cfg: config{ext: ".log", del: true},
extNoDelete: "", nDelete: 10, nNoDelete: 0,
expected: "" },
{name: "DeleteExtensionMixed",
cfg: config{ext: ".log", del: true},
extNoDelete: ".gz", nDelete: 5, nNoDelete: 5,
expected: "" },
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
var buffer bytes.Buffer
tempDir, cleanup := createTempDir(t, map[string]int{
tc.cfg.ext: tc.nDelete,
tc.extNoDelete: tc.nNoDelete,
})
defer cleanup()
if err := run(tempDir, &buffer, tc.cfg); err != nil {
t.Fatal(err)
}
res := buffer.String()
if tc.expected != res {
t.Errorf("Expected %q, got %q instead\n", tc.expected, res)
}
filesLeft, err := ioutil.ReadDir(tempDir)
if err != nil {
t.Error(err)
}
```
0
0
复制全文
相关推荐









