实战 Hrp:手把手教你增加接口协议 -- 读取用例

根据之前的介绍,我们了解到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.DirFSfs.WalkDir遍历文件和文件夹路径,还需要对文件内容进行读取。读取后的内容需要进一步转换成hrp可以运行的测试用例对象。为此,我们使用了builtin.LoadFile来获取类型为TCase的测试用例,并通过testCasePath.ToTestCase()调用进行用例转换。

这些步骤相互配合,使我们能够从指定的文件路径中获取测试用例数据,并将其转换为hrp可运行的测试用例对象。这样,我们便能够顺利地将文件中的用例内容读取并集成到整个测试用例列表中,为后续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值