当前位置: 首页 > news >正文

四十、【高级特性篇】接口用例数据驱动:引入随机变量与动态数据生成

四十、【高级特性篇】接口用例数据驱动:引入随机变量与动态数据生成

    • 前言
      • 准备工作
      • 第一部分:后端数据模型与 API 调整
        • 1. 升级 `TestCase` 模型
        • 2. 生成并应用数据库迁移
        • 3. 更新 `TestCaseSerializer`
      • 第二部分:后端测试执行器强化
        • 1. 修改 `execute_api_test_case` 函数
        • 2. Celery 任务 `execute_test_plan_task` 保持不变
      • 第三部分:前端交互界面改造
        • 1. 更新 `api/testcase.ts` 类型定义
        • 2. 大改 `TestCaseEditView.vue`
      • 第四部分:全面测试与验证
    • 总结

前言

一个测试用例可能需要在不同的数据场景下执行,或者需要使用随机数据来模拟真实场景。例如,测试注册接口时需要生成一个不重复的用户名或手机号;测试查询接口时,可能需要一个随机的日期范围。

本文目标:

TestCaseEditView.vue (测试用例编辑页面) 中,为“接口测试”类型用例添加一个“随机变量”配置区域。用户可以在此定义要生成的随机变量,包括变量名、数据类型(如字符串、数字、手机号、UUID、日期时间等)以及类型相关的配置(如字符串长度、数字范围、日期格式)。这些随机变量将通过 { {variable_name}} 格式引用在请求中,并在执行时自动生成和注入。
在这里插入图片描述

准备工作

  1. 前端项目就绪: test-platform/frontend 项目可以正常运行 (npm run dev)。
  2. 后端 API 运行中: Django 后端服务运行。
  3. TestCase 模型已存在并支持 extract_params 字段。
  4. requests 库和 jsonpath-ng 已安装在后端虚拟环境。
  5. Celery 和 Redis 已配置并运行。
  6. Element Plus 集成完毕。

第一部分:后端数据模型与 API 调整

1. 升级 TestCase 模型

打开 test-platform/api/models.py
TestCase 模型中,新增 random_variables 字段。
在这里插入图片描述

# test-platform/api/models.py
# ... (其他导入和模型定义) ...class TestCase(BaseModel):# ... (原有字段,如 module, priority, case_type, request_method, request_url, assertions, extract_params 等) ...# --- 新增:随机变量生成规则 ---random_variables = models.TextField(null=True, blank=True, default='[]', verbose_name="随机变量生成规则 (JSON格式)")# ...
2. 生成并应用数据库迁移
# 在 test-platform 目录下
python manage.py makemigrations api
python manage.py migrate api

在这里插入图片描述

3. 更新 TestCaseSerializer

打开 test-platform/api/serializers.py,将新的 random_variables 字段添加到 TestCaseSerializerfields 列表中。
在这里插入图片描述

# test-platform/api/serializers.py
# ... (其他导入和 Serializer) ...class TestCaseSerializer(serializers.ModelSerializer):# ... (原有字段定义) ...class Meta:model = TestCasefields = ['id', 'name', 'description', 'module', 'module_name', 'project_id', 'project_name','priority', 'priority_display','request_method', 'request_url', 'request_headers', 'request_body', 'assertions', 'extract_params',  'random_variables', # 新增字段'precondition', 'steps_text', 'expected_result','case_type', 'case_type_display', 'maintainer','create_time', 'update_time']# ... (extra_kwargs 保持不变) ...

第二部分:后端测试执行器强化

改造测试执行器,使其支持随机变量的生成和注入。

1. 修改 execute_api_test_case 函数

打开 test-platform/api/services/test_executor.py,新增随机变量生成逻辑。

# test-platform/api/services/test_executor.py
import requests
import json
import time
import urllib.parse
import re
import random
import string
from datetime import datetime, timedelta
from typing import Dict, List, Any, Tuple, Optionalfrom ..models import TestCase, Environment # 确保导入 TestCase, Environment# ... (断言类型和 jsonpath_ng 导入保持不变) ...def generate_random_value(rule: Dict[str, Any]) -> Any:"""根据规则生成随机值"""var_type = rule.get('type')config = rule.get('config', {})if var_type == 'string':length = config.get('length', 8)chars = string.ascii_letters + string.digitsreturn ''.join(random.choice(chars) for _ in range(length))elif var_type == 'int':min_val = config.get('min', 0)max_val = config.get('max', 100)return random.randint(min_val, max_val)elif var_type == 'float':min_val = config.get('min', 0.0)max_val = config.get('max', 100.0)decimal_places = config.get('decimal_places', 2)return round(random.uniform(min_val, max_val), decimal_places)elif var_type == 'phone': # 简单模拟中国大陆手机号prefix = random.choice(['13', '15', '17', '18', '19']) # 更多号段可添加suffix = ''.join(random.choice(string.digits) for _ in range(9))return f"{prefix}{suffix}"elif var_type == 'email':username_len = config.get('username_length', 8)domain = config.get('domain', 'example.com')username_chars = string.ascii_letters + string.digitsusername = ''.join(random.choice(username_chars) for _ in range(username_len))return f"{username}@{domain}"elif var_type == 'uuid':import uuid # 导入uuid模块return str(uuid.uuid4())elif var_type == 'datetime':# 默认生成当前附近时间,格式可配置format_str = config.get('format', '%Y-%m-%d %H:%M:%S')start_date = datetime.now() - timedelta(days=config.get('days_ago', 30))end_date = datetime.now() + timedelta(days=config.get('days_ahead', 30))random_seconds = random.randint(0, int((end_date - start_date).total_seconds()))random_datetime = start_date + timedelta(seconds=random_seconds)return random_datetime.strftime(format_str)elif var_type == 'date':format_str = config.get('format', '%Y-%m-%d')start_date = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(days=config.get('days_ago', 30))end_date = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=config.get('days_ahead', 30))random_days = random.randint(0, (end_date - start_date).days)random_date = start_date + timedelta(days=random_days)return random_date.strftime(format_str)# 可以添加更多类型,例如 IP 地址、身份证号等return Nonedef execute_api_test_case(test_case: TestCase,environment: Optional[Environment] = None,context_variables: Optional[Dict[str, Any]] = None
) -> Dict[str, Any]:"""执行单个 API 测试用例并返回结果字典。可以传入 environment 对象,用于动态替换 base_url 和添加公共请求头。context_variables: 上下文变量字典,用于参数注入和提取"""if context_variables is None:context_variables = {}result = {"status": "ERROR","request_data": {},"response_data": {},"assertion_results": [],"error_message": None,"duration": 0.0,"context_variables": context_variables  # 返回更新后的上下文变量}start_time = time.time(
http://www.dtcms.com/a/317636.html

相关文章:

  • 生成式模型 ?判别式模型?用【猫狗分类器】帮助理解!
  • 【网络安全】入侵检测系统 Suricata 概述 | IDS
  • 2025年大语言模型与多模态生成工具全景指南(V2.0)
  • PyCharm vs. VSCode 到底哪个更好用
  • 5个数据库 存储系统精选 | C/C++ 项目深度解析
  • 支持向量机(SVM)算法依赖的数学知识详解
  • 深度模拟用户行为:用Playwright爬取B站弹幕与评论数据
  • 使用Java爬取xxx律师协会网站上公开的律所信息并导出到Excel
  • 服务器——“查询不到显卡驱动,且输入nvidia-smi报错”的解决办法
  • 时序数据库的发展现状与未来趋势
  • 百度智能云给“数字人”发工牌
  • Unix/Linux 系统编程中用于管理信号处理行为的核心概念或模型
  • QT自定义控件
  • InnoDB 存储引擎对 MVCC 的实现详解
  • [Linux]学习笔记系列 -- [arm][debug]
  • QtMqtt库的编译以及安装
  • 导入Excel打印
  • Excel将整列值转换为字符串
  • 面向流程和产品的安全档案论证方法
  • C语言access函数详解:文件访问权限检查的利器
  • 在WPS或Word中,实现换行不换段落
  • 浙大高飞团队新作:提出层级式探索框架,让「地空双模」机器人自主决策“飞”或“走”
  • 深入理解 C++ 中的stdpriority_queue:从原理到实战的高效优先级管理
  • 并发编程常见问题排查与解决:从死锁到线程竞争的实战指南
  • #3:Maven进阶与私服搭建
  • 自然语言处理基础—(1)
  • MyBatis核心配置深度解析:从XML到映射的完整技术指南
  • UI测试平台TestComplete的AI视觉引擎技术解析
  • 脑洞大开——AI流程图如何改变思维?
  • dify之智能旅游系统应用