99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

基于pytest+JSON Schema的數(shù)據(jù)驅(qū)動接口自動化測試實戰(zhàn)

基于pytest+JSON Schema的數(shù)據(jù)驅(qū)動接口自動化測試實戰(zhàn) 1. 項目概述當(dāng)數(shù)據(jù)驅(qū)動測試遇上契約驗證如果你正在做接口自動化測試或者任何需要處理大量輸入輸出數(shù)據(jù)的自動化測試那么“數(shù)據(jù)驅(qū)動”這個詞你一定不陌生。簡單來說就是把測試數(shù)據(jù)和測試邏輯分離讓同一個測試邏輯可以跑在不同的數(shù)據(jù)上。這聽起來很美但實際操作中我們常常會遇到兩個頭疼的問題第一如何優(yōu)雅地管理這些海量的測試數(shù)據(jù)第二如何高效地驗證返回的數(shù)據(jù)結(jié)構(gòu)是否符合預(yù)期而不是寫一堆冗長且脆弱的斷言我最近在一個大型微服務(wù)項目中就深度實踐了pytestAllureJSON Schema這套組合拳完美地解決了上述痛點。它不僅僅是“能用”而是形成了一套從數(shù)據(jù)準(zhǔn)備、用例執(zhí)行到結(jié)果驗證和報告生成的完整工作流。pytest提供了強大的參數(shù)化能力和靈活的插件生態(tài)Allure負責(zé)生成直觀、美觀的測試報告讓測試結(jié)果一目了然而JSON Schema則扮演了“數(shù)據(jù)契約”的角色用一種聲明式的方式定義數(shù)據(jù)結(jié)構(gòu)實現(xiàn)自動、精準(zhǔn)的驗證。這套方案的核心價值在于它將測試工程師從繁瑣的“數(shù)據(jù)搬運工”和“斷言泥潭”中解放出來。你不再需要為每一個測試用例寫一堆assert response[‘data’][‘user’][‘name’] ‘xxx’只需要定義好一個JSON Schema所有符合該接口契約的響應(yīng)都會被自動驗證。當(dāng)業(yè)務(wù)接口字段成百上千時這種效率的提升是顛覆性的。接下來我就把這套經(jīng)過實戰(zhàn)檢驗的方案從設(shè)計思路到踩坑細節(jié)完整地分享給你。2. 核心工具鏈選型與設(shè)計思路為什么是這三個工具的組合而不是unittestHTMLTestRunner 手動斷言這背后是一套關(guān)于效率、可維護性和可視化程度的綜合考量。2.1 pytest不止是測試框架更是執(zhí)行引擎pytest之所以成為 Python 自動化測試的事實標(biāo)準(zhǔn)遠不止因為它比unittest寫起來更簡潔。在數(shù)據(jù)驅(qū)動測試的語境下它的兩大特性無可替代強大的參數(shù)化裝飾器 (pytest.mark.parametrize)這是實現(xiàn)數(shù)據(jù)驅(qū)動的基石。它允許你將一個測試函數(shù)與多組參數(shù)綁定每組參數(shù)都會獨立運行一次測試。更關(guān)鍵的是它支持從文件如 JSON, YAML, CSV、甚至從自定義函數(shù)中動態(tài)讀取參數(shù)這為我們從外部管理測試數(shù)據(jù)提供了極大的靈活性。豐富的 Fixture 機制測試前置條件如初始化數(shù)據(jù)庫連接、獲取 Token、后置清理、以及測試數(shù)據(jù)的作用域管理都可以通過 Fixture 優(yōu)雅地實現(xiàn)。例如我們可以定義一個schema_validator的 Fixture在整個測試會話期間只加載一次 JSON Schema 文件避免重復(fù) IO 開銷。我的設(shè)計思路是將測試邏輯API 調(diào)用、業(yè)務(wù)斷言固化在測試函數(shù)中而將測試輸入數(shù)據(jù)和期望的 JSON Schema 定義通過parametrize以參數(shù)的形式“注入”到測試函數(shù)中。這樣測試函數(shù)本身變得非常干凈和穩(wěn)定數(shù)據(jù)的變動完全不影響代碼。2.2 Allure測試報告的藝術(shù)品測試執(zhí)行完了結(jié)果呢如果只是控制臺輸出PASS或FAIL對于排查問題、尤其是向非技術(shù)人員展示測試覆蓋率時是遠遠不夠的。Allure報告的價值體現(xiàn)在用例與數(shù)據(jù)的完美綁定在 Allure 報告中被parametrize參數(shù)化的用例每一組數(shù)據(jù)都會作為一個獨立的測試步驟展示并清晰標(biāo)明傳入的參數(shù)值。當(dāng)某個用例失敗時你能立刻看到是哪一個數(shù)據(jù)組合導(dǎo)致的失敗。豐富的附件支持我們可以在測試過程中輕松地將請求數(shù)據(jù)、響應(yīng)內(nèi)容、甚至是驗證失敗的詳細差異以文本或 JSON 格式附加到 Allure 報告中。這對于調(diào)試復(fù)雜的數(shù)據(jù)結(jié)構(gòu)問題至關(guān)重要。歷史趨勢與儀表盤Allure 可以聚合多次測試運行的結(jié)果生成歷史趨勢圖直觀展示測試穩(wěn)定性和健康度。在我們的方案中Allure 不僅是結(jié)果展示窗口更是問題定位的“第一現(xiàn)場”。我們會將每次驗證的 Schema 和實際響應(yīng)數(shù)據(jù)都附加到報告中做到有跡可循。2.3 JSON Schema聲明式的數(shù)據(jù)契約這是本方案中最具“智慧”的部分。傳統(tǒng)斷言是命令式的“檢查 A 字段等于 1B 字段是字符串C 字段是個數(shù)組且長度大于0”。而 JSON Schema 是聲明式的“我定義一份契約描述數(shù)據(jù)應(yīng)該長什么樣類型、必填、格式、枚舉、嵌套結(jié)構(gòu)等你來幫我檢查數(shù)據(jù)是否符合這份契約?!笔褂胘sonschema這個 Python 庫驗證變得異常簡單import jsonschema from jsonschema import validate # 定義schema schema { “type”: “object”, “properties”: { “code”: {“type”: “integer”, “const”: 0}, # code必須為整數(shù)且恒等于0 “message”: {“type”: “string”}, “data”: { “type”: “object”, “properties”: { “userId”: {“type”: “integer”, “minimum”: 1}, “userName”: {“type”: “string”, “pattern”: “^[a-zA-Z][a-zA-Z0-9_]{3,15}$”} # 正則匹配用戶名格式 }, “required”: [“userId”, “userName”] # data對象中必須包含這兩個字段 } }, “required”: [“code”, “message”, “data”] } # 驗證數(shù)據(jù) response_data {“code”: 0, “message”: “success”, “data”: {“userId”: 123, “userName”: “test_user”}} try: validate(instanceresponse_data, schemaschema) print(“數(shù)據(jù)驗證通過”) except jsonschema.exceptions.ValidationError as e: print(f“數(shù)據(jù)驗證失敗: {e.message}”)設(shè)計思路的核心轉(zhuǎn)變從“如何斷言”變?yōu)椤叭绾味x契約”。我們將每個接口的響應(yīng)契約Schema單獨維護成 JSON/YAML 文件與測試數(shù)據(jù)放在一起。測試函數(shù)只需要調(diào)用通用的驗證器而不需要關(guān)心具體字段。當(dāng)接口字段變更時我們只需更新對應(yīng)的 Schema 文件所有相關(guān)測試用例的驗證邏輯就自動同步更新了維護成本極低。3. 項目結(jié)構(gòu)設(shè)計與核心模塊解析一個清晰的項目結(jié)構(gòu)是保證可維護性的前提。下面是我推薦并經(jīng)過實踐的結(jié)構(gòu)project_root/ ├── tests/ # 測試用例目錄 │ ├── conftest.py # pytest 共享 fixture 定義 │ ├── test_api_user.py # 用戶相關(guān)接口測試 │ └── test_api_order.py # 訂單相關(guān)接口測試 ├── test_data/ # 測試數(shù)據(jù)與契約目錄 │ ├── schemas/ # JSON Schema 文件 │ │ ├── user_login_schema.json │ │ ├── user_info_schema.json │ │ └── order_create_schema.json │ └── cases/ # 參數(shù)化測試數(shù)據(jù)文件 │ ├── user_login_cases.yaml │ ├── user_info_cases.yaml │ └── order_create_cases.yaml ├── core/ # 核心業(yè)務(wù)封裝 │ ├── __init__.py │ ├── api_client.py # 封裝的 HTTP 請求客戶端 │ └── validator.py # 基于 jsonschema 的通用驗證器 ├── utils/ # 工具函數(shù) │ ├── data_loader.py # 加載 YAML/JSON 測試數(shù)據(jù) │ └── allure_attachment.py # Allure 報告附件相關(guān)工具 ├── pytest.ini # pytest 配置文件 ├── requirements.txt # 項目依賴 └── README.md3.1 核心模塊通用驗證器 (core/validator.py)這個模塊是整個自動驗證體系的大腦。它的職責(zé)是加載 Schema 并執(zhí)行驗證同時提供友好的錯誤信息和 Allure 附件。import json import jsonschema from jsonschema import Draft7Validator, ValidationError import allure from pathlib import Path class SchemaValidator: JSON Schema 驗證器封裝了驗證和報告邏輯 # 緩存已加載的schema避免重復(fù)讀取文件 _schema_cache {} def __init__(self, schema_dir: str “test_data/schemas”): self.schema_dir Path(schema_dir) def load_schema(self, schema_name: str) - dict: 根據(jù)名稱加載schema文件支持緩存 if schema_name not in self._schema_cache: schema_file self.schema_dir / f“{schema_name}.json” if not schema_file.exists(): raise FileNotFoundError(f“Schema 文件未找到: {schema_file}”) with open(schema_file, ‘r’, encoding‘utf-8’) as f: self._schema_cache[schema_name] json.load(f) return self._schema_cache[schema_name] def validate_response(self, response_data: dict, schema_name: str, description: str “響應(yīng)數(shù)據(jù)驗證”) - bool: 驗證響應(yīng)數(shù)據(jù)是否符合指定的schema并將結(jié)果附加到Allure報告。 Args: response_data: 待驗證的響應(yīng)數(shù)據(jù)字典 schema_name: schema文件名不含擴展名 description: 在Allure報告中顯示的描述 Returns: bool: 驗證是否通過 try: schema self.load_schema(schema_name) # 使用 Draft7Validator 可以提供更詳細的錯誤信息 validator Draft7Validator(schema) errors list(validator.iter_errors(response_data)) if errors: # 驗證失敗收集所有錯誤信息 error_messages [] for error in errors: # 錯誤路徑例如 ‘data.user.name’ path “-”.join([str(p) for p in error.path]) if error.path else “根節(jié)點” error_messages.append(f“路徑 [{path}]: {error.message}”) error_summary “\n”.join(error_messages) full_context ( f“ Schema 驗證失敗 \n” f“Schema文件: {schema_name}.json\n” f“驗證描述: {description}\n\n” f“詳細錯誤:\n{error_summary}\n\n” f“— 實際響應(yīng)數(shù)據(jù) —\n{json.dumps(response_data, indent2, ensure_asciiFalse)}\n\n” f“— 期望的 Schema —\n{json.dumps(schema, indent2, ensure_asciiFalse)}” ) # 將詳細的錯誤上下文附加為Allure的文本附件 allure.attach( bodyfull_context, namef“Schema驗證失敗-{schema_name}”, attachment_typeallure.attachment_type.TEXT ) # 也可以附加純凈的JSON方便查看 allure.attach( bodyjson.dumps(response_data, indent2, ensure_asciiFalse), name“實際響應(yīng)JSON”, attachment_typeallure.attachment_type.JSON ) raise AssertionError(f“響應(yīng)數(shù)據(jù)不符合 Schema ‘{schema_name}’ 規(guī)范。詳情請查看Allure報告附件。”) else: # 驗證成功也可以在報告中附加成功信息可選 allure.attach( bodyjson.dumps(response_data, indent2, ensure_asciiFalse), name“已驗證的響應(yīng)JSON”, attachment_typeallure.attachment_type.JSON ) return True except FileNotFoundError as e: allure.attach(bodystr(e), name“Schema文件缺失”, attachment_typeallure.attachment_type.TEXT) raise except json.JSONDecodeError as e: allure.attach(bodystr(e), name“JSON解析錯誤”, attachment_typeallure.attachment_type.TEXT) raise關(guān)鍵設(shè)計點緩存機制_schema_cache避免了在大量測試用例中重復(fù)讀取磁盤上的 Schema 文件顯著提升測試速度。詳盡的錯誤報告使用Draft7Validator.iter_errors()可以收集所有驗證錯誤而不是在第一個錯誤處就停止。這能讓我們在一次測試運行中看到所有不符合契約的地方。Allure 集成無論是成功還是失敗都將關(guān)鍵數(shù)據(jù)Schema、實際響應(yīng)、錯誤詳情附加到報告中。這相當(dāng)于為每個驗證點自動生成了“排查日志”定位問題效率極高。3.2 核心模塊測試數(shù)據(jù)加載器 (utils/data_loader.py)為了靈活支持 YAML 和 JSON 格式的測試數(shù)據(jù)我們需要一個通用的加載器。import yaml import json import os from pathlib import Path from typing import Any, Union def load_test_cases(file_path: Union[str, Path]) - list: 根據(jù)文件擴展名自動加載 YAML 或 JSON 格式的測試用例數(shù)據(jù)。 Args: file_path: 測試數(shù)據(jù)文件的路徑 Returns: list: 測試用例列表每個元素通常是一個字典代表一組參數(shù)。 Raises: ValueError: 文件格式不支持或文件內(nèi)容不是列表。 file_path Path(file_path) if not file_path.exists(): raise FileNotFoundError(f“測試數(shù)據(jù)文件不存在: {file_path}”) with open(file_path, ‘r’, encoding‘utf-8’) as f: if file_path.suffix.lower() in [‘.yaml’, ‘.yml’]: data yaml.safe_load(f) elif file_path.suffix.lower() ‘.json’: data json.load(f) else: raise ValueError(f“不支持的測試數(shù)據(jù)文件格式: {file_path.suffix}。請使用 .yaml, .yml 或 .json?!? # 確保加載的數(shù)據(jù)是一個列表便于參數(shù)化 if not isinstance(data, list): raise ValueError(f“測試數(shù)據(jù)文件 {file_path} 的根元素必須是列表 (list)但實際是 {type(data)}?!? return data為什么用 YAML對于編寫測試數(shù)據(jù)來說YAML 格式往往比 JSON 更友好。它支持注釋字符串不需要引號結(jié)構(gòu)通過縮進表示寫起來更簡潔直觀。例如# test_data/cases/user_login_cases.yaml - case_id: “l(fā)ogin_success” description: “使用正確的用戶名和密碼登錄” request_data: username: “test_user” password: “123456” expected_schema: “user_login_success_schema” # 對應(yīng) test_data/schemas/ 下的文件名 extra_assertions: # 除了Schema驗證外可能還有額外的業(yè)務(wù)斷言 - field: “data.token” expected_type: “string” min_length: 32 - case_id: “l(fā)ogin_fail_wrong_password” description: “使用錯誤密碼登錄” request_data: username: “test_user” password: “wrong” expected_schema: “user_login_fail_schema” expected_status_code: 4013.3 核心 Fixture 定義 (tests/conftest.py)conftest.py是 pytest 的“魔法”文件其中定義的 Fixture 可以被該目錄及其子目錄下的所有測試文件共享。import pytest from core.validator import SchemaValidator from core.api_client import ApiClient import allure pytest.fixture(scope“session”) def validator(): 返回一個全局的 Schema 驗證器實例整個測試會話只初始化一次。 return SchemaValidator(schema_dir“test_data/schemas”) pytest.fixture(scope“function”) # 默認就是function級別每個測試函數(shù)運行一次 def api_client(): 返回一個配置好的 API 請求客戶端實例。 client ApiClient(base_url“https://api.your-service.com”) # 這里可以添加全局的請求頭如認證信息 client.set_common_headers({“Content-Type”: “application/json”}) yield client # 使用yield實現(xiàn)測試后的清理工作如果需要 # 測試結(jié)束后可以在這里關(guān)閉會話或清理資源 client.close() pytest.hookimpl(tryfirstTrue, hookwrapperTrue) def pytest_runtest_makereport(item, call): pytest鉤子用于在測試執(zhí)行的不同階段獲取結(jié)果并動態(tài)附加信息到Allure。 例如可以在測試失敗時額外附加一些自定義的診斷信息。 outcome yield report outcome.get_result() # 如果測試失敗了并且我們有額外的失敗信息存儲在item中可以附加到Allure if report.when “call” and report.failed: # 這里只是一個示例你可以根據(jù)實際需要存儲和附加任何信息 if hasattr(item, “_test_failure_context”): allure.attach( bodyitem._test_failure_context, name“自定義失敗上下文”, attachment_typeallure.attachment_type.TEXT )4. 測試用例編寫實戰(zhàn)參數(shù)化與驗證的融合有了前面的基礎(chǔ)建設(shè)編寫實際的測試用例就變得非常清晰和高效了。我們以用戶登錄接口為例。首先定義登錄成功和失敗的 Schematest_data/schemas/user_login_success_schema.json{ “$schema”: “http://json-schema.org/draft-07/schema#”, “title”: “用戶登錄成功響應(yīng)”, “type”: “object”, “properties”: { “code”: { “type”: “integer”, “const”: 0, “description”: “狀態(tài)碼0表示成功” }, “message”: { “type”: “string”, “pattern”: “^success|成功$”, “description”: “成功消息” }, “data”: { “type”: “object”, “properties”: { “userId”: { “type”: “integer”, “minimum”: 1, “description”: “用戶ID” }, “username”: { “type”: “string”, “minLength”: 1, “description”: “用戶名” }, “token”: { “type”: “string”, “minLength”: 32, “description”: “認證令牌” }, “expiresIn”: { “type”: “integer”, “minimum”: 3600, “description”: “令牌過期時間秒” } }, “required”: [“userId”, “username”, “token”, “expiresIn”], “additionalProperties”: false, // 禁止出現(xiàn)未在properties中定義的字段 “description”: “響應(yīng)數(shù)據(jù)體” } }, “required”: [“code”, “message”, “data”], “additionalProperties”: false }test_data/schemas/user_login_fail_schema.json{ “$schema”: “http://json-schema.org/draft-07/schema#”, “title”: “用戶登錄失敗響應(yīng)”, “type”: “object”, “properties”: { “code”: { “type”: “integer”, “enum”: [401, 400], “description”: “錯誤狀態(tài)碼” }, “message”: { “type”: “string”, “minLength”: 1, “description”: “錯誤信息” }, “data”: { “type”: “null”, “description”: “失敗時數(shù)據(jù)通常為null” } }, “required”: [“code”, “message”, “data”], “additionalProperties”: false }接著編寫測試用例文件tests/test_api_user.pyimport pytest import allure from utils.data_loader import load_test_cases # 加載YAML格式的測試用例數(shù)據(jù) LOGIN_TEST_CASES load_test_cases(“test_data/cases/user_login_cases.yaml”) allure.epic(“用戶服務(wù)”) allure.feature(“用戶登錄”) class TestUserLogin: allure.story(“登錄功能驗證”) allure.title(“登錄測試 - {case[‘description’]}”) # 使用參數(shù)動態(tài)生成標(biāo)題 pytest.mark.parametrize(“case”, LOGIN_TEST_CASES, idslambda c: c[“case_id”]) def test_user_login(self, case, api_client, validator): 用戶登錄接口測試。 通過 pytest.mark.parametrize 實現(xiàn)數(shù)據(jù)驅(qū)動。 每組數(shù)據(jù)都會獨立運行一次該測試函數(shù)。 # 1. 打印當(dāng)前運行的用例信息可選便于調(diào)試 allure.dynamic.description(case.get(“description”, “”)) print(f“正在執(zhí)行用例: {case[‘case_id’]}”) # 2. 準(zhǔn)備請求數(shù)據(jù) request_data case[“request_data”] expected_schema_name case[“expected_schema”] # 3. 發(fā)送請求 with allure.step(“發(fā)送登錄請求”): # 使用封裝的api_client發(fā)送請求它會自動處理日志和基礎(chǔ)異常 response api_client.post(“/v1/user/login”, jsonrequest_data) # 將請求和響應(yīng)詳情附加到Allure報告 allure.attach( bodystr(request_data), name“請求數(shù)據(jù)”, attachment_typeallure.attachment_type.JSON ) allure.attach( bodyresponse.text, name“響應(yīng)原始數(shù)據(jù)”, attachment_typeallure.attachment_type.TEXT ) # 4. 驗證HTTP狀態(tài)碼如果用例中指定了 expected_status case.get(“expected_status_code”) if expected_status is not None: with allure.step(f“驗證HTTP狀態(tài)碼是否為{expected_status}”): assert response.status_code expected_status, \ f“狀態(tài)碼不符。期望: {expected_status}, 實際: {response.status_code}” # 5. 解析響應(yīng)JSON try: response_json response.json() except ValueError as e: allure.attach(bodyresponse.text, name“無效JSON響應(yīng)”, attachment_typeallure.attachment_type.TEXT) pytest.fail(f“響應(yīng)不是有效的JSON格式: {e}”) # 6. 使用Validator進行JSON Schema驗證核心步驟 with allure.step(f“使用Schema ‘{expected_schema_name}’ 驗證響應(yīng)數(shù)據(jù)結(jié)構(gòu)”): # 這里會觸發(fā)我們之前定義的validate_response方法自動處理驗證和報告 is_valid validator.validate_response( response_dataresponse_json, schema_nameexpected_schema_name, descriptionf“登錄用例 ‘{case[‘case_id’]}’ 響應(yīng)驗證” ) # validate_response在失敗時會拋出AssertionError所以如果執(zhí)行到這里說明驗證通過。 # 但為了邏輯清晰我們依然可以斷言一下。 assert is_valid, “響應(yīng)數(shù)據(jù)Schema驗證失敗詳情見Allure報告” # 7. 額外的業(yè)務(wù)邏輯斷言可選 # 有時Schema驗證了結(jié)構(gòu)但還需要驗證具體的業(yè)務(wù)值。 extra_assertions case.get(“extra_assertions”, []) for assertion in extra_assertions: field_path assertion[“field”] expected_type assertion.get(“expected_type”) # 這里可以實現(xiàn)一個簡單的字段提取和斷言邏輯 # 例如驗證 data.token 的長度 # 這部分可以根據(jù)項目需要擴展 # 8. 如果測試成功可以附加一些成功信息可選 allure.attach( bodyf“用例 ‘{case[‘case_id’]}’ 所有驗證均已通過?!? name“測試通過摘要”, attachment_typeallure.attachment_type.TEXT )這段代碼的精華解讀pytest.mark.parametrize(“case”, LOGIN_TEST_CASES, idslambda c: c[“case_id”])“case”參數(shù)名稱在測試函數(shù)中可以直接使用。LOGIN_TEST_CASES一個列表里面每個元素字典就是一組測試數(shù)據(jù)。idslambda c: c[“case_id”]為每一組參數(shù)化測試設(shè)置一個唯一的標(biāo)識符這個標(biāo)識符會顯示在 pytest 的輸出和 Allure 報告中讓你一眼就知道是哪個數(shù)據(jù)組合在運行或失敗。allure.dynamic裝飾器Allure 提供了動態(tài)設(shè)置測試特征的方法比如allure.title可以根據(jù)用例數(shù)據(jù)動態(tài)生成易讀的測試標(biāo)題allure.description可以添加詳細描述讓報告更具可讀性。with allure.step()這是一個上下文管理器用于在 Allure 報告中創(chuàng)建一個步驟。它將測試邏輯塊包裹起來在報告中會呈現(xiàn)為可折疊的步驟樹使得測試執(zhí)行過程一目了然非常利于排查是哪個步驟出了問題。驗證流程清晰的步驟分離——發(fā)送請求、檢查狀態(tài)碼、解析 JSON、Schema 驗證、額外斷言。每一步的失敗都有明確的錯誤信息和 Allure 附件形成了強大的問題定位能力。5. 運行測試與生成報告編寫完測試用例后如何運行并看到漂亮的報告呢5.1 運行測試在項目根目錄下使用 pytest 命令運行測試。這里有一些常用的參數(shù)# 運行所有測試 pytest # 運行特定文件或目錄 pytest tests/test_api_user.py # 運行帶有特定標(biāo)記的測試例如標(biāo)記為‘smoke’的冒煙測試 pytest -m smoke # 運行并輸出詳細日志 pytest -v # 在失敗時立即停止并進入PDB調(diào)試如果需要 pytest -x --pdb為了與 Allure 配合我們需要在運行測試時生成 Allure 所需的原始結(jié)果數(shù)據(jù)通常是一個allure-results目錄。# 運行測試并生成Allure結(jié)果數(shù)據(jù) pytest --alluredir./allure-results5.2 生成與查看 Allure 報告Allure 報告是一個獨立的服務(wù)。首先你需要安裝 Allure 命令行工具具體安裝方法請參考其官網(wǎng)。生成報告分為兩步從結(jié)果數(shù)據(jù)生成 HTML 報告allure generate ./allure-results -o ./allure-report --clean./allure-results上一步 pytest 生成的結(jié)果目錄。-o ./allure-report指定生成的 HTML 報告輸出目錄。--clean清空輸出目錄如果已存在。打開報告allure open ./allure-report這條命令會在你的默認瀏覽器中打開生成的 HTML 報告。報告亮點概覽頁可以看到測試套件的總體通過率、持續(xù)時間、趨勢圖。套件頁以樹形結(jié)構(gòu)展示所有測試類和方法被參數(shù)化的用例會展開顯示每個參數(shù)組合的結(jié)果。用例詳情頁點擊單個用例可以看到我們通過allure.step定義的步驟、通過allure.attach附加的請求/響應(yīng)數(shù)據(jù)、Schema 驗證詳情以及任何斷言失敗的信息。當(dāng) Schema 驗證失敗時我們附加的詳細錯誤上下文會直接顯示在這里你無需再去翻看日志文件。6. 高級技巧與避坑指南在實際項目中摸爬滾打總會遇到一些坑。這里分享幾個關(guān)鍵的經(jīng)驗和技巧。6.1 Schema 的設(shè)計與管理技巧使用$ref引用實現(xiàn)復(fù)用當(dāng)多個接口有相同的子結(jié)構(gòu)時比如分頁信息pageInfo不要重復(fù)定義。可以創(chuàng)建一個common_schemas.json文件然后在其他 Schema 中引用。// common_schemas.json { “definitions”: { “pagination”: { “type”: “object”, “properties”: { “page”: {“type”: “integer”, “minimum”: 1}, “size”: {“type”: “integer”, “minimum”: 1, “maximum”: 100}, “total”: {“type”: “integer”, “minimum”: 0} }, “required”: [“page”, “size”, “total”] } } } // user_list_schema.json { “$schema”: “http://json-schema.org/draft-07/schema#”, “type”: “object”, “properties”: { “code”: {“type”: “integer”, “const”: 0}, “data”: { “type”: “array”, “items”: {“$ref”: “#/definitions/user”} }, “pageInfo”: {“$ref”: “./common_schemas.json#/definitions/pagination”} }, “required”: [“code”, “data”, “pageInfo”] }使用jsonschema.RefResolver或在驗證時指定base_uri來解析這些引用。合理使用additionalProperties: false這是一個雙刃劍。設(shè)置為false可以嚴格限制響應(yīng)中不能出現(xiàn)未定義的字段有助于發(fā)現(xiàn)后端無意中返回的多余字段。但在接口演進初期或字段頻繁變動時可能會造成測試用例不必要的失敗。建議在穩(wěn)定期或?qū)涌谄跫s要求嚴格的場景下使用。為字段添加description在 Schema 中為每個屬性添加description字段。這不僅是良好的文檔一些工具如生成的 API 文檔也能利用它。當(dāng)驗證失敗時清晰的描述能幫你更快理解這個字段是干什么的。6.2 參數(shù)化數(shù)據(jù)的靈活運用動態(tài)生成測試數(shù)據(jù)有時測試數(shù)據(jù)不能完全寫死在文件里。例如注冊用戶需要一個唯一的用戶名。你可以在conftest.py中定義一個 Fixture 來動態(tài)生成數(shù)據(jù)然后在pytest.mark.parametrize中引用這個 Fixture。import pytest import uuid pytest.fixture def unique_username(): return f“test_user_{uuid.uuid4().hex[:8]}” # 在參數(shù)化中可以通過間接參數(shù)化(indirect)來使用fixture pytest.mark.parametrize(“username”, [“user1”, “user2”], indirectTrue) def test_something(username): print(username) # 這里會得到fixture生成的值更常見的做法是在加載 YAML 數(shù)據(jù)后用一個函數(shù)遍歷數(shù)據(jù)動態(tài)替換其中的占位符如{{timestamp}},{{random_string}}。處理依賴用例用例 B 需要用例 A 產(chǎn)生的數(shù)據(jù)如 Token。不要嘗試在參數(shù)化數(shù)據(jù)中硬編碼。應(yīng)該將獲取 Token 的邏輯封裝成一個 Fixture如user_token并設(shè)置適當(dāng)?shù)?scope如session或module。在測試類或測試函數(shù)中直接使用這個 Fixture。如果必須參數(shù)化可以考慮使用pytest的indirect參數(shù)化或者將依賴數(shù)據(jù)作為 Fixture 的返回值然后在測試函數(shù)中與其他參數(shù)化數(shù)據(jù)組合使用。但通常依賴關(guān)系強的測試更適合用 Fixture 管理前置狀態(tài)而不是純粹的數(shù)據(jù)驅(qū)動。6.3 Allure 報告的優(yōu)化定制報告外觀你可以創(chuàng)建一個categories.json文件對測試失敗的原因進行分類如產(chǎn)品缺陷、自動化腳本問題、環(huán)境問題等讓報告更有分析價值。環(huán)境信息在運行測試時通過環(huán)境變量或配置文件記錄測試環(huán)境如測試服務(wù)器地址、數(shù)據(jù)庫版本、測試執(zhí)行時間等并使用 Allure 的environment.properties文件或相關(guān)插件將其展示在報告首頁。歷史趨勢將每次運行的allure-results目錄歸檔并使用 Allure 的聚合功能生成歷史趨勢報告這對于監(jiān)控測試穩(wěn)定性和項目健康度非常有幫助。6.4 常見問題排查Schema 驗證錯誤信息不直觀jsonschema的默認錯誤信息有時比較技術(shù)化??梢跃帉懸粋€自定義的錯誤格式化函數(shù)將ValidationError對象轉(zhuǎn)換成更業(yè)務(wù)友好的中文描述再附加到 Allure 報告中。測試數(shù)據(jù)文件路徑錯誤在conftest.py或數(shù)據(jù)加載函數(shù)中使用Path(__file__).parent.parent等方式來構(gòu)建相對于項目根目錄的絕對路徑避免因執(zhí)行目錄不同導(dǎo)致的文件找不到問題。響應(yīng)時間過長導(dǎo)致測試不穩(wěn)定在api_client中設(shè)置合理的超時時間如timeout10并對慢請求進行記錄或告警??梢栽?Allure 步驟中記錄請求耗時。大量用例運行時內(nèi)存占用高如果測試數(shù)據(jù)量極大避免一次性將所有數(shù)據(jù)加載到內(nèi)存??梢钥紤]使用pytest的pytest.mark.parametrize結(jié)合生成器 (yield)或者分模塊、分文件執(zhí)行測試。這套pytest Allure JSON Schema的自動化測試方案通過將數(shù)據(jù)、邏輯、契約、報告解耦構(gòu)建了一個高度可維護、可擴展且極具洞察力的測試體系。它尤其適合接口數(shù)量多、數(shù)據(jù)結(jié)構(gòu)復(fù)雜、迭代速度快的項目。一開始搭建框架可能需要投入一些時間但一旦建成后續(xù)新增用例和維護契約的成本將大大降低測試的可靠性和價值也會顯著提升。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久婷婷五月综合激情国产| 99九九在线视频| 久久aaa| 婷婷五月丁香图片人人操| 五月婷婷综合精品| 夜夜天天久久婷婷| 99色综合网| 丁香六月成人网| 色婷婷综合丁香五月天| 91精品激情9| 亚洲操B| 五月色视频| 五月婷婷精品视频| 大香蕉五月婷婷丁香| 日韩精品一品二区三区的使用体验| 激情五月婷婷免费视频| 色综合色| 4438激情网| 99国产精品久久久久久久久久久 | 天天噜日日噜综合无码| 五月丁香啪啪网| 安息电影在线观看完整版| 9久久久| 无码 av电影| 色色色色色色色色综合网| 亚洲天天综合| 丁香九月久久| 青青热视频| 免费观看欧美成人AA片爱我多深| 伊人干综合| 色婷五月天综合网| 婷婷丁香色情五月天| 亚洲操逼网| 禁片二区| 五月激情综合性爱| 免费在线a| 少妇高潮呻吟A片免费看软件| 色婷婷久久综合久色综| 日本精品干| 香蕉网婷婷| 色色色999| 色色色在线观看| 99热这里只有精品1998| 日韩在线aaa| 人人色AV| 伊人久久丁香婷婷六月五月综合| 5月丁香六月情| 婷婷激情五月天激情在线| ztEJj| 亚州精品久久久久AV无码| 99热国产这里只有| 伊人超碰| 日韩十国产极品久久| 色婷婷最爱五月| sesesesezonghe| 欧美97色| 国产在线6| 超碰在线视屏| 色狠狠五月天| 天天操夜夜爽| 中文av网| 99久久婷婷| 亚洲婷婷91丁香| WWW.婷婷| 久久久久婷婷| 欧美日韩国产成人在线| 亚洲激情综合| 久久ww| 婷婷丁香18| 99久在线精品99re8热| 91一起操| 热思思九九| 中文字幕日产A片在线看| 婷婷激情综合网| 婷婷亚洲综合| 五月天另类小说久久小说网| 99ri在线观看视频| 思思热在线精品视频网站| 丁香五月成人论坛| 99国产精品久久久久久久久久久| 久/久精品99看9| 五月天综合网| 啪啪六月婷婷| 99精品在| 色五月综合网| 亚洲影院婷婷色| 99re久热只有精品6在线直播.com| 久久婷丁香五月| 久久精彩综合视频| 色婷视频| 无码人妻少妇色欲AV一区二区| 五月天色导航| 亚洲秘 无码一区二区三区妃光/1| 欧美三级巜人妻互换| 91919191919久久成人视频| 久久综合最新网址| 丁香五月亚洲激情婷婷射| 色婷婷成人影片| 丁香六月毛片| 99热偷拍| 色婷婷色综合激情91| 99热超碰在线| 亚洲激情另类| 超碰在线网站9| 婷婷99狠狠躁天天躁中文| 草草夜夜操| 精品乱码久久久久| 1024在线一区| 丁香六月婷婷综合激情欧美 | site:xiongshengzz.com| 婷婷五月丁香四射| henhencao国产在线| 欧美婷婷精品激情| 日韩aⅴ视频| 综合五月婷婷| 色婷婷激情四射视频| 综合激情五月丁香| 久久五月天婷婷| 五月久久丁香| 国产熟妇的荡欲午夜视频| 色五月婷婷青娱乐| 思思热99在线视频| 国产成人精品亚洲线观看| 激情五月婷婷啪啪| 深爱激情网五月天| 日日激情网| 日韩AAAAA| AV性爱网| 99 热国产在| 五月丁香六月激情综合| 色色色9 9 9| 五月色无码| 丁香六月激情四射| 国产无人区大片| 五月天精品综合在线| 99综合免费视频| 婷婷六月久久| 成年人看Va免费视频| 国产精品久久欧美久久一区| 综合综合色色| 99热啪啪| 五月天快乐开心激情网| 99国产精品久久久久久久久久久| 五月丁香六月婷婷网| 久久天天天| 色综合久久88色综合天天看| 色九月婷婷综合| 久久538| 日韩AC在线免费观看| 亚洲激情丁香五月基地| 五月婷婷综合激情小说| 夜夜干天天干| 人妻操日日| 狠色色狠网| 婷婷五月丁香五月基地| 五月伊人婷婷| 婷婷五月天中文字幕| 夜夜撸天天操| 影音先锋四区| 精品久久99| 综合xx网| 99碰碰碰| 久久六月天| 男人的天堂97| 九九九九这里只有精品| 国产热精品| 国产乱人偷精品人妻A片| se色99| 久久精彩视频| 婷婷六月天激情影院| 午夜精品久久久久久久爽| 综合五月亭亭9| 熟妇人妻中文字幕无码老熟妇| 五月情四婷婷| 久久日曰| 99热在线观看| 丁香五月 六月婷婷首页| 日日操夜夜擼| 色婷婷五月天成人网| 欧洲一区二区| 国外亚洲成AV人片在线观看| 九九热这里只有精品在线观看| 色五月av| 伊九九三级区| 婷婷激情五月呦呦| 超碰99热| 天天做天天爱天天玩夜夜爽| 伊人狠狠丁香婷婷综合尤物| 激情综合五| 欧美激情xxxXX| 猫咪伊人AV| 亚洲免费婷婷| 五月人人丁香婷婷五月人人丁香| 色综合色色色色| 99热国产| 中文字幕 中文字幕明步| 日韩AV片| 婷婷五月综合基地| 亚洲天堂久久| 九九无码| site:feetmall.com| 日本97在线| 亚洲中文字幕网| 五月天色婷婷成人| 五月丁香啪啪拍| 国产亚洲成人综合| 香蕉久久国产AV一区二区| 激情婷婷九月| 天天在线XXX| 桃色五月天| 大香蕉在线99热| 婷婷午夜天| 日日噜狠狠| 99热在线观看| 九九热最新| 这里只有精品9| 色碰干| 国产黄大片在线观看画质优化| 成人丁香五月天| 色欲人妻综合aaaaaaaa网| 97超级碰| 国产古装妇女野外A片| 91久久综合亚洲鲁鲁五月天| 情趣视频66| 五月6香色婷婷视频| 26uuu色五月| 九九精品热| 操操操AV| 99福利视频| 久草大| 激情婷婷五月天丁香| 六月婷婷综合| 丁香五月激情综合| 九九热精品在线| 丁香在线视频| 久狠狠| 五月丁香婷婷人体| 五月丁香花伦理电影| 国产日韩欧美| 五月丁香六月激情欧美综合| 97精品欧美91久久久久久久| 成人版视频在线观看| 婷婷激情丁香五月天综合| 91一起操| 日韩中文字幕| 91九色精品熟女内射| 天天色视频| 丁香六月毛片| 激情久久综合网| 久热视频A.| 亚洲99综合| 欧美成人日韩| 成人在线视频一区| 久久久久98| 色99超碰| 99人人操人人操人人精| 99九九在线精品热动漫| 亚洲无码成人| 激情久久久| 超碰久热| 久久成人性爱| 丁香五月天啪啪激情综合网| 婷婷五月天激情综合深爱激情 | 免费视频这里只有精品| 色五月丁香五月婷婷五月成人网| 色丁香五月婷婷综合久久| 色情终和网| 国产又粗又大又爽又黄| 99热10在线高清播放| 亚洲乱码日产精品BD| 青草青草视频2免费观看| 99热这里都是精品| 色婷婷激情五月天丁香| 精品99在线观看| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 色色色99韩| 欧美激情 日韩无码 婷婷 五月天 久久婷婷丁香五月一二三 | 超碰不卡在线| 天天碰夜夜操| av免费在线网站| 丁香五月777| 六月婷婷啪啪| WWW丁香五月| 婷婷五月丁香五月天| 丁香五月冃欧美| 成人丁香婷婷五月天| 91久久婷婷人人澡草 | 大香伊人久色| 久久色五月天| www,婷婷,com| 激情五月天99色| 成人五月丁香社区| 成人性爱精品视频| 爱操人妻| 婷婷综合丁香| 久久性爱视频| 亚洲色婷婷五月| 五月天婷婷AV| 99国产精品久久久久久久久久久| 六月婷婷AV| 色狠狠五月天| 影音先锋偷偷色男人站| 免费精品66| 开心五月深爱五月丁香五月激情五月| 99综合一区| 五月天综合在线| 丰滿爆乳一区二区三区| 国产婷婷色五月| 久久婷中文字幕| 激情五月丁香五月| 欧美色图45678| 天天婷婷操| 精品久久久人妻| 妇激情基地| 九九热在线视频,| 欧美五月婷婷| 综合久久激情久久| 婷婷91| 俺去啦综合网| 另类少妇人与禽zOZZ0性伦| 97偷拍在线视频| 综合色图区| 天天爽夜夜爽天天爽夜夜爽| 1024人妻| 丁香综合婷婷开心激情网| 丁香六月激情综合啪啪| 日韩黄色中文字幕| 久久99最新| 婷婷六月亚洲综合| 婷婷五月丁香99| 婷婷五月成人| 99热大香蕉| 婷婷六月天| 九九五月天| 狠狠va| 久久av电影| 久久艹99| 99.N在线视频| 久久天天| www.色色com| 97色伦另类图片小说视频 | 夜精品无码A片一区二区蜜桃| 激情婷婷九月| 天天搞天天爽| 一本九九色| 我爱va亚洲va52| www.夜夜操.com| 伦99热| 午夜日韩久久久网站| 婷婷五月天777| 超碰在线看| 久久在线大香蕉| 丁香五月激情啪啪| 日韩无码91| 久久这里只有精品1| 丁香六月婷| 久久这里只有精品久久| 激情六月婷婷| 月婷婷亚洲| 26UUU欧美| 伊久久婷婷| 久99热在线观看| 2013AV天堂| 色色色色色色色色色色色色色97| 色婷婷啪啪啪啪啪啪| 激情综合五| 精品国产a| 嫩草AV久久伊人妇女超级a| 国产成人精品亚洲线观看| 婷婷五月激情的图片| 五月丁香啪啪拍| 大香蕉综合| 精品99这里有| 婷婷97狠狠成人网站| 丁香婷婷综合五月天| 任你艹| 色网站99| 99热伊人综合| 色九月婷婷丁香| 99碰碰中文| 99爱精品| 婷婷六月丁香综合| 日本在线观看99| 九九热视频思思| 日韩AV在线免费| 五月婷婷啪啪啪啪| 内射在线CHINESE| 思思热久久婷婷五月天| 精品少妇人妻AV无码专区偷人| 国产性色蜜乳| 在线观看亚洲AV| 97久久人人操| 色婷婷丁香五月丁香| 天堂伊人干| 激情五月天www| 另类国产区| 九九这里是免费的视频5| 成人 在线 日韩| 五月丁香成人网| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 婷婷五月激情网站| 狠狠狠狠狠狠草| 九九在线视频| 婷婷色色播五月天| 人人性久久| 五月丁香啪啪网| 天天干天天爽天天操| 草榴视频网| 天天插天天爽| 狠狠综合网| Av性爱网| 99男人天堂| 99热综合| 精品色色| 日本九九热| 午夜成人网站在线观看| 超碰妻人人| 玖玖爱资源站| 噜噜色噜噜网| 五月天小说激情| 国产婷婷久久| 日韩黄色影院| 久久久久9999| 激情av在线| 天天操天天操综合| 五月婷婷激情刺激| 182TV大香蕉| 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲中文字幕av| 成人无码免费一区二区中文| AV大香蕉| www久久艹| 九色视频这里只有精品| 五月久久噜噜| 色色五月丁香| 丁香五月婷婷av| 狠狠插.com| 五月丁香激情综合网| 五月开心色| 日韩成人影片在线观看| Se.婷婷五月天| 婷婷成人av| 色综合丁香| 日本五月天一页| 五月色情网| 五月丁香六月婷婷姐| 99九九精品| 婷婷五月激情黄色| 狠狠第四色| 粉嫩av懂色av蜜臀av熟妇| 操一区| 九月丁香八月婷婷加勒比| 伊人碰碰婷婷| 色婷婷4| 五月丁香六月欧美综合网站| 婷婷激情五月综合丁香社| 激情五月天丁香| 久久色五月| caopeng97日韩| 人伦30P| 婷久久| 噜综合| 日本女人久久| 久久久精品婷婷五月天| 六月激情久久婷婷| 久久久久网站| 狠狠综合区| 特级片神马电影| 天天操夜夜操| 婷婷五月深情丁香深爱日韩| 久碰婷婷视频| 丁香五月婷婷99| 97色色在线视频| 99燥99日| 丁香婷婷六月激情综合| 精品少妇蜜臀91| 玖玖综合色区在线观看| 色色色天堂网| 久久激情五月婷婷| 久久网日本| 婷婷五月播| 久久与婷婷| 丁香五月婷婷啪啪啪| 操99| 99热在线观看精品免费| 天堂成人A片永久免费网站| 久久综合婷婷| 996er热| 综合久久高清| 婷婷的色色五月天| 精品人妻在线| 色婷婷五月综合在线| 性爱五月婷| 久久性爱视频| 婷婷丁香在线播放| 婷婷久久色| 性色99| 婷婷五月激情在线| 九九99视频| 色99久草在线| 久草婷婷网| 六月婷婷综合激情| 婷婷.com| 丁香五月婷婷综合激情哟哟哟| 五月丁综合在线观看| 亚洲在线成人| 操一区| 狠狠五月天婷婷激情网。| 99re6久热只有精品6在线直播| 91操女| 婷婷情爱五月天6| 欧美三日本三级少妇三99| 激情伊人五月天| 久久99最新| 伊人五月天久久| 婷婷色在线| 婷婷六月激情丁香| 五月天停停日日| 丁香九月激情| 五月天色不卡| 98毛片| 91九色欧美| 色一情一乱一伦一区二区三区| 激情开心五月天婷婷基地丁香社区| 五月婷婷导航| 北京熟妇搡BBBB搡BBBB| 久久99热这里只频精品6学生| 激情五月综亚网| 色。 日日日| 六月婷婷最新网址| 丁香五月综合网| 六月丁香婷婷五月| 婷婷丁香五月亚洲| 五月丁香婷婷基地| 天天色凹凸| 五月丁香六月日逼| www.夜夜操.com| 亚洲情欲| 26UUU精品一区二区Com| 欧美99热| 超碰国产AV| 影音先锋男人女人| 免费视频无码| 丁香成人五月天| 欧美日韩aaa| 亚洲色亚洲精品| 激情网站综合五月天| 九色视频91| 99视频网| 五月花婷婷在线精品视频| 国产三级片91| 超碰在线观看成人视| 激情五月婷婷丁香综合网| 色婷婷小说| 婷婷激情四射| 色婷五月天激情| 激情综合文学| 久久女人天堂| 国产日韩精品SUV| 丁香六月婷婷综合激情欧美| 99免费在线| www亚洲无码| 欧美三日本三级少妇三99| 日韩一级A片黄色| 丁香五月婷婷五月| 丁香五月婷婷色播艳门照| 婷色五月| 天天婷婷天天| 丁香五月激情澎湃一区| 丁香五月电影| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 久久久久久97| 色色色999| 96精品成人无码A片观看金桔 | 欧美成人精品A片免费一区99| 激情综合网五月| 成人网在线观看视频| 六月婷婷青青青视频| 99九无网码| 激情精品久久| 超碰色热| 99re6在线视频精品免费| 99r久久这里只有精品| 97成人视频| 天天射夜夜爽| 激情深愛五月視頻| 激情综合婷婷| 亚洲色图81p| 五月丁香成人视频| 亚洲国产网站| 五月天啪啪啪| 影院久久久| 五月丁香婷婷婷婷综合网| 色综合色| 伊人九九68| 五月天婷婷青青草| 婷婷六月丁综合| 丁香五月激情视频在线| 91a片爽| 丁香婷婷色五月天| 国产精品99久久久久久猫咪| 91啪啪| 久热这里有精品视频| 亚洲成人在线在线| 热99在线| 婷婷六月色开| 亚洲色就是色色色| 丁香五月偷拍| 色噜噜狠狠色综| 免费无码毛片一区二区A片| 少妇人妻凹凸视频| 射琪琪| 丁香六月天| 久热这里精品免费| 97人人操| 欧美叉叉叉BBB网站| 天天干天天干天天干天天干天| 99精品视频在线免费观看| 久久婷婷六月综合| 色婷婷狠狠色| 91狠狠综合久久| AA片在线观看视频在线播放| 五月婷亚洲精品| 精品五月视频婷婷在线观看| 牛牛澡牛牛爽| 五月婷婷色影院| 婷婷丁香五月天色区| 丁香五夜激情四射夜夜夜| 性色婷婷| 成人色色视频| AV九九| 丁香五月花影院| 人人97碰| 亚洲丁香五月| aⅤ79成人片| 丁香婷婷久久综合在线| 日韩999| 第五色婷婷| 欧洲亚洲欧洲99久久| 色五月婷婷91| 六月五月天婷婷涩播在线| 婷婷精品视频| 噜噜噜噜综合在线| 色另类五月天| www、丁香五月天| 四川BBB搡BBB爽爽视频| 亚洲天堂色色| 久久亚洲无码| 久8色色| 国产五月丁香在线| 五月停停丁香| 热的国产99热| 色婷久久| 看全色黄大色大片| 亚洲AV久久久久久久久久久久久久久久| 99热一区| 久久与婷婷| 天天天添天天操| 久久丁香五月婷婷| 日本婷婷在线| 日韩99视频| 激情电影五月婷婷| 成人无码髙潮喷水A片| 婷婷亚洲综合| 任你爽精品免费视频6| 青青草原福利在线| 丁香五月天啪啪激情综合网| 色欲Av五月天| 精品国产va久久久久久久| 大香蕉五月天婷婷| 色香蕉影院| 在线资源av-超碰中文在线-成人AV| 婷婷五月激情天| 丁香六月亚洲综合| 99这里只有精品在线观看| 538午夜激情| 婷婷月五天在线在线看| 激情综合五月天| 国产激情在线| 色久影院| 五月天激情四射网站| 色情五月天丁香社区| 月色色综合婷婷网| 五月天基地| 丁香五月天狠狠操| 99久久www| 182TV亚洲| 久久亚洲婷婷| 97色色-99久久| 97福利视频| 97人妻碰碰碰久| 综合五月婷婷| 欧美性丁香色色五月天综合爱爱| 婷婷天天舔| 综合激情网| 国产精品久久7777777精品无码| 九九碰九九爱97超碰| 丁香五月亚洲激情婷婷射| 女性自慰系列第五页| 色必久悠悠影院| 亚洲婷婷五月草久| 伊人五月天婷婷| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 久久九⑨| 久久色五月| 激情婷婷五月| 人人人人人人人人人草| 婷婷六月色情| 日本99在线| 91久久婷婷| 午夜丁香| 大香伊人婷婷影院| 国产熟女大叫受不了| 伊人激情啪啪| 狠狠色丁香婷婷综合久久97AV| 五月婷婷婷自由综合| 综合啪啪| 五月婷婷综合激情| 99@久久@99精品视频| 在线观看欧美| 久色姿源| 五月久久亚洲| 9l视频自拍9l九色成人| 九九视频在线观看视频6| 大香蕉欧美在线| 91精品91久久久中77777| 色。 日日日| 五月激情婷婷在线| 天天弄天天操| 秋霞丝袜啪啪啪| 丁香婷婷人妻| 免费亚洲婷婷| 在线观看国产高清视频免费网站| 97碰碰人人视频| 丁香六月啪啪| 99视频在线精品免费观看2| 96丁香六月婷婷蜜桃综合久久| 成人网在线观看视频| 五月天婷综合| 久久开心五月婷婷| 婷婷午夜| 97超美国视频在线观看| 久久婷婷色| 思思热久久婷婷五月天| 久99| 欧美久久网| 亚洲激情免费视频| 九九色影院| 激情综合网站| 久久欧洲综合网| 79精品视频在线观看,| 777久久久| 亚洲色情一区二区三区四区| 97人人做| 欧美色频| 9一精品视频观看| 色久播播| 99热 在线观看| 五月天激情无码| 五月天综合色| 热久久66| 亚洲精品99| 婷婷五月深情丁香深爱日韩| 色婷婷五月天不卡| 色五月激情五月| 五月天堂色| 五月亭亭激情综合| 国产成人+综合亚洲+天堂| 99色五月| 襙逼网| 婷婷伊人綜合中文字幕| 午夜丁香综合婷婷| 伊人网色婷婷五月天| 99精品视频免费在线播放| 色色色无码| 婷婷五月婷婷| 噜噜网免费视频| 九九色婷| 婷婷放心五日爱| 99久在线观看| 中美日韩成人在线| 午夜婷婷久久| 999激情视频| 五月亭亭直播| 97久操| 欧美xx激情视频在线观看| 最近中文字幕2019视频1| 色色色在线免费视频| 九九热婷婷| 色婷婷日本| 日本久久爽| 九色综合网| 免费成人va| 亚洲五月婷婷| 国产99热| 二色av| 婷婷国产综合| 色色热| www.精品99| se99视频| 久综合4| 99热在线这里| 九九色情网五月天| 色婷婷综合影院| 国产成人AV在线播放| 久热亚洲| 亚洲成人在线播放| 婷婷五月在线观看| 99只有这里是精品| 日本网站久久| 久99热在线观看| 久超超碰| 丁香五月天色婷婷| 久久婷婷五月草视频| 精品成人在线| 久久久天天啊| 丁香色六月婷婷| 俺也去色| 精品免费99| 五月婷婷狠狠久久| av九九| 无码少妇高潮喷水A片免费| 日韩啊啊啊| 欧美日韩成人在线观看| 五月婷婷中文字幕| 五月色网| 五月丁香婷婷在线综合蜜桃| ou洲色吧| www.99色在线| 91se视频| 色欲五月婷婷| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 大香蕉婷婷久久| 九九色精品| 九九亚洲| 丁香六月婷婷开心婷婷网| 色情综合网| 丁香五月 综合| 日本在线视频播放91| 色色五月天婷婷丁香| 五月婷婷之六月丁香| 99er久久| 四月丁香五月婷婷久久| 日本丁香五月| 久婷自拍视频| 天天日天天做天天操| www.婷婷| 五月丁香久久久| 超碰精品在线| 欧美一级毛卡片无码| 激情综合网激情五月婷婷| 五月停停直播| 色综合久久88色综合天天| 99精品偷自拍| 婷婷狠狠干| 日韩乱轮AV| 国产精品黑丝| 99爱视频精品在线观看| 99热这里只有精品3| 成人做爰A片免费看网站找不到了| 丁香五月777| 深爱五月日韩| 五月婷婷久草| 婷婷五月天综合蜜桃| 五月丁香综合网| 99久操| 色婷狠狠| 婷婷五月无码| 天天色综网| 超碰A V在线| 天天五月天综合网址| 色99久草在线| 色狠狠五月天| 操一区| 色欲天天综合网| 色五月在线播放| 狠狠色丁香综合| 九九久久精品| 久久久久综合激动五月天| www.99视频| 99久热这里有精品| 成人短视频在线观看| 成人AV网站在线| 亚洲综合草草| 日日爽夜夜爽| 亚洲区在线| 婷婷综合激情| 狠狠色噜噜狠狠狠狠综合| 色婷婷亚洲综合av| 激情婷婷丁香五月| 久9精品视频在线| 超碰免费成人网站| 色婷婷大香蕉| av色色国产| 5月丁香啪啪啪| 六月丁香婷| 91五月天| 色婷婷丁香五月天在线观看| 五月丁香六月综合情在线观看 | 深爱激情69热| 九九色大香蕉| 五月天色视频| www.色婷婷.com| 五月色丁香激情| 日本的α片xxxwww| www.亚洲激情| 欧美视频五区| 色墦五月丁香| 99ri国产精品| 97久久超碰| 九九热AV| 国产精品国产| 91九色白丝| 99性爱视频| 99在线看片| 色色操| 99久久婷婷| 国产午夜精品一区二区| 亚洲色五月婷婷| 丁香青青五月天| 大婷婷色呦呦噜噜色呦呦噜噜| 99玖玖人人| 99色视频| 五月天最新网| 五月丁香九九九综合| 天天综合激情| 日本九九网| 婷婷丁香亚洲五月天| 婷婷酒色网| 激情婷婷视频在线| 婷婷五月天综合久久日| 99ER热精品视频| 免费看欧美成人A片无码| av大香蕉| 人妻体体内射精一区二区 | 日本色色网| 91碰碰碰| 综合色99| 欧美成人精品三区综合A片| 9久精品| 少妇被下春药玩弄A片| 疯狂做受XXXX高潮A片| 午夜不卡久久精品无码免费 | 五月婷婷激情综合| 六月婷婷五月天| 少妇性按摩无码中文A片| 乱精品一区字幕二区| 婷婷大香焦| 亚洲色无码| 亚洲视频一区| 天天色综合网吨吧| 另类视屏| 91在线人| 91无码一起草| 99性视频| www国产亚洲色婷婷com| 爆乳熟女一区二区三区爆乳| 午夜少妇在线观看视频| 99操碰| 成人永久免费视频在线观看| 极品五月天| 思思综合热| 狠狠操在线视频| 天天爱天天操| 在线日韩视频| 精品国婬伦V无码久久久| 啪啪激情综合| 婷婷六月伊人| 91viP在线看| 三日本无码| 91主播在线| 91综合国免费久入| 天天爱天天做综合| 影视av久久久噜噜噜噜噜三级| 欧洲色| 丁香五月六月综合激情| 久草xx性爱视频| 99热.com| 九九精品热播| 91wwmm导航| 国产成人一区二区三区在线观看| 亚洲XX网| 丁香五月综合狠狠| 狠狠爱激情网| 久久久久久五月天| 国产特级毛片AAAAAAA高清| 97碰超级人人看| 久久婷婷人人| 六月激情丁香一道本7777| 婷婷五月激情在线| 五月色情| 天天干肏夜夜| 亚洲无AV在线中文字幕| 俺去也在线官网| 99热在线观看这里只有精品| 国产日批视频| 五月噜噜| 五月丁香婷婷色| 亚洲成人九九九| AV无码免费| 亚洲五月丁香综合网| 日韩小视频在线99| 91综合国免费久入| 日韩在线看AV| 成人五月天综合网| 日本女人久久| 九九九九中文字幕| 色五月六月| 噜噜狠狠色综合久| 九九热在线视频观看| 国产JK精品白丝AV在线观看| 五月婷婷亚洲综合网| 国产精品电| 99热思思| 六月丁香成人| 婷婷在线中文字幕| 天天天干夜夜夜操| 五月婷婷综合影院| 色色色色色爱| 婷婷五月天涩涩| 久久免费操| 日 日干 日日做| 亚洲人人操| 狠狠穞A片一區二區三區| 婷婷五月激情在线| 亚洲一级色电影| 丁香五月婷婷在线| 国产九月婷婷| 久久五月婷婷开心网| 九九热99热| 天天舔天天| 大香蕉久热| jiZZdr| 久久久久久久久久久44| 亚洲性爱电影| 综合网啪| 五月色色色| 九九99在线免费在线观看视频| 久热大香蕉| 五月天激情综合| 激情五月五月五月婷婷| 香蕉久久国产AV一区二区| 激情五月天激情网| 日日夜夜天天| 3p日韩网站视频| 激情玖玖sh| 国产视频福利| 久久99日本精品视频免费观看| 26UUU精品一区二区| 婷婷五月婷婷| 色情综合| 五月色网| 免費亭亭成人| 婷婷不卡基地| 99热亚洲| sS丁香五月婷婷| 99热 日韩| 99热99热在线| 超碰在线人人| 六月丁香五月婷婷| 情婷婷五月天| 国产肏屄大片| 六月丁香啪啪| 亭亭五月天成人| 婷婷五月色影视先锋| 色欲天天综合网| 久久激情网| 色婷婷成人丁香| 1024在线视频| 激情 婷婷| 激情深爱综合| 亚洲婷婷丁香五月| 天天狠狠夜夜狠狠2023| 天天成人丁香美女AV| 激情五月份婷婷| 精品人妻伦九区久久AAA片| 欧美α√| 久久综合热17c| 丁香九月激情在线视频| 99热这里是精品| 99爱免费视频在线观看| 91九色视频| 国产精品扒开腿做爽爽爽A片唱戏 青青草国产亚洲精品久久 | 色五月五月天| 色吊丝永久访问网址| www色婷婷| 99久久大片| 天堂婷婷五月在线| 97香蕉人人在线观看| 疯狂做受XXXX高潮A片| 丁香婷婷色九月| 丁香五月六月激情| 狠狠色色综合| 全部老头和老太XXXXX| 五月停停999| 森林影视大全,最好看的2019年视频 | 香蕉乱插| 另类少妇人与禽zOZZ0性伦| 丁香五月激情啪啪| 天天综合天天做天天综合| 六月婷婷综合久久| 丁香五月婷婷综合激情啪啪啪| 日本三级大片| 99热这里都是精品| 狠狠干青青草| WWW丁香五月| 色色五月婷| 人操人人| 级人人91| www.99在线| av九九| 五月激情婷婷播播开心| www.色五月.com| XXXX岛国| 九九热超碰| 国产美女视频久| 97色色综合| 伊人9999| 色五月婷婷天天干| 婷婷五月天成人在线视频| 婷婷综合一二三| 日本色色影院| 夜色热久| 狠狠ri| AA片在线观看视频在线播放 | 亚洲超碰在线| 久久99热这里只有| 国产亚洲色婷婷久久99精品91| 六月婷婷色综合| 99国产这里只有精品| 97色伦另类图片小说视频 | 丁香五月激情婷婷婷婷在线观看| 99热777| 99re思思在线视频| 思思视频精品| 婷婷五月天最新综合你懂的| 色五月激情网| 国产免费一区二区在线A片视频| 国产综合81p| 在线视频99| 色五月婷婷激情基地| 久久天堂加勒比| 美女91一起草| 久久9热| 五月丁香天堂| 久久日曰| 超级碰碰碰97免费| 丁香五月婷婷Av| 亚洲第一成人无码A片| 五月丁香色婷婷久久| 激情综合色网| 无码动漫AV| 国产精品国产| 亚洲另类婷婷综合| 另类图片天天影视在线观看| 人人干人人干骚美女| 久久这里在精品视频| 日韩AAA| 伊人在线婷婷草| 99热这里只有精品最新网址| 五月激情基地| 人人肏逼视频在线一区二区| 97热九九| 久久大香蕉同僚| 色色色色色日韩午夜激情 | 九九亚洲| 99在线精品免费视频| 在线精品97| 97性高潮久久久| 婷婷射丁香| 色情婷婷| 丁香五月在线观看综合| 久久er99热精品一区二区| 激情内射p| 五月激情视频| 婷婷五月成年人| 色99在线视频| www.色五月.com| 久久只有精| 99成人精品六| 中文字幕 久久9999| 五月天色婷婷伊人网| 伊人婷婷大香蕉| 五月丁香激情综合| 超碰婷婷色| 色九九综合热99| 成人AV在线电影| 国产成人va在线| 婷婷五月天另类网站| 超碰免费成人| 1024操逼| 第四色网婷婷| 在线五月色播| dingxiangtingtingliuyue| 黄网免费观看| 久久久久久久11111111111| 2013AV天堂| 六月欧美综合色情| 丁香五月婷婷色播艳门照| 99爱在线精品视频免费观看| 337p午夜影院| 日韩色色小视频| 天天色99| 久久久久网站| 亚洲成人色五月婷婷综合| 婷婷射丁香| 五月天激情影院| 中文字幕不卡网站| 亚洲综合久| 这里只有精品9| 色婷婷导航| 碰碰碰97免费精彩视频| 亚洲在线激情婷婷五月| 狠狠草狠狠草| A短视频免费在线观看| 五月婷婷久久综合| 五月丁香六月婷婷综合网缴情| 婷婷五月天激情小说| 欧美色必爱| 五月天激情国产综合婷婷婷| 狠狠草网| 丁香五月日本| 天天狠天天叉| 天天日日| 国产99热| 黄色短视频在线观看| 9l视频自拍9l九色9l成人| 国产日批视频免费播放| 婷婷免费成人视频| 婷婷丁香五月色| 婷婷六月激情综合| 97香蕉人人在线观看| 色五月婷激情| 中文成人在线| 欧美五月婷婷| 天天天天操| 六月婷婷日| 深爱激情九九五月天 | 丁香六月成人| 97色片| 五月天激情视频| 国产免费av网站| 欧美成人猛片AAAAAAA| 色婷婷在线播放| 亚洲性色XXXXX| 精品9久| 亚洲精品操一操、噜一噜、摸一摸、爽 | Www.se.久久| 亚洲久久婷婷| 婷婷的久久网站| 久久九九中文字幕| 亚洲无码yw| www亚洲无码| 色色网站在线| 人妻六月天| 思思热国产在线| 一起草AV入口| 激情五月激情综合网一级丸片| 久久久性爱视频| 六月丁香激情| 五月天婷婷丁香导航| 久久香视频| 欧美色性色好| 入口五月婷婷六月香| 婷婷狠狠操| 国产肏屄大片|