根据之前的介绍,我们了解到hrp用例的文件读取是由loader.go
文件中的LoadTestCases
函数完成的。该函数接收一个ITestCase
切片作为输入,并返回一个TestCase
切片作为输出。在函数内部,通过遍历ITestCase
切片,将文件内容转换成可执行的测试用例数据。
func LoadTestCases(iTestCases ...ITestCase) ([]*TestCase, error) {
for _, iTestCase := range iTestCases {
}
}
在Go语言中,我们可以编写代码将不同文件格式(json、yaml、yml)的内容解析成hrp可以读取的测试用例格式。为此,我们需要定义一个ITestCase
接口,其中包含两个方法:GetPath
用于获取用例文件路径,ToTestCase
用于将用例转换成TestCase
对象,后者包含配置和测试步骤列表。在上一节中,我们对用例类型进行讲解,最重要的就是鸭子类型,只要实现接口ITestCase
的所有方法,那么这个结构体就实现了ITestCase
。如果你还没学会,可以咨询作者了解更多,也可以再看一遍,有时候多看几遍你会发现有不一样的惊喜。
// ITestCase represents interface for testcases,
// includes TestCase and TestCasePath.
type ITestCase interface {
GetPath() string
ToTestCase() (*TestCase, error)
}
// TestCase is a container for one testcase, which is used for testcase runner.
// TestCase implements ITestCase interface.
type TestCase struct {
Config *TConfig
TestSteps []IStep
}
在处理可以直接转换成TestCase
对象的用例类型时,我们可以直接进行格式转换,并将其添加到用例列表中。通常这些用例类型是直接用Go语言编写的,因此转换过程相对简单直接。一旦转换成功,我们便可将它们无缝地集成到用例列表中,为后续的测试执行做好准备。这样,我们可以轻松地管理不同格式的用例,并确保它们能够被hrp正确地识别和执行。
if _, ok := iTestCase.(*TestCase); ok {
testcase, err := iTestCase.ToTestCase()
if err != nil {
log.Error().Err(err).Msg("failed to convert ITestCase interface to TestCase struct")
return nil, err
}
testCases = append(testCases, testcase)
continue
}
如果iTestCase
是*TestCasePath
类型的实例,那么它表示一个文件或文件夹的路径,需要读取其中的测试用例数据。为了实现这一目的,我们使用os.DirFS
来创建一个虚拟文件系统,并通过fs.WalkDir
遍历指定路径下的文件和文件夹。在遍历过程中,我们会忽略隐藏文件夹(以点"."开头的文件夹)和非测试用例文件(非 .yml
、.yaml
和 .json
后缀的文件),而将符合条件的测试用例文件转换为*TestCase
结构,并将其添加到testCases
切片中。这样,我们就能够方便地从指定的文件路径读取测试用例数据,并进行后续的测试执行。
// 否则,iTestCase应该是一个TestCasePath,表示文件路径或文件夹路径
tcPath, ok := iTestCase.(*TestCasePath)
if !ok {
return nil, errors.New("invalid iTestCase type")
}
// 获取测试用例路径
casePath := tcPath.GetPath()
// 使用fs.WalkDir函数遍历目录结构,处理每个测试用例文件
err := fs.WalkDir(os.DirFS(casePath), ".", func(path string, dir fs.DirEntry, e error) error {
if dir == nil {
// casePath是文件而不是目录
path = casePath
} else if dir.IsDir() && path != "." && strings.HasPrefix(path, ".") {
// 跳过隐藏文件夹
return fs.SkipDir
} else {
// casePath是目录
path = filepath.Join(casePath, path)
}
// 忽略非测试用例文件
ext := filepath.Ext(path)
if ext != ".yml" && ext != ".yaml" && ext != ".json" {
return nil
}
// 获取TestCasePath并转换为TestCase结构,然后添加到testCases切片中
testCasePath := TestCasePath(path)
tc, err := testCasePath.ToTestCase()
if err != nil {
return nil
}
testCases = append(testCases, tc)
return nil
})
在上述操作中,我们不仅需要通过os.DirFS
和fs.WalkDir
遍历文件和文件夹路径,还需要对文件内容进行读取。读取后的内容需要进一步转换成hrp可以运行的测试用例对象。为此,我们使用了builtin.LoadFile
来获取类型为TCase
的测试用例,并通过testCasePath.ToTestCase()
调用进行用例转换。
这些步骤相互配合,使我们能够从指定的文件路径中获取测试用例数据,并将其转换为hrp可运行的测试用例对象。这样,我们便能够顺利地将文件中的用例内容读取并集成到整个测试用例列表中,为后续