【Golang 接口自动化05】使用yml管理自动化用例

我们在前面几篇文章中学习怎么发送数据请求,怎么处理解析接口返回的结果,接下来我们一起来学习怎么进行测试用例管理,今天我们介绍的是使用yml文件进行用例管理,所以首先我们一起来了解一下YAML和它的简单用法。

YAML

YAML(Yet Another Markup Language),可能大家在工作中或多或少已经接触过这个文件格式。它是一种基于Unicode用来表达资料序列的编程语言,有易阅读、易与脚本语言交互的特点。在博主所在项目接入了k8s之后,基本上所有的配置都使用的yml。

我觉得yml相比较于json文件格式最大的优势是支持注释,而json数据定义是不支持注释的,而且编写格式上也较yml严格。下面我们一起来了解一下yml的语法。

基本语法

1、yml文件以缩进代表层级关系
2、缩进不允许使用tab只能使用空格
3、空格的个数不重要,只要相同层级的元素左对齐即可
4、大小写敏感
5、数据格式为,名称:(空格)值

对象:键值对的集合(key:value)

>  字符串不用使用双引号或单引号圈起来
>   双引号圈住时不会转义字符串中的特殊字符
>  单引号圈住时会转义字符串中的特殊字符

数组:一组按顺序排列的值

>  数组名:
>             -元素1
>             -元素2
>  行内写法:
>         数组名:[元素1,元素2,元素3]

字面量:单个的、不可再分的值(数字、字符串、布尔值)

yml 格式的测试用例

定义yml文件

下面我们以登陆为例来编写测试用例,将下面这些信息保存到testCase.yml中,我们的策四用力就完成了:

Testsuit: 登录
description: 用户中心登录测试
commonparam: 
  username: name
  passwd: pwd
TestCases:
  - 
    url: /api/user/login
    detail: 正常登陆
    method: Get
    data:  
      username: name
      passwd: pwd
    check: 
      - pr
      - userId
  -
    url: /api/user/login
    detail: 密码错误
    method: post
    data:
      username: name
      passwd: pwd
    check:
      - 密码错误

  -
    url: /api/user/login
    detail: 必填参数未填,不填密码
    method: post
    data:
      username: name
    check:
      - 必填参数未填
  -
    url: /api/user/login
    detail: 密码错误
    method: post
    data:
      username: name
      passwd: pwd
    check:
      - 密码错误
  -
    url: /api/user/login
    detail: 密码错误
    method: post
    data:
      username: name
      passwd: pwd
    check:
      - 密码错误

接下来我们一起来学习怎么读取上面定义的用例信息。

创建结构体

通过观察上面的yml文件结合前面学习的yml的基础语法我们可以很轻松的知道,TestCases的具体数据是一个个的数组,发送的数据也是一个个的数组,所以我们可以定义下面的结构体来与之对应:

// TestSuit 测试用例结构体
type TestSuit struct {
	testsuit    string
	description string
	TestCases   []struct {
		URL    string
		Detail string
		Method string
		Check  []string
		Data   struct {
			Username string `json:"username"`
			Passwd   string `json:"passwd"`
		}
	}

读取yml文件中的用例数据

我们本次用来解析yml的是一个第三方库,获取方法:go get github.com/ghodss/yaml,先上代码:

func main() {
	// 读取数据并解析到json中
	data, _ := ioutil.ReadFile("testCase.yml")
	t := TestSuit{}
	err := yaml.Unmarshal(data, &t)
	if err != nil {
		fmt.Println(err.Error())
	}
	j, _ := json.Marshal(t.TestCases)
	fmt.Println(string(j))

	// 遍历yml文件中定义的test case信息
	for i := 0; i < len(t.TestCases); i++ {
		Path := t.TestCases[i].URL
		Method := t.TestCases[i].Method
		Param := t.TestCases[i].Data
		CheckData := t.TestCases[i].Check
		j, _ := json.Marshal(Param)
		fmt.Println("==================我是华丽的分割线==================")
		fmt.Println("请求参数:", string(j))
		fmt.Println("请求路径:", Path)
		upperMethod := strings.ToUpper(Method)
		// 检验请求方式是否合法
		fmt.Println(upperMethod)
		fmt.Println(CheckMethod(upperMethod))
		fmt.Println("校验数据:", CheckData)

		// 根据不同的请求方式选择不同的请求URL
		if upperMethod == "POST" {
			_, body, _ := gorequest.New().Post(fmt.Sprintf("http://httpbin.org%s", Path)).
				Send(fmt.Sprintf("%s", string(j))).
				Set("Content-Type", "application/json").
				End()
			fmt.Println(body)
		} else if upperMethod == "GET" {
			fmt.Println(fmt.Sprintf("http://%s/%s", BaseURI, Path))
			_, body, _ := gorequest.New().Get(fmt.Sprintf("http://%s%s", BaseURI, Path)).
				Send(fmt.Sprintf("%s", string(j))).
				Set("Content-Type", "application/json").
				End()
			fmt.Println(body)
		}

	}
}

// CheckMethod 校验请求的方法是否正确
func CheckMethod(method string) bool {
	upperMethod := strings.ToUpper(method)
	if upperMethod == "POST" || upperMethod == "GET" {
		return true
	}
	return false
}

代码中注视已经给的比较清晰,这一次又是使用的http://httpbin.org进行调试, 细心的小伙伴可能注意到了最后的那个函数,对请求的方式进行了校验,其他的诸如路径的合法性等都是可以拓展进行校验的。接下来我们一起来测试一下上面的代码是不是真的能获取到用例信息并正确发送请求。

调试运行

运行的的结果:

需要说明的是因为我们访问的路径/api/user/loginhttp://httpbin.org中都没有监听,所以接口返回的404,其实请求也是成功的,但是我们看不到具体的请求数据和URL了,所以我们修改一下yml文件中的path为 http://httpbin.org已经监听的/post来看看结果。

修改后的数据为:

测试:

可以看到我们请求的参数/路径/IP等等信息都和我们测试用例中填充的内容一致。至此,我们的测试用例及测试就完成了

总结

  • YAML
  • 解析yml文件中的信息
  • 发送yml格式的数据
posted @ 2018-10-02 22:25  Bingo-he  阅读(1849)  评论(0编辑  收藏  举报