我們在前面幾篇文章中學習怎么發送數據請求,怎么處理解析接口返回的結果,接下來我們一起來學習怎么進行測試用例管理,今天我們介紹的是使用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/login
在http://httpbin.org
中都沒有監聽,所以接口返回的404,其實請求也是成功的,但是我們看不到具體的請求數據和URL了,所以我們修改一下yml文件中的path為 http://httpbin.org
已經監聽的/post
來看看結果。
修改后的數據為:
測試:
可以看到我們請求的參數/路徑/IP等等信息都和我們測試用例中填充的內容一致。至此,我們的測試用例及測試就完成了
總結
- YAML
- 解析yml文件中的信息
- 發送yml格式的數據