Python 接口自動化測試


1. 接口基礎知識

1.1 接口分類

接口一般來說有兩種,一種是程序內部的接口,一種是系統對外的接口。

(1) webservice接口:走soap協議通過http傳輸,請求報文和返回報文都是xml格式的,我們在測試的時候都要通過工具才能進行調用,測試。
(2) http api 接口:走http協議,通過路徑來區分調用的方法,請求報文都是key-value形式的,返回報文一般都是json串,有get和post等方法。

1.2 接口請求類型

根據接口的請求方法,常用的幾種接口請求方式:

(1) GET:從指定資源獲取數據
(2) POST:向指定的資源請求被處理的數據(例如用戶登錄)
(3) PUT:上傳指定的URL,一般是修改,可以理解為數據庫中的 update
(4) DELETE:刪除指定資源

2、Requests 快速上手

2. requests基礎

  所有的數據測試目標以一個開源的接口模擬網站【HTTPBIN】為測試對象。

2.1 發送請求

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : requests_send_request.py
@Time : 2019/9/2 11:54
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : None
"""

import requests

# 1.requests請求方式
# (1) GET請求方式
httpbin_get = requests.get('http://httpbin.org/get', data={'key': 'value'})
print('httpbin_get: ', httpbin_get.text)

# (2) POST請求方式
httpbin_post = requests.post('https://httpbin.org/post', data={'key': 'value'})
print('httpbin_post: ', httpbin_post.text)

# (3) PUT請求方式
httpbin_put = requests.put('https://httpbin.org/put', data={'key': 'value'})
print('httpbin_put: ', httpbin_put.text)

# (4) DELETE請求方式
httpbin_delete = requests.delete('https://httpbin.org/delete', data={'key': 'value'})
print('httpbin_delete', httpbin_delete)

# (5) PATCH親求方式
httpbin_patch = requests.patch('https://httpbin.org/patch', data={'key': 'value'})
print('httpbin_patch', httpbin_patch)

2.2 參數傳遞

  常用的參數傳遞形式有四種:【GitHub示例

(1)字典形式的參數:payload = {'key1': 'value1', 'key2': 'value2'}
(2) 元組形式的參數:payload = (('key1', 'value1'), ('key2', 'value2'))
(3) 字符串形式的參數:payload = {'string1', 'value1'}
(4) 多部份編碼的文件:files = {
# 顯示設置文件名、文件類型和請求頭
'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
}

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : requests_transfer_parameter.py
@Time : 2019/9/2 12:39
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : 參數傳遞:字典、元組、字符串、文件
"""
import requests

# 2. 參數傳遞
# (1) 傳參參數為字典形式: 數據字典會在發送請求時會自動編碼為表單形式
def transfer_dict_parameter():
payload = {
'key1': 'value1',
'key2': 'value2'
}

transfer_dict_parameter_result = requests.post('https://httpbin.org/post', params=payload)
print("transfer_dict_parameter_url: ", transfer_dict_parameter_result.url)
print("transfer_dict_parameter_text: ", transfer_dict_parameter_result.text)


transfer_dict_parameter()


# (2) 傳參參數為元組形式: 應用於在表單中多個元素使用同一 key 的時候
def transfer_tuple_parameter():
payload = (
('key1', 'value1'),
('key1', 'value2')
)

transfer_tuple_parameter_result = requests.post('https://httpbin.org/post', params=payload)
print('transfer_tuple_parameter_url: ', transfer_tuple_parameter_result.url)
print('transfer_tuple_parameter_text: ', transfer_tuple_parameter_result.text)


transfer_tuple_parameter()


# (3) 傳參參數形式是字符串形式
def transfer_string_parameter():
payload = {
'string1': 'value'
}

transfer_string_parameter_result = requests.post('https://httpbin.org/post', params=payload)
print('transfer_string_parameter_url: ', transfer_string_parameter_result.url)
print('transfer_string_parameter_text: ', transfer_string_parameter_result.text)


transfer_string_parameter()


# (4) 傳參參數形式:一個多部分編碼(Multipart-Encoded)的文件
def transfer_multipart_encoded_file():
interface_url = 'https://httpbin.org/post'
files = {
# 顯示設置文件名、文件類型和請求頭
'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
}

transfer_multipart_encoded_file_result = requests.post(url=interface_url, files=files)
print('transfer_multipart_encoded_file_result_url: ', transfer_multipart_encoded_file_result.url)
print('transfer_multipart_encoded_file_result_url: ', transfer_multipart_encoded_file_result.text)


transfer_multipart_encoded_file()

2.3 接口響應

  給接口傳遞參數,請求接口后,接口會給我們我們響應返回,接口在返回的時候,會給我們返回一個狀態碼來標識當前接口的狀態。

(1)狀態碼

GitHub示例
| 狀態碼 | 狀態 | 描述 |
---------- | ----- | ------ 
1xx | ---- |信息類的狀態碼 **
| 100 | Continue | 服務器僅接收到部分請求,但是一旦服務器並沒有拒絕該請求,客戶端應該繼續發送其余的請求。
| 101 | Switching Protocols | 服務器轉換協議,服務器將遵從客戶的請求轉換到另外一種協議
**2xx | ---- |*成功類的狀態碼 *
| 200 | OK | 請求成功(是對 GET 或 POST 的請求應答文檔)
| 201 | Created | 請求被創建完成,同時信的資源被創建
| 202 | Accepted | 供處理的請求已被接收,但是處理未完成
| 203 | Non-authoritative Information | 文檔已正常地返回,但一些應答頭可能不正確,以為使用的式文檔的拷貝
| 204 | No Content | 沒有新文檔。瀏覽器應該繼續顯示原來的文檔。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新,這個狀態代碼是很有用的。
| 205 | Reset Content | 沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
| 206 | Partial Content | 客戶發送了一個帶有Range頭的GET請求,服務器完成了它。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : response_code.py
@Time : 2019/9/2 15:41
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : None
"""
import requests


# 1. 返回接口狀態碼:200
def response_200_code():
interface_200_url = 'https://httpbin.org/status/200'
response_get = requests.get(interface_200_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)


response_200_code()


# 2.返回接口狀態碼:400
def response_400_code():
interface_400_url = 'https://httpbin.org/status/400'
response_get = requests.get(interface_400_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)


response_400_code()

(2)響應頭

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File : response_content.py
@Time : 2019/9/2 15:41
@Author : Crisimple
@Github : https://crisimple.github.io/
@Contact : Crisimple@foxmail.com
@License : (C)Copyright 2017-2019, Micro-Circle
@Desc : None
"""
import requests


# 1. 返回接口狀態碼:
# (1). 返回接口狀態碼:200
def response_200_code():
interface_200_url = 'https://httpbin.org/status/200'
response_get = requests.get(interface_200_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)


response_200_code()


# (2).返回接口狀態碼:400
def response_400_code():
interface_400_url = 'https://httpbin.org/status/400'
response_get = requests.get(interface_400_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)


response_400_code()


# (3) 重定向接口返回狀態碼:301
def response_301_code():
interface_url = 'https://butian.360.cn'
response_get = requests.get(interface_url)
response_get_code = response_get.status_code
print('response_get_code: ', response_get_code)


response_301_code()


# ------------------------------------------------------
# 2. 響應內容
  響應內容的請求頭、查看文本、編碼方式、二進制響應、原始響應。
def response_contents():
url = 'https://httpbin.org/get'

response_get = requests.get(url=url)

# 響應頭
print('response_get_headers', response_get.headers)

# 響應文本
print('response_get_text: ', response_get.text)

# 文本編碼方式
print('response_get_encoding: ', response_get.encoding)

# 二進制響應內容
print('response_get_content: ', response_get.content)

# 原始響應內容
origin_content = response_get.raw
origin_content_read = origin_content.read(10)
print('origin_content: ', origin_content)
print('origin_content_read: ', origin_content_read)


response_contents()

2.4 接口其他處理

GitHub示例

(1) 操作cookies

import requests
import time

url = 'https://httpbin.org/get'

def operator_cookies():
r = requests.get(url)
print('r.cookies: ', r.cookies)

jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
r2 = requests.get(url=url, cookies=jar)
print('r2.text', r2.text)


operator_cookies()

(2) 請求歷史

import requests

url = 'https://httpbin.org/get'


def request_history():
r = requests.get(url=url)
print('r.history: ', r.history)


request_history()

(3) 超時請求

  requests 在經過 timeout 參數設定的秒數時間之后停止等待響應。

import requests
import time

def timeout():
print(time.time())
url = 'https://httpbin.org/get'
print(time.time())
r = requests.get(url, timeout=5)
print(time.time())


timeout()

(4) 錯誤與異常

  常見的錯誤異常有:

· 遇到網絡問題(如:DNS 查詢失敗、拒絕連接等時),requests 會拋出一個 ConnectionError 異常。
· 如果 HTTP 請求返回了不成功的狀態碼, Response.raise_for_status() 會拋出一個 HTTPError異常。
· 若請求超時,則超出一個 Timeout 異常。
· 若請求超過了設定的最大重定向次數,則會拋出一個 TooManyRedirects 異常。
· 所有 Requests 顯式拋出的異常都繼承自 requests.exceptions.RequestsException。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM