關閉

                  深入淺出!接口測試其實沒有那么高大上

                  發表于:2020-9-17 10:02

                  字體: | 上一篇 | 下一篇 | 我要投稿

                   作者:﹏猴子請來的救兵    來源:博客園

                    序章
                    說起接口測試,網上有很多例子,但是當初做為新手的我來說,看了不不知道他們說的什么,覺得接口測試,好高大上。認為學會了接口測試就能屌絲逆襲,走上人生巔峰,迎娶白富美。因此學了點開發知識后,發現接口測試其實都是人們玩的名詞罷了。接口測試,真心很簡單。它只不過是數據傳遞是一種表現而已。
                    請求模型
                    看下圖中“A”線,可以理解為接口就是一個電燈的開關,它在接口里面給你提供了一個參數,參數的值一個是“開”,一個是“關”。
                    說起來,怎么才能讓燈亮?一個燈頭接兩根線,一根線接火線,一根線接零線這時燈就亮了。反之,不接零線、火線燈就滅了。
                    其實接口呢,就把這些復雜的操作簡化了,讓你看到的就只有一個開關,而你來操作這個開關就好了。我們做接口測試也只需要測試這個開關就完成任務了,接口測試就是這么簡單。
                    1.當你訪問“http://127.0.0.1:8080/light?opt=open”,讓零線、火線連通,此時燈亮。
                    2.當你訪問“http://127.0.0.1:8080/light?opt=close”,讓零線、火線斷開,此時燈滅。
                    請求結構
                    看到這里我們大致就明白了接口測試是怎么一回事了。接下來需要理解一下HTTP的URL是怎么組成為一個接口的。如圖:
                    一個URL就是一個接口,接口大致會分為一下幾個部分:
                    1.請求協議:
                    http — 普通的http請求
                    https — 加密的http請求,傳輸數據更加安全
                    ftp — 文件傳輸協議,主要用來傳輸文件
                    2.請求IP:就是指提供接口的系統所部署的服務器地址
                    3.請求端口:如果不填端口,默認是80,否則需要填寫端口號
                    4.接口路徑:指系統提供的接口在什么位置
                    5.接口參數:參數在接口路徑后,用“?”來表示路徑地址完了,剩下的都是參數了,用“&”來區分參數個數,
                    如下示例:
                    http://127.0.0.1:8080/light?opt=open&use=yy&pwd=123456
                    假設要操作這個燈,需要用戶密碼,則可以增加新的參數”use”、”pwd”,用”&”來隔開?梢钥吹竭@個示例有3個參數:
                    “opt”:”open”
                    “use”:”yy”
                    “pwd”:”123456”
                    6.接口HTTP參數【url看不見等隱藏參數】
                    http請求方式:
                    GET --- 通過請求URI得到資源
                    POST --- 用于添加新的內容
                    PUT --- 用于修改某個內容
                    DELETE --- 刪除某個內容
                    CONNECT --- 用于代理進行傳輸,如使用SSL
                    OPTIONS --- 詢問可以執行哪些方法
                    PATCH --- 部分文檔更改
                    PROPFIND (wedav) --- 查看屬性
                    PROPPATCH (wedav) --- 設置屬性
                    MKCOL (wedav) --- 創建集合(文件夾)
                    COPY (wedav) --- 拷貝
                    MOVE (wedav) --- 移動
                    LOCK (wedav) --- 加鎖
                    UNLOCK (wedav) --- 解鎖
                    TRACE --- 用于遠程診斷服務器
                    HEAD --- 類似于GET, 但是不返回body信息,用于檢查對象是否存在,以及得到對象的元數據
                    http請求頭
                    請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度。示例:
                  Accept:image/gif.image/jpeg./
                  Accept-Language:zh-cn
                  Connection:Keep-Alive
                  Host:localhost
                  User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
                  Accept-Encoding:gzip,deflate.
                    http請求體
                    請求體就是請求等正文了,可以有很多種請求體。
                    json格式
                    xml格式
                    html格式
                    二進制格式( 多數用于圖片 )
                    字符串格式
                    看到上面的請求結構,就能接口測試了,只需要修改接口的參數,就可以像功能測試一樣測了?梢杂霉δ軠y試設計用例的方法來設計接口測試的用例?梢允褂酶鞣N測試用具輔助測試,下圖為“postman”測試工具。
                    接口的請求會發向哪里
                    我們可以看看這樣一個接口,用Java的Servlet怎么來實現。
                  package com.yy.test;

                  import net.sf.json.JSONObject;

                  import javax.servlet.ServletException;
                  import javax.servlet.annotation.WebServlet;
                  import javax.servlet.http.HttpServlet;
                  import javax.servlet.http.HttpServletRequest;
                  import javax.servlet.http.HttpServletResponse;
                  import java.io.IOException;
                  import java.io.PrintWriter;

                  // 接口的名稱與路徑,urlPatterns中的/light,就是說在輸入地址與ip后,定義的接口名字http://127.0.0.1:8080/light 
                  @WebServlet(name = "light", urlPatterns = "/light")
                  public class light extends HttpServlet {
                      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                          // 獲取opt的值 
                          String opt = request.getParameter("opt");

                          // 新建返回json的對象 
                          JSONObject json = new JSONObject();

                          // 判斷opt有沒有值 
                          if (null != opt) {

                              // 定義返回的請求頭,類型是json,編碼是utf-8 
                              response.setContentType("application/json; charset=UTF-8");

                              // 定義返回的對象,用它來將json輸出 
                              PrintWriter out = response.getWriter();

                              // 判斷opt的值是不是open 
                              if ("open".equals(opt)) {
                                  json.put("msg", "開燈啦!");
                                  out.println(json);
                              }

                              // 判斷opt的值是不是close 
                              else if ("close".equals(opt)) {
                                  json.put("msg", "關燈啦!");
                                  out.println(json);
                              }
                          }
                      }
                  }
                    上面的代碼大致做了如下幾個操作:
                    1.獲取opt的值
                    2.判斷獲取的opt的值
                    如果是”open”就返回”開燈啦!”
                    如果是”close”就返回”關燈啦!”
                    看到上面的代碼,就能發現,我們將opt的值,傳進”http://127.0.0.1:8080/light“這個接口中,當你拿到你想要的值,想做什么都可以了,對吧。我這邊的代碼就是簡單的進行了返回,當你訪問了我“開燈”的接口,我就直接告訴你“開燈了” ( 其實我什么都沒做,這已經算是一個BUG了。所以測試接口要看看它到底生效了沒有,也就是說,燈真的開了嗎?),我們做接口測試,需要開發提供接口文檔。最重要的有一下幾點:
                    3.被測接口的地址
                    4.接口參數,以及各個參數的說明
                    5.必要的http頭與http體 ( http頭是可以自定義的,可以用來校驗是否是自己人訪問 )
                    6.接口返回什么值,以及各個返回值的說明
                    7.接口是干什么的
                    確定了這些,才能做好接口測試。好的接口文檔如下:
                    復雜一點的接口,RESTful
                    一個用戶接口可以通過以下4種不同方式的請求,來做不同的事情:
                    獲取用戶信息
                    創建用戶
                    修改用戶
                    刪除用戶
                    你完全可以像“燈”的那個例子,用GET請求來傳遞不同的參數來實現,但是這樣如果接口多了,就會很混亂,很難管理。
                    這時,我們需要一種規則:
                    當用“GET”方式時,只用來獲取數據,成功了返回http狀態碼200
                    當用“POST”方式時,只用來創建數據,成功了返回http狀態碼201
                    當用“PUT”方式時,只用來修改數據,成功了返回http狀態碼203
                    當用“DELETE”方式時,只用來刪除數據,成功了返回http狀態碼204
                    當請求發送失敗,返回http狀態碼400
                    這樣子的規則,我們稱它為“RESTful”標準。
                    下圖是RESTful的狀態碼返回。
                    接口測試
                    前面的搞清楚了,接口測試就簡單了,其實就是幾個步驟。
                    拿到接口的url地址
                    查看接口是用什么方式發送
                    添加請求頭,請求體
                    發送查看返回結果,校驗返回結果是否正確
                    這個是正常的一套流程,異常的情況,就不用我多說來吧。比如參數不傳值呀,傳的值不正確呀,明明要求用"GET"請求發送,偏要用"POST"請求發送呀。等等有很多異常情況,一般懂功能測試都能想到很多的異常情況,這里不再舉例來。
                    下面我以百度翻譯的接口為例子:
                    請求地址:http://fanyi.baidu.com/v2transapi
                    請求方式:POST
                    請求參數:
                    from — 哪國語言
                      to --- 翻譯成哪國語言

                      query --- 翻譯都內容
                    我使用Python語言來進行接口測試,使用”requests”庫來編寫代碼比較簡答易懂,如果沒有安裝”requests”庫,可以打開cmd,輸入”pip install requests”來安裝。
                  import requests

                  # 接口的url 
                  url = "http://fanyi.baidu.com/v2transapi"

                  # 接口的參數 
                  params = { 
                      "from":"en", 
                      "to":"zh", 
                      "query": "test"
                  }

                  # 發送接口 
                  r = requests.request("post", url, params=params)

                  # 打印返回結果 
                  print(r.text)

                  # 其實到上面就已經完了,因為百度不是我自己寫的接口,為了讓結果看的更加清楚一點,我取來翻譯的字段 
                  import json
                  d = json.loads(r.text)
                  print(d['liju_result']['tag'])
                  返回結果

                  ['試驗', '測驗', '考驗', '化驗', '考查', '受試驗', '受測驗', '受考驗', '測得結果']


                  可以試著將"query"的參數改成"student",返回結果也隨之改變

                  import requests

                  url = "http://fanyi.baidu.com/v2transapi"
                  params = { 
                      "from":"en", 
                      "to":"zh", 
                      "query": "student" # 我改了這里 
                  }

                  r = requests.request("post", url, params=params)

                  import json
                  d = json.loads(r.text)
                  print(d['liju_result']['tag'])
                  返回結果

                  ['中學生', '學生', '大學生', '研究者', '學者']
                    當然,要是不懂代碼,也可以使用工具進行測試,只要記住填寫的幾個點,就可以做好接口測試,下圖是使用”postman”進行測試:
                    輸入發送方式”POST”
                    輸入測試地址”http://fanyi.baidu.com/v2transapi“
                    輸入下圖紅框參數
                    點擊”send”,查看返回結果。
                    接口測試就是這么簡單。
                    接口測試用例
                    接口測試用例的設計就沒什么好講的了,與功能測試一樣設計就好了。我是用Excel來編寫的,主要是為了方便管理,只要寫的干凈,讓人看的很舒服就好了。我自己設計的用例是這樣的:
                    一個模塊對應一個Excel表
                    一條接口對應一張sheet表
                    表中一行對應一條測試用例
                    在開始要注明測試時需要的sql,如下圖開始我會創建用戶,用完了我會刪除。
                    這樣的用例比較好管理,如圖:
                    整個接口測試就這么多了。接口測試其實很簡單,在功能測試眼里,接口測試那么高大上,其實不也過如此了。

                    本文內容不用于商業目的,如涉及知識產權問題,請權利人聯系51Testing小編(021-64471599-8017),我們將立即處理

                  《2023軟件測試行業現狀調查報告》獨家發布~

                  精彩評論

                  • 空、者
                    2020-9-29 12:33:15

                    請問作者為什么你的百度翻譯正常返回,我這邊一樣的代碼返回{"errno":997,"errmsg":"\u672a\u77e5\u9519\u8bef","query":"test","from":"en","to":"zh","error":997},內外網的問題、還是cookies的問題但我加上了也不行

                  關注51Testing

                  聯系我們

                  快捷面板 站點地圖 聯系我們 廣告服務 關于我們 站長統計 發展歷程

                  法律顧問:上海蘭迪律師事務所 項棋律師
                  版權所有 上海博為峰軟件技術股份有限公司 Copyright©51testing.com 2003-2024
                  投訴及意見反饋:webmaster@51testing.com; 業務聯系:service@51testing.com 021-64471599-8017

                  滬ICP備05003035號

                  滬公網安備 31010102002173號

                  亚洲欧洲自拍图片专区123_久久久精品人妻无码专区不卡_青青精品视频国产色天使_A免看的日黄亚洲