日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

一篇文章带你了解接口自动化

發(fā)布時(shí)間:2023/11/21 windows 37 coder
生活随笔 收集整理的這篇文章主要介紹了 一篇文章带你了解接口自动化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一篇文章帶你了解接口自動(dòng)化

在之前的文章里我們已經(jīng)學(xué)習(xí)了Python,unitTest,pyTest,Allure等自動(dòng)化框架

在這篇文章中我們將借助這些自動(dòng)化框架和實(shí)際案例來(lái)講解如何針對(duì)接口進(jìn)行自動(dòng)化處理

我們這篇文章將從以下角度展開講解:

  • 常用類Requests
  • 接口自動(dòng)化基礎(chǔ)
  • 接口自動(dòng)化實(shí)例

常用類Requests

首先我們需要了解一個(gè)在接口自動(dòng)化中經(jīng)常使用的工具類

Requests庫(kù)基本信息

我們?cè)谑褂媒涌谧詣?dòng)化時(shí)一定會(huì)調(diào)用到不同類型的接口,而Requests庫(kù)可以幫助我們快速調(diào)用接口:

  • Requests 是?Python語(yǔ)?編寫,基于urllib,采?Apache2 Licensed開源協(xié)議的 HTTP 庫(kù)
  • 它? urllib 更加?便,可以節(jié)約我們?量的?作,完全滿?HTTP測(cè)試需求

我們需要了解到Requests庫(kù)是第三方庫(kù),所以我們需要下載后使用:

# 我們直接在Terminal里采用pip指令下載Requests庫(kù)即可
pip install requests

# 我們可以采用show命令查看是否安裝成功
pip show requests

我們通常會(huì)使用到的關(guān)于Requests的方法主要包含以下五種:

# 首先我們注意我們需要導(dǎo)入Requests庫(kù)才可以使用

# Get
Requests.get()

# Post
Requests.post()

# Put
Requests.put()

# Delete
Requests.delete()

Requests庫(kù)基本使用

下面我們針對(duì)Requests庫(kù)的使用來(lái)做基本的講解:

  • Requests庫(kù)可以調(diào)用不同的類型方法來(lái)針對(duì)不同請(qǐng)求類型發(fā)送接口請(qǐng)求
  • Requests庫(kù)在發(fā)送接口請(qǐng)求后,后端會(huì)返回一個(gè)Response,我們可以接受并查看信息

下面我們首先針對(duì)Requests庫(kù)的發(fā)送請(qǐng)求進(jìn)行講解:

# 首先我們需要導(dǎo)包使用
import requests

# 在正式開始講解之前我們需要了解Requests所使用的方法中的一些參數(shù)
# url:請(qǐng)求路徑
# params:get特有的參數(shù)賦值方法,意思是在url的?之后的參數(shù)賦值
# json:通用的參數(shù)賦值方法,可以用于復(fù)雜的格式也可以用于字典格式
# data:請(qǐng)求體為form表單參數(shù),通常用于字典類型的比較簡(jiǎn)單的格式
# header:請(qǐng)求頭參數(shù),通常是Authorization驗(yàn)證登錄信息或者參數(shù)傳輸格式信息等
# files:文件格式,使用字典傳輸,且字典中含有'file'鍵名稱


# 首先我們先來(lái)看一下常用的Get請(qǐng)求

# Requests.get(url,params/json)
r = requests.get('http://httpbin.org/get')

# 如果我們想要添加參數(shù)進(jìn)行傳輸,我們可以直接在url后面添加?+參數(shù)信息等
r = requests.get('http://httpbin.org/get?name=germey&age=20')

# 我們也可以采用params參數(shù)或者json參數(shù)進(jìn)行傳輸
data = {
	'name':'germey',
  	'age':22
}
r = requests.get('http://httpbin.org/get',params=data)
r = requests.get('http://httpbin.org/get',json=data)


# 下面我們了解一下Post請(qǐng)求,Put和Delete操作和Post操作完全相同,這里不做介紹

# Requests.get(url,json)
r = requests.post('http://httpbin.org/post')

# 和Get方法不同的是,Post不能采用params也不能采用url拼接,只能采用json進(jìn)行傳輸
data = {
  "name":"germey",
  "age":"22"
}
r = requests.post('http://httpbin.org/post',data=data)


# 除了基本的url和json之外,我們?cè)谡?qǐng)求過(guò)程中還需要很多參數(shù)類型

# 例如header頭,我們的大部分操作都需要做登陸驗(yàn)證,而登錄一般會(huì)含有一個(gè)Authorization屬性,后面value值為Token值,這里我們講述
# 但是除了Authorization屬性外,我們還可能會(huì)傳輸參數(shù)類型Content-Type等其他信息
# 我們通常將header寫為字典格式進(jìn)行傳輸
headers = {
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0',
  'my-test':'Hello'
}
r = requests.get('http://httpbin.org/get',headers=headers)


# 我們?cè)趥鬏斶^(guò)程中也經(jīng)常傳輸文件類型,我們通常需要讀取文件并將其存儲(chǔ)為Python中的文件才可以使用

# 我們需要注意以二進(jìn)制方式讀取文件
# 我們?cè)趐ost方法中需要傳輸字典,字典key值為'file'是默認(rèn)名詞
files = {'file':open('favicon.ico','rb')}
# 我們調(diào)用post方法并使用files參數(shù)進(jìn)行文件上傳
r = requests.post('http://httpbin.org/post',files=files)


# 我們還需要注意一些特殊的網(wǎng)站,如果該網(wǎng)站的證書沒(méi)有被CA機(jī)構(gòu)信任,程序?qū)?huì)出錯(cuò),提示SSL證書驗(yàn)證錯(cuò)誤

# 那么我們?cè)谠L問(wèn)時(shí),只需要將verify參數(shù)設(shè)置為False即可
r = requests.get('https://www.12306.cn',verify=False)


# 針對(duì)特別防范的網(wǎng)站,當(dāng)我們大量進(jìn)行數(shù)據(jù)爬取或者重復(fù)使用時(shí),可能會(huì)觸發(fā)該網(wǎng)站的自衛(wèi)系統(tǒng)將我們當(dāng)前IP進(jìn)行屏蔽
# 我們可以通過(guò)使用代理來(lái)防止這種情況(IP可以在網(wǎng)上購(gòu)買)
proxies = {
    'http': 'http://161.35.4.201:80',
    'https': 'https://161.35.4.201:80' 
}
r = requests.get('http://httpbin.org/get', proxies=proxies)

在講述完Requests庫(kù)的發(fā)送請(qǐng)求后,我們可以針對(duì)Requests請(qǐng)求后的Response響應(yīng)進(jìn)行講述:

# 我們?cè)诎l(fā)送請(qǐng)求后服務(wù)器會(huì)對(duì)我們的請(qǐng)求進(jìn)行響應(yīng),這就是所獲得的Response,所有請(qǐng)求都會(huì)獲取到該響應(yīng)

# 我們下面來(lái)介紹一些我們常用的response類型的方法

# 獲取狀態(tài)碼
response.status_code

# JSON形式的響應(yīng)內(nèi)容
response.json()

# 文本形式的響應(yīng)內(nèi)容
response.text

# 請(qǐng)求url
response.url

# 查看響應(yīng)頭部字符編碼
response.encoding

# 頭信息
response.headers

# cookie信息
response.cookies


# 我們通常獲得這些信息之后可以進(jìn)行查看,我們可以通過(guò)print直接打印查看
print(response.status_code)

# 但更多情況下,我們通過(guò)這些信息來(lái)做斷言判斷是否符合我們預(yù)期
assert 200 == response.status_code
assert "成功" in response.text

# 當(dāng)然我們?cè)诒匾闆r下我們還需要獲取到對(duì)應(yīng)的值去使用
# 例如我們通常需要一個(gè)Token來(lái)表示我們處于登陸狀態(tài),那么我們就需要在執(zhí)行登陸操作時(shí)將token值獲取并保存下來(lái)
self.token = r.json().get("token")
# 如果我們需要cookie,我們也可以直接獲取cookies并將其保存在一個(gè)列表中
response = requests.get("百度一下,你就知道")
for key, value in response.cookies.items():
 print(key + '=' + value)

接口自動(dòng)化基礎(chǔ)

下面我們來(lái)講解接口自動(dòng)化的一些基礎(chǔ)信息

接口測(cè)試

既然我們要學(xué)習(xí)接口自動(dòng)化,那么我們肯定首先需要了解接口測(cè)試:

  • 使用工具或代碼代替人對(duì)接口進(jìn)行測(cè)試的技術(shù)
  • 其根本目的是為了防止開發(fā)修改代碼時(shí)引入新的問(wèn)題

那么我們的接口測(cè)試主要針對(duì)哪些方面:

  • 我們的項(xiàng)目分為前端和后端
  • 前端僅僅是調(diào)用接口的一種方式,其根本還是后端的處理
  • 所以我們的接口測(cè)試就是針對(duì)后端所書寫的方法進(jìn)行測(cè)試,測(cè)試其是否符合我們的需求

我們測(cè)試人員針對(duì)接口測(cè)試的主要時(shí)間段是在哪里:

  • 開發(fā)進(jìn)行系統(tǒng)測(cè)試提測(cè)前,可以先進(jìn)行接口自動(dòng)化腳本的編寫

  • 開發(fā)進(jìn)行系統(tǒng)測(cè)試提測(cè)后,優(yōu)先進(jìn)行系統(tǒng)測(cè)試用例的執(zhí)行,再進(jìn)行接口自動(dòng)化腳本的編寫

  • 所以我們接口測(cè)試的主要時(shí)間段針對(duì)于前后端聯(lián)調(diào)的時(shí)間進(jìn)行接口測(cè)試

接口測(cè)試基本操作

下面我們來(lái)講解接口測(cè)試的基本操作順序:

# 1.選取自動(dòng)化測(cè)試用例
# 我們一般會(huì)在前后端開發(fā)時(shí)進(jìn)行測(cè)試用例的書寫,我們僅需要選取我們所測(cè)試模塊的測(cè)試用例即可

# 2.搭建自動(dòng)化測(cè)試環(huán)境
# 這個(gè)主要根據(jù)公司本身,一般由主管進(jìn)行搭建,員工拉取書寫更新上傳即可

# 3.搭建自動(dòng)化測(cè)試框架
# 這個(gè)主要也是公司進(jìn)行選取,不過(guò)一般都是python+pytest+allure基本框架加上一些輔助框架

# 4.代碼實(shí)現(xiàn)自動(dòng)化
# 這個(gè)就是我們接口測(cè)試自動(dòng)化主要書寫的部分

# 5.輸出測(cè)試報(bào)告
# 我們一般會(huì)采用allure進(jìn)行美觀測(cè)試報(bào)告生成

# 6.實(shí)現(xiàn)持續(xù)集成
# 我們接口測(cè)試的目的其實(shí)是為了在本次開發(fā)時(shí)使當(dāng)前開發(fā)不影響之前功能的使用,所以我們的接口自動(dòng)化需要保證效率重復(fù)使用等多方面

我們?cè)谶M(jìn)行接口測(cè)試時(shí)可以通過(guò)三種方式獲得接口:

  • 在測(cè)試頁(yè)面使用F12查看調(diào)用接口信息

  • 采用Charles等抓包工具查看接口信息

  • 向項(xiàng)目經(jīng)理/后端人員索要接口文檔信息

最后我們稍微提一下如果我們使用手動(dòng)接口測(cè)試,我們一般會(huì)使用Postman工具進(jìn)行測(cè)試,我們這里不做詳解

接口自動(dòng)化實(shí)例

接下來(lái)我們通過(guò)一個(gè)接口自動(dòng)化實(shí)例來(lái)講解接口自動(dòng)化

接口自動(dòng)化框架信息

我們?cè)诮佑|接口自動(dòng)化代碼之前,我們首先需要了解這個(gè)框架主要需要什么:

# 首先假設(shè)我們創(chuàng)建了一個(gè)Pro_viv文件來(lái)當(dāng)作主目錄 

# 首先我們需要一個(gè)api文件夾
# 我們會(huì)將我們所需要調(diào)用的Api接口進(jìn)行封裝(Requests庫(kù)相關(guān)的信息)

# 然后我們需要一個(gè)script文件夾
# 我們需要將我們所使用的case進(jìn)行存儲(chǔ),其實(shí)就是我們pytest中所使用的測(cè)試用例,我們的數(shù)據(jù)調(diào)用也是在這里進(jìn)行調(diào)用

# 然后我們需要一個(gè)data文件夾
# 我們會(huì)將我們所需要使用的jpg或json等信息文件存儲(chǔ)進(jìn)該文件夾

# 最后我們還需要一個(gè)report文件夾
# 我們會(huì)將所生成的allure報(bào)告文檔存放在該文件夾下


# 除了文件夾外,我們還需要兩個(gè)文件來(lái)進(jìn)行一些信息整理

# 首先我們需要一個(gè)config.py
# 我們會(huì)使用該文件來(lái)存放一些通用的路徑或其他信息

# 我們還需要一個(gè)pytest.ini
# 這是pytest的配置文件,我們可以在里面修改pytest相關(guān)的信息

接口自動(dòng)化實(shí)例展示

那么下面我們將通過(guò)多個(gè)需求案例來(lái)逐步了解接口自動(dòng)化的使用

登錄接口

我們首先給出需求信息:

# 地址:http://kdtx-test.itheima.net/api/login
# 方法:Post
# 請(qǐng)求數(shù)據(jù):
# 請(qǐng)求頭:Content-Type: application/json
# 請(qǐng)求體:{"username":”admin", "password": " admin123","code":"2", "uuid":"驗(yàn)證碼接口返回?cái)?shù)據(jù)"}

我們首先需要書寫接口,所以我們需要在api文件下創(chuàng)建login.py進(jìn)行接口書寫:

# api 文件夾 - login.py

# 接口封裝時(shí),重點(diǎn)是依據(jù)接口文檔封裝接口信息
# 需要使用的測(cè)試數(shù)據(jù)是從測(cè)試用例傳遞的、接口方法被調(diào)用時(shí)需要返回對(duì)應(yīng)的響應(yīng)結(jié)果
# 所以我們?cè)跁鴮懲杲涌诜椒ê螅覀冞€需要到script文件夾下創(chuàng)建test文件來(lái)創(chuàng)建case來(lái)執(zhí)行pytest

# 導(dǎo)包
import requests

# 創(chuàng)建接口類
class LoginAPI:
    # 初始化
    def __init__(self):
        # 指定url基本信息
        self.url_verify = "http://kdtx-test.itheima.net/api/captchaImage"
        self.url_login = "http://kdtx-test.itheima.net/api/login"

    # 驗(yàn)證碼
    def get_verify_code(self):
        return requests.get(url=self.url_verify)

    # 登錄
    # 我們?cè)诘卿洉r(shí)需要請(qǐng)求信息,我們這里添加一個(gè)參數(shù),當(dāng)我們使用case時(shí)傳參并調(diào)用
    def login(self, test_data):
        return requests.post(url=self.url_login, json=test_data)

當(dāng)我們書寫完接口信息之后,我們就可以到script文件夾下創(chuàng)建test文件進(jìn)行測(cè)試用例書寫:

# script 文件夾 - verify.py

Class TestLogin:
    
    uuidValue = None
    
    # 驗(yàn)證碼測(cè)試
    def test01_get_verify_code1(self):
        # 獲取驗(yàn)證碼
        res_v = self.login_api.get_verify_code()
        
        
    # 登錄驗(yàn)證
    def test02_login1(self):
        # 這里我們直接將信息寫為列表進(jìn)行賦值處置
        login_data = {
            "username": "admin",
            "password": "admin123",
            "code": "2",
            "uuid": "f3334fd726bf4155b787198c701786b6"
        }
        res_l = self.login_api.login(test_data=login_data)
        
     
    # 驗(yàn)證碼測(cè)試2
    def test03_get_verify_code1(self):
        # 獲取驗(yàn)證碼
        res_v = self.login_api.get_verify_code()
        
        # 一些信息的打印
        print(res_v.status_code)
        print(res_v.json())
        
        # 打印uuid數(shù)據(jù),這是我們?cè)诘卿洉r(shí)所需要使用的數(shù)據(jù)
        print(res_v.json().get("uuid"))
        
        # 我們可以采用一個(gè)類變量來(lái)將uuid存儲(chǔ)起來(lái)進(jìn)行使用
        self.uuidValue = res_v.json().get("uuid")
    
    
     # 登陸驗(yàn)證2
     def test04_login(self):
        # 由于我們的uuid是通過(guò)get_verify_code獲得的驗(yàn)證碼,我們可以通過(guò)pytest連續(xù)執(zhí)行兩條case并獲取uuid進(jìn)行使用
        login_data = {
            "username": "admin",
            "password": "admin123",
            "code": "2",
            "uuid": self.uuidValue
        }
        res_l = self.login_api.login(test_data=login_data)

課程接口

我們首先給出需求信息:

# 課程模塊接口封裝:核心在于依據(jù)接口文檔實(shí)現(xiàn)接口信息封裝、重點(diǎn)關(guān)注接口如何被調(diào)用
# 接口信息:
# URL:http://kdtx-test.itheima.net/api/clues/course
# 方法:Post
# 請(qǐng)求數(shù)據(jù):
# 請(qǐng)求頭:{ "Content-Type ":  "application/json ",  "Authorization":  "xxx " }
# 請(qǐng)求體:{ "name": "測(cè)試開發(fā)提升課01", "subject": "6","price": 899,"applicablePerson": "2",  "info": "測(cè)試開發(fā)提升課01"}

我們首先需要書寫接口,所以我們需要在api文件下創(chuàng)建course.py進(jìn)行接口書寫:

# api 文件夾 - course.py

# 我們將在該接口類中實(shí)現(xiàn)多個(gè)接口,我們將書寫除了上述需求信息外的其他接口

# 導(dǎo)包
import requests

# 創(chuàng)建接口類
class CourseAPI:
    # 初始化
    def __init__(self):
        self.url_add_course = "http://kdtx-test.itheima.net/api/clues/course"
        self.url_select_course = "http://kdtx-test.itheima.net/api/clues/course/list"
        
    # 我們需要注意:
    # 我們合同的操作均需要在登錄前提下進(jìn)行操作
    # 而我們判斷是否登錄的條件就是在headers請(qǐng)求頭中是否存在符合要求的token
    # 所以我們下述的接口方法中,除了我們所需要的數(shù)據(jù)信息外,我們還需要添加headers,并提供Authorization信息

    # 課程添加
    def add_course(self, test_data, token):
        return requests.post(url=self.url_add_course, json=test_data, headers={"Authorization": token})

    # 查詢課程列表
    def select_course(self, test_data, token):
        # 這里我們可以采用url拼接,也可以采用params來(lái)傳遞參數(shù),
        # return requests.get(url=self.url_select_course,params=params,headers={"Authorization": token})
        return requests.get(url=self.url_select_course + f"/{test_data}", headers={"Authorization": token})

    # 修改課程
    def update_course(self, test_data, token):
        return requests.put(url=self.url_add_course, json=test_data, headers={"Authorization": token})

    # 刪除課程
    def delete_course(self, course_id, token):
        return requests.delete(url=self.url_add_course + f"/{course_id}", headers={"Authorization": token})

當(dāng)我們書寫完接口信息之后,我們就可以到script文件夾下創(chuàng)建test文件進(jìn)行測(cè)試用例書寫:

# 導(dǎo)包
import config
from api.login import LoginAPI
from api.course import CourseAPI
from api.contract import ContractAPI

# 創(chuàng)建測(cè)試類
class TestContractBusiness:
    # 初始化(由于我們需要使用登錄時(shí)的Token,所以我們進(jìn)行存儲(chǔ))
    token = None

    # 前置處理
    def setup(self):
        # 實(shí)例化接口對(duì)象
        self.login_api = LoginAPI()
        self.course_api = CourseAPI()
        self.contract_api = ContractAPI()

    # 后置處理
    def teardown(self):
        pass

    # 1、登錄成功
    def test01_login_success(self):
        # 獲取驗(yàn)證碼
        res_v = self.login_api.get_verify_code()

        # 登錄
        login_data = {
            "username": "admin",
            "password": "admin123",
            "code": "2",
            "uuid": res_v.json().get("uuid")
        }
        res_l = self.login_api.login(test_data=login_data)
        # 提取登錄成功之后的token數(shù)據(jù)并保存在類的屬性中
        TestContractBusiness.token = res_l.json().get("token")

    # 2、課程新增成功
    def test02_add_course(self):
        add_data = { 
            "name": "測(cè)試開發(fā)提升課01",
            "subject": "6",
            "price": 899,
            "applicablePerson": "2",
            "info": "測(cè)試開發(fā)提升課01"
        }
        response = self.course_api.add_course(test_data=add_data, token=TestContractBusiness.token)
        print(response.json())

合同接口

我們首先給出需求信息:

# 請(qǐng)求頭:{ "Content-Type ":  " multipart/form-data ",  "Authorization":  "xxx " }
# 請(qǐng)求體:{" file " : 合同文件"}

# 接口信息:
# 新增合同:
# 地址:http://kdtx-test.itheima.net/api/contract
# 方法:Post
# 請(qǐng)求數(shù)據(jù):
# 請(qǐng)求頭:{ "Content-Type ":  "application/json ",  "Authorization":  "xxx " }
# 請(qǐng)求體:{ "name": "測(cè)試888", "phone": "13612345678", "contractNo": "HT10012003", "subject": "6", "courseId": " 99", "channel": "0", "activityId": 77, "fileName": "xxx"}

我們首先需要書寫接口,所以我們需要在api文件下創(chuàng)建contract.py進(jìn)行接口書寫:

# 導(dǎo)包
import requests

# 創(chuàng)建接口類
class ContractAPI:
    # 初始化
    def __init__(self):
        self.url_upload = "http://kdtx-test.itheima.net/api/common/upload"
        self.add_contrat = "http://kdtx-test.itheima.net/api/contract"

    # 合同上傳接口
    def upload_contract(self, test_data, token):
        # 我們的合同需要一份文件信息上傳,所以我們參數(shù)這里使用到了file
        # 其實(shí)我們的headers頭部的Content-Type信息也被修改,但由于該信息是根據(jù)傳輸內(nèi)容更新的,所以我們不需要設(shè)置
        return requests.post(url=self.url_upload, files={"file": test_data}, headers={"Authorization":  token})

    # 合同新增
    def add_contract(self, test_data, token):
        # 這里就是很正常的新增
        return requests.post(url=self.add_contrat, json=test_data, headers={"Authorization":  token})

當(dāng)我們書寫完接口信息之后,我們就可以到script文件夾下創(chuàng)建test文件進(jìn)行測(cè)試用例書寫:

# 導(dǎo)包
import config
from api.login import LoginAPI
from api.course import CourseAPI
from api.contract import ContractAPI


# 創(chuàng)建測(cè)試類
class TestContractBusiness:
    # 初始化
    token = None

    # 前置處理
    def setup(self):
        # 實(shí)例化接口對(duì)象
        self.login_api = LoginAPI()
        self.course_api = CourseAPI()
        self.contract_api = ContractAPI()

    # 后置處理
    def teardown(self):
        pass

    # 1、登錄成功
    def test01_login_success(self):
        # 獲取驗(yàn)證碼
        res_v = self.login_api.get_verify_code()

        # 登錄
        login_data = {
            "username": "admin",
            "password": "admin123",
            "code": "2",
            "uuid": res_v.json().get("uuid")
        }
        res_l = self.login_api.login(test_data=login_data)
        # 提取登錄成功之后的token數(shù)據(jù)并保存在類的屬性中
        TestContractBusiness.token = res_l.json().get("token")

    # 2、上傳合同成功
    def test02_upload_contract(self):
        # 這里我們需要將對(duì)應(yīng)的文件采用二進(jìn)制讀取并且轉(zhuǎn)化為file類型將其作為參數(shù)傳參
        f = open(config.BASE_PATH + "/data/test.pdf", "rb")
        # 這里的test_data在Api中作為files的file被傳遞
        response = self.contract_api.upload_contract(test_data=f, token=TestContractBusiness.token)
        print(response.json())

    # 3、合同新增成功
    def test03_add_contract(self):
        # contractNo: 數(shù)據(jù)唯一
        add_data = { "name": "測(cè)試888", "phone": "13612345678", "contractNo": "HT20230007", "subject": "6", "courseId": " 99", "channel": "0", "activityId": 77, "fileName": "xxx"}
        response = self.contract_api.add_contract(test_data=add_data, token=TestContractBusiness.token)
        print(response.json())

單接口測(cè)試

下面我們來(lái)講解針對(duì)于單個(gè)接口進(jìn)行多測(cè)試用例測(cè)試的方法:

# 我們這里以Login的API為基準(zhǔn)
# 我們需要采用不同的測(cè)試用例來(lái)進(jìn)行測(cè)試并判斷是否滿足需求

我們首先給出測(cè)試用例圖表:

然后我們采用代碼進(jìn)行接口自動(dòng)化測(cè)試用例書寫:

# 導(dǎo)包
from api.login import LoginAPI

# 創(chuàng)建測(cè)試類
class TestLoginAPI:
    
    # 初始化
    uuid = None

    # 前置處理
    # 我們將uuid驗(yàn)證碼作為所有case方法執(zhí)行前的前置操作進(jìn)行執(zhí)行并存儲(chǔ)使用
    def setup(self):
        # 實(shí)例化接口類
        self.login_api = LoginAPI()
        # 獲取驗(yàn)證碼
        response = self.login_api.get_verify_code()
        # 提取驗(yàn)證碼接口返回的uuid參數(shù)值
        TestLoginAPI.uuid = response.json().get("uuid")

    # 后置處理
    def teardown(self):
        pass
    
    # 下面我們通過(guò)多個(gè)Case的書寫來(lái)模擬多場(chǎng)景情況
    # 我們下面Case的基本邏輯沒(méi)有發(fā)生修改,僅僅是針對(duì)參數(shù)進(jìn)行了處理

    # 登錄成功
    def test01_success(self):
        login_data = {
            "username": "manager",
            "password": "123456",
            "code": "2",
            "uuid": TestLoginAPI.uuid
        }
        response = self.login_api.login(test_data=login_data)
		# 我們使用斷言來(lái)判斷是否符合需求,若符合需求pytest會(huì)通過(guò)案例,若不符合會(huì)進(jìn)行報(bào)錯(cuò)
        assert 200 == response.status_code				# 斷言響應(yīng)狀態(tài)碼為200
        assert '成功' in response.text				   # 斷言響應(yīng)數(shù)據(jù)包含'成功'
        assert 200 == response.json().get("code")		# 斷言響應(yīng)json數(shù)據(jù)中code值

    # 登錄失?。ㄓ脩裘麨榭眨?    def test02_without_username(self):
        login_data = {
            "username": "",
            "password": "123456",
            "code": "2",
            "uuid": TestLoginAPI.uuid
        }
        response = self.login_api.login(test_data=login_data)
        # 我們使用斷言來(lái)判斷是否符合需求,若符合需求pytest會(huì)通過(guò)案例,若不符合會(huì)進(jìn)行報(bào)錯(cuò)
        assert 200 == response.status_code				# 斷言響應(yīng)狀態(tài)碼為200
        assert '成功' in response.text				   # 斷言響應(yīng)數(shù)據(jù)包含'成功'
        assert 200 == response.json().get("code")		# 斷言響應(yīng)json數(shù)據(jù)中code值

    # 登錄失敗(未注冊(cè)用戶)
    def test03_username_not_exist(self):
        login_data = {
            "username": "jack666",
            "password": "123456",
            "code": "2",
            "uuid": TestLoginAPI.uuid
        }
        response = self.login_api.login(test_data=login_data)
        # 我們使用斷言來(lái)判斷是否符合需求,若符合需求pytest會(huì)通過(guò)案例,若不符合會(huì)進(jìn)行報(bào)錯(cuò)
        assert 200 == response.status_code				# 斷言響應(yīng)狀態(tài)碼為200
        assert '成功' in response.text				   # 斷言響應(yīng)數(shù)據(jù)包含'成功'
        assert 200 == response.json().get("code")		# 斷言響應(yīng)json數(shù)據(jù)中code值

參數(shù)化測(cè)試

我們?cè)谇懊嫱ㄟ^(guò)書寫多個(gè)Case來(lái)進(jìn)行同一接口的自動(dòng)化測(cè)試,但這種方法會(huì)導(dǎo)致代碼冗余

所以我們通常會(huì)通過(guò)pytest的參數(shù)化設(shè)置來(lái)統(tǒng)一數(shù)據(jù)將其放入Case用例中按順序依次執(zhí)行來(lái)減少代碼冗余:

# 我們可以將數(shù)據(jù)單獨(dú)存放在文件頂層
# 我們所傳入的數(shù)據(jù)需要采用列表作為外層,采用字典作為數(shù)據(jù)參數(shù)進(jìn)行存儲(chǔ)

# 導(dǎo)包
from api.login import LoginAPI
import pytest
import json

# 測(cè)試數(shù)據(jù)
test_data = [
    ("manager", "123456", 200, '成功', 200),
    ("", "123456", 200, '錯(cuò)誤', 500),
    ("jack666", "123456", 200, '錯(cuò)誤', 500),
]

class TestLoginAPI:
    
    # 初始化
    uuid = None

    # 前置處理
    def setup(self):
        # 實(shí)例化接口類
        self.login_api = LoginAPI()
        # 獲取驗(yàn)證碼
        response = self.login_api.get_verify_code()
        # 提取驗(yàn)證碼接口返回的uuid參數(shù)值
        TestLoginAPI.uuid = response.json().get("uuid")

    # 后置處理
    def teardown(self):
        pass

    # 多Case登錄驗(yàn)證
    # 這里我們使用了我們上面所定義的test_data作為數(shù)據(jù)源來(lái)進(jìn)行參數(shù)化處理
    # 我們可以將我們所需要更替的數(shù)值全部采用參數(shù)化處理,使處理數(shù)據(jù)變得多樣化
    # 這里所使用的parametrize是pytest的內(nèi)容,我們?cè)谏掀恼乱呀?jīng)講過(guò),如果不了解可以去查看
    @pytest.mark.parametrize("username, password, status, message, code",test_data)
    def test01_success(self, username, password, status, message, code):
        # 這里的username,password使用參數(shù)化
        login_data = {
            "username": username,
            "password": password,
            "code": "2",
            "uuid": TestLoginAPI.uuid
        }
        response = self.login_api.login(test_data=login_data)
        # 這里的斷言判斷均使用參數(shù)化,因?yàn)椴煌瑮l件下所產(chǎn)生的response數(shù)據(jù)是不同的
        assert status == response.status_code
        assert message in response.text
        assert code == response.json().get("code")

接口自動(dòng)化配置解釋

最后我們需要解釋我們?cè)谧铋_始所提及到的兩個(gè)接口配置信息

全局信息配置文件

我們?cè)谧铋_始提及到了在我們的文件目錄下創(chuàng)建了一個(gè)Config.py文件

下面我們來(lái)解釋一下該文件的主要作用:

# 我們通常在該文件下定義我們?nèi)侄夹枰褂玫臄?shù)據(jù)信息,來(lái)減少我們代碼的冗余

# 例如我們?cè)谥暗慕涌诨驕y(cè)試用例中都需要使用到的url,我們可以在這里定義其項(xiàng)目url前綴,然后我們只需要書寫對(duì)應(yīng)的接口路徑即可

# 又或者說(shuō)由于我們之前的文件上傳沒(méi)有固定的文件目錄,我們需要從當(dāng)前文件下去推斷data文件夾在哪個(gè)位置
# 但是如果我們項(xiàng)目發(fā)生改動(dòng),或者我們借鑒該代碼去書寫其他部分的文件,我們就需要去重新推斷data文件夾在哪個(gè)位置
# 所以我們可以通過(guò)config.py直接獲得絕對(duì)路徑下的data目錄的位置,然后我們只需要進(jìn)行拼接就可以獲得到我們所需要的數(shù)據(jù)信息

所以我們的config.py文件可以這樣去定義:

# config.py文件

# 導(dǎo)包
import os

# 設(shè)置項(xiàng)目環(huán)境域名
BASE_URL = "http://kdtx-test.itheima.net"
# 獲取項(xiàng)目根路徑
BASE_PATH = os.path.dirname(__file__)

當(dāng)然我們對(duì)應(yīng)的接口代碼和測(cè)試用例代碼也需要進(jìn)行修改:

# 首先針對(duì)API文件,我們需要去修改我們的url路徑信息

    def __init__(self):
        # 指定url基本信息
        # self.url_verify = "http://kdtx-test.itheima.net/api/captchaImage"
        self.url_verify = config.BASE_URL + "/api/captchaImage"
        # self.url_login = "http://kdtx-test.itheima.net/api/login"
        self.url_login = config.BASE_URL + "/api/login"
        
# 針對(duì)文件上傳時(shí)的路徑我們也可以去修改

    def test03_upload_contract(self):
        # f = open("../data/test.pdf", "rb")
        f = open(config.BASE_PATH + "/data/test.pdf", "rb")
        response = self.contract_api.upload_contract(test_data=f, token=TestContractBusiness.token)
        print(response.json())

框架設(shè)置配置文件

我們之前還提到了一個(gè)pytest.ini文件,該文件其實(shí)就是針對(duì)pytest執(zhí)行用例的初始化進(jìn)行設(shè)置:

# 該文件其實(shí)屬于pytest的學(xué)習(xí)范疇,我們?cè)谶@里簡(jiǎn)單介紹一下

[pytest]

# 表示我們?cè)赥erminal執(zhí)行pytest時(shí)的默認(rèn)執(zhí)行配置
# 這里我們采用-s表示詳情信息展示,采用--alluredir表示采用allure生成測(cè)試報(bào)告并生成在report文件夾下
addopts=-s --alluredir report
# 這里表示我們所需要執(zhí)行的測(cè)試用例的文件范圍
testpaths=./script
# 這里規(guī)定了配置測(cè)試搜索的模塊文件名稱
python_files=test*
# 這里規(guī)定了我們所執(zhí)行的測(cè)試類的類名規(guī)范
python_classes=Test*
# 這里規(guī)定了我們所執(zhí)行的測(cè)試方法的方法名規(guī)范
python_functions=test*

結(jié)束語(yǔ)

這篇文章中詳細(xì)介紹了以pytest為框架的接口自動(dòng)化實(shí)現(xiàn)的基本信息,希望能為你帶來(lái)幫助

下面給出我學(xué)習(xí)和書寫該篇文章的一些參考文章,大家也可以去查閱:

  1. 黑馬課程:001_認(rèn)識(shí)接口測(cè)試_嗶哩嗶哩_bilibili
  2. 知乎文章:python中requests庫(kù)使用方法詳解 - 知乎 (zhihu.com)
  3. CSDN:requests庫(kù)的使用(一篇就夠了)_上善若水。。的博客-CSDN博客
  4. 稀土掘金:軟件測(cè)試/測(cè)試開發(fā)丨學(xué)習(xí)筆記之接口自動(dòng)化測(cè)試 - 掘金 (juejin.cn)

總結(jié)

以上是生活随笔為你收集整理的一篇文章带你了解接口自动化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久久久伊人 | 人人干网站 | 国产人成一区二区三区影院 | 成人免费在线视频 | av女优中文字幕在线观看 | 日韩av有码在线 | 五月婷婷色综合 | 色是在线视频 | 国产精品久久久久三级 | 激情影音先锋 | 992tv在线观看| 精品99在线 | 91色欧美| 久久欧美综合 | 免费av片在线 | 激情综合啪 | 国产精品 中文字幕 亚洲 欧美 | 日韩欧美91 | 成 人 黄 色 视频 免费观看 | 美女免费视频一区 | 日韩在线视频播放 | 中文字幕乱码在线播放 | 国产精品自产拍在线观看桃花 | 久草在线电影网 | 国产成人精品一区二 | av电影免费在线看 | 四虎在线免费观看 | 久热只有精品 | 九月婷婷人人澡人人添人人爽 | 精品国产免费久久 | 日韩有码欧美 | 久久免费视频在线观看30 | 国产日韩在线看 | 国产品久精国精产拍 | 亚洲国产黄色 | 网址你懂的在线观看 | 91禁在线观看 | 夜色资源站国产www在线视频 | 日韩精品一区二区免费 | av网站在线观看播放 | 一级电影免费在线观看 | 久久久久 免费视频 | 91精品一区国产高清在线gif | 中文字幕精品久久 | 久久免费国产视频 | 中文av不卡 | 天天爽夜夜操 | 日韩在线电影一区二区 | 天天干天天射天天操 | 国产精彩在线视频 | 18做爰免费视频网站 | 91综合视频在线观看 | 欧美极品久久 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 在线小视频你懂的 | 欧美国产日韩一区二区三区 | 国产精品爽爽爽 | 久久精品日本啪啪涩涩 | 人人干人人搞 | 97在线观视频免费观看 | 久久毛片视频 | 国产精品久久影院 | 黄色毛片视频免费 | 91九色蝌蚪在线 | 91在线免费看片 | 国产最新在线视频 | 91免费观看视频网站 | 久久99久久精品国产 | 日韩一二三区不卡 | 丁香六月网 | 欧美亚洲成人免费 | 国产一区高清在线观看 | 手机看片中文字幕 | 人人射人人爽 | 久久久男人的天堂 | 色综合久久久久综合 | 亚洲欧美视频在线播放 | 色吊丝在线永久观看最新版本 | 欧美美女视频在线观看 | 99爱视频在线观看 | 玖玖精品视频 | 日韩美在线| 国产成人一区二区三区久久精品 | 激情影院在线观看 | 亚洲 综合 激情 | 香蕉久久久久久久 | 亚洲激情 欧美激情 | 亚洲精品国产麻豆 | 99精品在线免费观看 | 色偷偷88888欧美精品久久久 | 日韩欧美国产免费播放 | 日本久久电影网 | 尤物一区二区三区 | 欧美一二三区在线观看 | 午夜精品视频一区二区三区在线看 | 999热视频 | 又污又黄的网站 | 97久久久免费福利网址 | 久草99 | 日韩欧美在线免费观看 | 麻豆免费在线视频 | 中国一区二区视频 | 成人免费大片黄在线播放 | 亚洲精品色婷婷 | 国产高清视频在线免费观看 | www.av小说| 最新久久免费视频 | 久久人人插 | 日韩精品欧美专区 | 97在线精品国自产拍中文 | 久久精品亚洲精品国产欧美 | 深爱五月网 | 91成人免费在线视频 | 五月婷婷.com | 视频在线观看一区 | 蜜臀av性久久久久av蜜臀三区 | 亚洲 欧美 日韩 综合 | 91久久在线观看 | 亚洲波多野结衣 | 伊人视频 | 久久国产美女 | 国产一区观看 | 欧美亚洲国产一卡 | 人人爽人人爽人人片av免 | 国产一区二区精品久久91 | 91热在线 | 亚洲国产精品人久久电影 | 欧美日韩国产mv | 人人插人人看 | 黄色官网在线观看 | 婷婷网五月天 | www.综合网.com | 天天在线操 | 99久久日韩精品免费热麻豆美女 | 人人干97 | 91传媒激情理伦片 | 婷婷中文字幕综合 | 久久99网站 | 国产精品综合在线 | 天天曰视频 | 久草在线免费播放 | 中文字幕国产一区 | 国产精品永久久久久久久www | 国产一级特黄毛片在线毛片 | 国产人成免费视频 | 国产精品theporn | 就要干b| 欧美性生活久久 | 中文日韩在线 | 黄色国产高清 | 国模精品一区二区三区 | av九九 | 91经典在线 | 在线亚洲激情 | 精品伊人久久久 | 不卡的av在线 | 久久97久久97精品免视看 | 国产视频欧美视频 | 日韩av中文字幕在线免费观看 | 精品毛片一区二区免费看 | 国产一区二区不卡视频 | 狠狠狠干| 天天天综合网 | 国产aa精品 | 91视频久久久久久 | 日本中文字幕网址 | 国产人免费人成免费视频 | 五月视频| 亚洲成a人片77777kkkk1在线观看 | 天天草综合网 | 欧美一级艳片视频免费观看 | 最新日韩中文字幕 | 久久伊人综合 | 欧美日韩不卡在线视频 | 久久精品99国产国产精 | 精品在线免费观看 | 久久国产精品免费观看 | 亚洲 欧洲 国产 日本 综合 | 色网站在线看 | 色多多污污在线观看 | 天海冀一区二区三区 | 欧美激情xxxx | 成人动漫一区二区三区 | 伊人五月综合 | 五月婷婷六月丁香在线观看 | 亚洲精品观看 | 三上悠亚一区二区在线观看 | 最近免费中文字幕mv在线视频3 | 草久在线观看视频 | 精品国产一区二区三区四区在线观看 | 特级西西444www大精品视频免费看 | 探花视频在线版播放免费观看 | 伊人婷婷色| 日韩av手机在线看 | 精品视频在线视频 | 日韩精品一区电影 | 国产不卡精品 | 中文字幕在线观看三区 | 色免费在线 | 欧日韩在线 | 夜夜躁天天躁很躁波 | 国产精品男女啪啪 | 国产精品99久久久精品免费观看 | 欧美一级艳片视频免费观看 | 色999视频 | 91在线视频在线 | 久热免费 | 亚洲国产日本 | 亚洲女同ⅹxx女同tv | 久久精品成人 | 国产精品一区久久久久 | 99操视频| 九九色视频 | 国产黄色精品在线观看 | 久久新视频 | 美女视频国产 | 婷婷六月中文字幕 | 成年人国产在线观看 | 人人搞人人干 | 少妇激情久久 | 免费男女羞羞的视频网站中文字幕 | 久久久久亚洲精品国产 | 久久久久国产成人精品亚洲午夜 | 日韩欧美一区二区在线播放 | 成人av亚洲 | 国产我不卡 | 欧美另类性 | 久久高清 | 在线观看视频免费播放 | 国产成人久久av | 亚洲一级片在线看 | 亚洲婷婷综合色高清在线 | 国产精品av久久久久久无 | 国产98色在线 | 日韩 | 久久国产福利 | 蜜臀精品久久久久久蜜臀 | 国产高清视频在线播放一区 | 午夜精品久久久久久久99 | 国产精品毛片一区二区在线看 | 久久免费视频这里只有精品 | 亚洲涩涩网站 | www.国产视频 | 99爱精品视频 | 天天色天天干天天 | 国产精品美女999 | 免费成人在线观看视频 | 亚洲欧美一区二区三区孕妇写真 | 高清精品久久 | 一区二区高清在线 | 日本在线视频网址 | 日韩视频一区二区三区在线播放免费观看 | 天天色天天上天天操 | 亚洲伦理中文字幕 | 成人免费视频网站 | 国产一区欧美二区 | www日韩在线观看 | 天堂入口网站 | 欧美性脚交 | 九九九热精品 | 狠狠色狠狠色合久久伊人 | 午夜精品久久久久久久久久 | 国产网站av | 91av视频免费在线观看 | 99热免费在线 | 在线亚洲免费视频 | 国产精品久久久久婷婷 | 超碰在线亚洲 | 中文字幕视频播放 | 91九色蝌蚪视频在线 | 99久久er热在这里只有精品15 | 久草国产精品 | 中文字幕日韩一区二区三区不卡 | 三级视频国产 | 奇米网777 | 在线免费黄网站 | 伊人久久影视 | 欧美日韩精品久久久 | 久草国产在线 | 久久久久综合 | 国产成人精品一二三区 | 国产精品久久久av | 91热精品视频| 亚洲精品视频大全 | 国产成人av一区二区三区在线观看 | 黄色小说视频网站 | 青青河边草观看完整版高清 | 久久视频国产 | 国产在线黄色 | 国产 字幕 制服 中文 在线 | 中文字幕一区二区三区四区在线视频 | 国产日韩欧美在线观看 | 久久综合亚洲鲁鲁五月久久 | 午夜久久久久 | 激情视频二区 | 国产精品久久久久婷婷二区次 | 在线91观看 | 精品国产一区二区三区在线 | 亚洲一区二区91 | 国产精品不卡在线 | www成人av| 日韩毛片在线免费观看 | 亚洲自拍偷拍色图 | 97在线免费观看 | 91伊人| 又色又爽的网站 | 久久综合九色综合97婷婷女人 | 欧美日韩国产精品一区二区 | 黄网站大全 | 国产精品中文字幕在线播放 | 免费观看高清 | 国产中文字幕在线 | 17videosex性欧美| 国产成人精品aaa | 91porny九色91啦中文 | 亚洲另类视频在线 | 成年人黄色在线观看 | 91免费看黄 | 日韩精品一区二区三区电影 | 国产一级特黄毛片在线毛片 | 久久精品79国产精品 | 日本aaaa级毛片在线看 | 成年人视频在线免费观看 | 五月婷婷操 | 国产精品免费人成网站 | www.av在线.com | 亚洲精品福利在线 | 久久爱导航 | 日韩在线无 | 99精品一区 | 日韩免费在线一区 | 亚洲伊人第一页 | 日韩xxxbbb | 日韩午夜av | 国产91影视 | 日韩精品一区二区三区免费观看 | 2021av在线 | 天天色天天射天天干 | www成人av| 天天综合久久综合 | 久久久国产一区 | 天天操人人干 | 日韩欧美在线观看一区二区三区 | 午夜精品久久久99热福利 | 亚洲精品大片www | 亚洲欧美日韩国产精品一区午夜 | 97品白浆高清久久久久久 | 精品国产视频在线 | 成人在线观看资源 | 精品黄色在线 | 欧美九九九 | 91视频高清| 91成人亚洲 | 91视频-88av| www..com毛片 | 日av免费 | 99免费在线视频观看 | 在线观看免费中文字幕 | 午夜av免费观看 | 丝袜足交在线 | 国产精品欧美日韩在线观看 | 国产高清视频免费观看 | 午夜视频导航 | 高清av免费看 | 久久国产精品一国产精品 | 久久爱992xxoo| 久久99精品久久久久婷婷 | 中文字幕 国产视频 | 美女黄久久 | 日韩黄色一级电影 | 玖玖爱国产在线 | 国产成人久久精品一区二区三区 | 天天干天天射天天操 | 黄色成人小视频 | 色综合久久中文综合久久牛 | 亚洲理论电影网 | 探花视频免费观看高清视频 | 99久久精品久久久久久动态片 | 手机av资源| 成人在线免费小视频 | 国产97碰免费视频 | 久久国产精品一区二区三区 | 成人黄色毛片视频 | 国产视频二 | 国产精品美| 久久成人久久 | 99色免费视频 | 在线91视频 | 女人18片| 中文字幕在线观 | 国产尤物一区二区三区 | 亚洲国产影院av久久久久 | 一本一本久久a久久精品牛牛影视 | 久久99最新地址 | 韩日精品在线观看 | 视频国产区 | 免费视频三区 | 人成在线免费视频 | 日韩黄色中文字幕 | 久久人人爽人人爽人人片av免费 | 日韩电影在线观看一区二区 | 美女视频黄网站 | 黄色a视频免费 | 99久久精品国 | 国产日韩欧美中文 | 三级毛片视频 | 美女国产 | av在线永久免费观看 | 免费在线观看成人小视频 | 成人毛片在线视频 | 亚洲天堂网在线播放 | 国产97在线观看 | 91免费高清 | 综合久久久久久 | 国产高清视频免费 | 久久99影院 | 亚洲综合视频在线观看 | 欧美日韩二区三区 | 国产裸体无遮挡 | 国产精品一区二区中文字幕 | 中文字幕资源网在线观看 | 国产精品专区h在线观看 | 黄色三级在线 | 天天射天天干天天插 | 免费观看福利视频 | 男女啪啪视屏 | 久久国产露脸精品国产 | 综合在线亚洲 | 国产 日韩 欧美 在线 | 亚洲一区二区视频 | 97影视| 久久免费精彩视频 | 一级黄色在线视频 | 日韩在线一区二区免费 | 久久久性| 在线免费观看视频你懂的 | 精品视频网站 | 开心激情五月婷婷 | 国产高清中文字幕 | 精品久久久一区二区 | 欧美电影在线观看 | 人人看看人人 | 日韩高清免费在线观看 | 日韩理论在线视频 | 天天色天天色天天色 | 久久成人国产 | 亚洲日b视频 | 国产精品福利午夜在线观看 | 日韩精品一区二区在线观看视频 | 国产精品美女毛片真酒店 | 久久久精品日本 | 五月婷婷,六月丁香 | 99精品区 | 最近最新mv字幕免费观看 | 一级片色播影院 | 亚州精品一二三区 | 特级黄色一级 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 天天操天天射天天爽 | 亚洲综合射 | 亚洲3级| 99色人| 99热这里只有精品在线观看 | 欧美一二三区在线观看 | 国产精品18久久久久久不卡孕妇 | 岛国大片免费视频 | 日韩免费在线 | 久久久私人影院 | 五月婷婷丁香六月 | 亚洲成人午夜在线 | 成人午夜精品久久久久久久3d | 成人国产精品免费观看 | 日本黄色免费电影网站 | 欧美激情va永久在线播放 | 一区二区三区免费在线 | 国产精品福利在线 | 日韩在线视频二区 | 国产黄大片在线观看 | 大片网站久久 | 久久激情影院 | 日本中文字幕系列 | 久久久久久欧美二区电影网 | 91污污视频在线观看 | 99精品欧美一区二区三区黑人哦 | 91久久精品一区二区二区 | 日本黄色免费大片 | 欧美美女一级片 | 免费看搞黄视频网站 | 91在线一区| 91视频免费播放 | 欧美日韩精品国产 | 中文字幕欧美日韩va免费视频 | 国产精品成人av久久 | 婷婷成人亚洲综合国产xv88 | 天天操天天爽天天干 | 午夜视频一区二区三区 | 夜夜摸夜夜爽 | 午夜视频免费播放 | 91视频观看免费 | 成人aⅴ视频 | 亚洲国产午夜 | 99久久er热在这里只有精品66 | 色999视频 | 天天玩天天干 | 色婷婷中文 | 欧美一级爽 | 免费看黄在线观看 | 久久综合五月天 | 久久99精品国产91久久来源 | 国产日产精品一区二区三区四区的观看方式 | 久久爱导航 | 国产精品久久久久久久久久久久午 | 亚洲国产三级在线 | 人人看人人 | 亚洲精品视频在线免费 | 五月婷婷丁香综合 | 欧美最猛性xxxxx亚洲精品 | 色婷婷在线视频 | 久久人人爽人人片av | 久久精品屋 | 超碰在线91 | 免费色黄 | 色综合天天天天做夜夜夜夜做 | 日本爱爱片 | 天天操天天干天天爽 | 久草视频中文在线 | 国产小视频在线观看 | 久久成人亚洲欧美电影 | 国产 日韩 欧美 在线 | av一级一片 | 久久久久久久久久久网 | 国产精品美女在线观看 | 91在线看 | 97人人模人人爽人人少妇 | 日韩成年视频 | 亚洲欧美日韩国产一区二区三区 | 婷婷丁香花五月天 | 一区二区三区免费在线 | 国产精品 中文字幕 亚洲 欧美 | 亚洲国产高清视频 | 99精品免费网 | 国产精品久久久久久久久久久久久久 | 五月婷婷欧美 | 欧美日韩高清一区二区 | 亚洲理论在线观看电影 | 国内久久久久久 | 国产系列 在线观看 | 国产高清精品在线观看 | 色偷偷男人的天堂av | 久久免费毛片 | 丁香视频全集免费观看 | 国产亚洲视频中文字幕视频 | 91av观看 | 国产在线视频资源 | 夜夜躁日日躁狠狠久久88av | 亚洲永久国产精品 | 国产精品久久久久久久av大片 | 日韩有码网站 | 在线视频1卡二卡三卡 | 日韩黄色在线电影 | 婷婷综合伊人 | 欧美精品久久久 | 国产中文 | 99久久精品一区二区成人 | 91色国产 | 久久精品超碰 | 99久久久成人国产精品 | 日日爽| 深爱激情丁香 | 欧美一级片免费在线观看 | 视频一区在线免费观看 | 亚洲日日射| av在线免费观看黄 | 国产一级做a爱片久久毛片a | 免费黄色在线网址 | 在线v片 | 亚洲亚洲精品在线观看 | 国产午夜精品免费一区二区三区视频 | 国产剧情在线一区 | 热久久在线视频 | 91av播放| 日韩深夜在线观看 | 天天天在线综合网 | 中文字幕 国产专区 | 色香蕉在线 | 五月婷婷综合久久 | 中文字幕一区二区在线播放 | 亚洲精品中文字幕视频 | 午夜久久美女 | 国产午夜一区 | 国产粉嫩在线观看 | 国产精品不卡视频 | 日韩区欠美精品av视频 | 午夜在线日韩 | 欧美在线视频一区二区三区 | 日韩精品一区二区三区在线视频 | 99久久精品日本一区二区免费 | 成人99免费视频 | av大全免费在线观看 | 久在线观看视频 | www.97视频| 久久电影中文字幕视频 | 国产视频一区二区在线观看 | 久久久久免费网站 | 午夜视频免费播放 | 国产中文字幕视频在线观看 | 国内外激情视频 | 久久99亚洲精品久久久久 | 一级黄色网址 | 人人狠狠| 久久99精品一区二区三区三区 | 亚洲精品国偷自产在线91正片 | 91麻豆国产福利在线观看 | 中文字幕亚洲欧美日韩2019 | av资源在线看 | 国产精品永久免费视频 | 成人av.com | 在线观看国产一区二区 | 91视视频在线直接观看在线看网页在线看 | 日韩欧美一区视频 | 美女亚洲精品 | 中文字幕人成乱码在线观看 | 992tv在线成人免费观看 | 999久久国产精品免费观看网站 | 99精品视频在线播放免费 | 在线 国产 亚洲 欧美 | 黄色午夜 | 免费观看的av网站 | 精品国产一区二区三区久久久蜜臀 | 日本久久久久久久久久久 | 成人av免费电影 | 国产精品久久久久一区二区 | 激情综合网天天干 | 亚洲国产欧美一区二区三区丁香婷 | 涩涩网站在线观看 | 97理论片| 91九色视频导航 | 国产a级片免费观看 | 在线观看片| 婷婷国产在线 | 亚洲精品一区二区18漫画 | 欧美一级久久久 | 日韩精品视频免费专区在线播放 | 极品久久久 | 美女视频黄网站 | 亚洲成人免费在线 | 亚洲精品乱码久久久久久写真 | 日韩高清不卡在线 | 久久av一区二区三区亚洲 | 国产免费久久av | 韩国av一区二区三区在线观看 | 黄色天堂在线观看 | 日韩黄视频 | 久久国内精品视频 | 超碰人人做 | 五月婷婷在线观看视频 | 日韩一区二区三免费高清在线观看 | 综合黄色网 | 免费看国产精品 | 婷婷六月天综合 | 日本中文字幕在线观看 | 久久99在线 | 久久精品综合视频 | 五月婷在线观看 | 99在线视频观看 | 五月天亚洲激情 | 久久亚洲精品国产亚洲老地址 | 欧美精品久久久久久久久老牛影院 | 911国产在线观看 | 亚洲精品在线观看视频 | 激情综合久久 | av成人免费网站 | 久久黄色a级片 | 国产91精品在线观看 | 免费成人av在线 | 伊人亚洲综合网 | 婷婷在线免费视频 | 香蕉视频在线播放 | 久久久精品免费看 | 成年人在线观看 | 视频在线观看入口黄最新永久免费国产 | 麻豆91视频 | 国产高清不卡一区二区三区 | 91在线色 | 午夜电影一区 | 精品久久1 | a黄色片 | 久久九九精品 | 爱爱一区 | 久久久久久毛片精品免费不卡 | 成年人免费观看国产 | 91片黄在线观看动漫 | 一本一道久久a久久精品蜜桃 | 黄a网 | 在线视频 日韩 | а中文在线天堂 | 色婷婷欧美 | 免费观看国产视频 | 黄色毛片网站在线观看 | 亚洲精品毛片一级91精品 | 久久国产精品偷 | 黄色免费高清视频 | 三上悠亚一区二区在线观看 | 久久99精品热在线观看 | 韩国av免费在线 | 国产精品成人久久久久 | 一级a毛片高清视频 | 欧美在线视频第一页 | 国产 中文 日韩 欧美 | 欧美日韩在线观看不卡 | 伊人宗合| 欧美极品在线播放 | 韩国av一区二区三区 | 日批网站免费观看 | 欧美日韩国产一区二区三区 | 探花视频免费观看 | 制服丝袜在线 | 最近中文字幕mv免费高清在线 | 日日干精品| 久久香蕉电影 | 色偷偷人人澡久久超碰69 | 日韩精品在线视频免费观看 | 国产精品一区二区在线观看免费 | 国产精品久久久久久久av电影 | 国产99久久久国产 | 天天天干天天射天天天操 | 国产精品免费高清 | 在线韩国电影免费观影完整版 | 2021国产在线| 天天射天天干天天爽 | 欧美久久久久久久久中文字幕 | 免费电影一区二区三区 | 国产伦理久久精品久久久久_ | 日韩特级片 | 久久久成人精品 | 国产精品入口久久 | 天天干天天射天天操 | 成人精品视频久久久久 | 五月婷婷导航 | 国产成人精品综合久久久久99 | 久久蜜臀av | 国产在线视频资源 | 欧洲不卡av| 免费男女羞羞的视频网站中文字幕 | 欧美日韩国产精品一区二区三区 | 久久污视频| 亚洲九九影院 | 国产黄色免费观看 | 91成人网页版 | 日韩v欧美v日本v亚洲v国产v | 91最新地址永久入口 | 在线看污网站 | 日韩精品不卡在线观看 | 久久精品成人热国产成 | 国产精品电影在线 | 久久综合色8888 | 国产精品毛片一区视频播不卡 | 亚洲九九九 | 在线v片免费观看视频 | 福利av影院 | 日三级在线 | 国产中文字幕网 | 免费特级黄毛片 | 7799av| 中文字幕一区二区三区四区 | 狠狠色噜噜狠狠狠狠2021天天 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 黄色在线免费观看网址 | 国产精品亚洲视频 | 国产一区二区在线播放视频 | 黄色亚洲| av 一区二区三区四区 | 黄色av一区 | 中文字幕色在线视频 | 五月天伊人 | 91天堂在线观看 | 欧美在线观看视频 | 免费视频网 | 看毛片网站| 玖玖视频精品 | 国产精品尤物视频 | 国产精品精品久久久久久 | 亚洲天堂网在线视频 | 激情丁香| 久久这里只有精品9 | 91福利影院在线观看 | av一级免费 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 97碰在线视频 | 97超碰总站 | 欧美日韩国产精品一区二区 | 成人免费一级 | 日韩激情综合 | 亚洲h在线播放在线观看h | 中文国产成人精品久久一 | 日韩字幕在线 | 精品久久久久久久久久久院品网 | 国产成人福利片 | 亚洲在线观看av | 在线播放第一页 | 亚洲激情影院 | 亚洲天堂毛片 | 中文字幕一区二区三区久久 | 国产九九九精品视频 | 麻豆传媒视频在线免费观看 | 激情黄色av | wwxxx日本| 伊人久久电影网 | 中文字幕 婷婷 | 一区二区视频免费在线观看 | 天天操 夜夜操 | www.天天射 | 九九免费精品视频在线观看 | 免费精品视频 | 久久欧美在线电影 | 欧美一区二区精美视频 | 久久精品亚洲 | 中文字幕在线观看播放 | 美女视频黄免费的 | 伊人天天综合 | 超碰av在线 | 人人澡视频 | 国产成人精品一区二区三区免费 | 久久久久免费 | 日韩av高清在线观看 | 人人舔人人 | 亚洲香蕉在线观看 | 久久婷亚洲五月一区天天躁 | 国产一区二区在线播放 | 国产小视频在线免费观看视频 | 超碰97在线看 | 91欧美国产 | 亚洲 综合 专区 | 在线观看黄网 | 中文一区二区三区在线观看 | 亚洲精品视频网站在线观看 | 国产丝袜高跟 | 美女视频黄免费的久久 | 91黄色视屏| 国产不卡毛片 | 五月天,com| 999久久久欧美日韩黑人 | 婷婷综合av| 亚洲精品国偷拍自产在线观看蜜桃 | 91精品在线观看入口 | 精品xxx | 国产91精品在线播放 | 亚洲专区一二三 | 在线观看亚洲精品视频 | 二区视频在线观看 | 色欧美视频 | 久久久久久久av麻豆果冻 | 久久精品系列 | 免费看污在线观看 | 欧美日韩精品在线一区二区 | 久草成人在线 | 欧美性天天 | 97在线免费 | 国产黄色播放 | 美国人与动物xxxx | 在线黄网站 | 亚洲高清av | 337p日本欧洲亚洲大胆裸体艺术 | 99精品视频免费全部在线 | 99精品欧美一区二区蜜桃免费 | 日韩精品欧美精品 | 色妞久久福利网 | 成人在线免费av | 欧美91精品国产自产 | 日韩av一区二区三区四区 | 久久国产精品久久久 | 成人毛片在线观看视频 | 超碰人人干人人 | 成人av免费在线看 | 高清av中文在线字幕观看1 | 久久免费的视频 | 久久久国产视频 | 日韩电影中文字幕在线 | 99精品在线免费观看 | 亚洲三级影院 | aaa日本高清在线播放免费观看 | 国产一级二级av | 日韩v欧美v日本v亚洲v国产v | 久久亚洲影视 | 毛片网在线观看 | 色天天久久 | 日韩美在线 | 丁香久久激情 | 毛片网在线播放 | 91九色性视频 | 欧美日韩综合在线观看 | 国产视频一区在线免费观看 | 欧美日韩精品在线一区二区 | 日韩在线视频一区二区三区 | 国产精品久久久久久久久久直播 | 天天操天天摸天天干 | 99视频久久 | 日韩在线免费视频观看 | 丁香五月网久久综合 | 91精品久久久久久久久久入口 | 国产福利不卡视频 | 黄色三级免费 | 粉嫩高清一区二区三区 | 五月婷婷在线观看视频 | 精品一二三区 | 中文字幕一二三区 | 黄色av网站在线免费观看 | 激情五月婷婷丁香 | 五月婷婷激情综合 | 久草色在线观看 | 人人澡视频 | 国产精品日韩欧美一区二区 | 曰本三级在线 | 午夜av激情 | 天天做天天爱天天爽综合网 | 欧美另类tv | 亚洲综合日韩在线 | 国产字幕在线观看 | 人人爽久久涩噜噜噜网站 | 久久久久久久影院 | 456成人精品影院 | 成人午夜av电影 | 亚洲精品视频大全 | 亚洲日b视频 | 久草在线精品观看 | 欧美性久久久 | 欧美韩日精品 | 久久精品99久久久久久2456 | 色天天 | 国产亚洲精品久久久久秋 | 国产剧情av在线播放 | 91av超碰 | 午夜精品福利一区二区 | 国产精品不卡在线 | 国产精品99在线观看 | 9久久精品 | 日韩精品久久久久久中文字幕8 | 99亚洲国产精品 | 九九热视频在线免费观看 | 成人a在线观看 | 亚洲欧美日韩国产一区二区三区 | 久久另类视频 | 在线观看免费成人av | 狠狠狠色丁香婷婷综合久久88 | 成年人免费在线播放 | a在线一区 | www五月天| 欧美一级电影在线观看 | www.久久精品视频 | 精品一区在线看 | 成人黄色短片 | 五月天综合色激情 | 国产黄色精品在线 | 日韩理论电影在线观看 | 国产精品久久久久久久久久久久冷 | 精品国产亚洲一区二区麻豆 | 一区二区三区免费在线观看视频 | 国产高清无线码2021 | 草免费视频| 超碰在线99 | av片在线观看 | 天堂av官网 | 亚洲高清久久久 | 天天综合久久 | 丁香六月久久综合狠狠色 | 日本三级香港三级人妇99 | 日韩欧美一二三 | 国产精品永久在线 | 日韩午夜小视频 | 九九九国产 | 婷婷五情天综123 | 欧美午夜激情网 | av动图 | 97超在线 | 久久精品网 | 五月天.com| 黄色的网站免费看 | 免费不卡中文字幕视频 | 欧美成人理伦片 | 国产一级大片免费看 | 亚洲精品女 | 欧美特一级 | 四虎影视成人精品 | 精品久久久久久久久久久久久久久久 | 婷婷综合激情 | 亚洲一区二区精品视频 | 成人免费视频在线观看 | 黄色www免费 | 中文字幕在线免费 | 久久精品国产一区二区三区 | 视频一区二区国产 | 在线观看福利网站 | 在线观看爱爱视频 | 日韩伦理片一区二区三区 | 精品一二三四五区 | 久久久久久久久久久久电影 | 久久成年人视频 | 911久久| 九九在线播放 |