zoukankan      html  css  js  c++  java
  • 【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格式的数据
  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/Detector/p/9738672.html
Copyright © 2011-2022 走看看