测试数据准备难题?一个Dify工作流,让你告别“巧妇难为无米之炊”

news/2025/10/29 15:12:48/文章来源:https://www.cnblogs.com/hogwarts/p/19174489

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集

在软件测试领域,我们经常面临“巧妇难为无米之炊”的困境——再完善的测试用例,没有合适的测试数据也是徒劳。据统计,测试工程师平均花费40%的工作时间在测试数据准备上,而其中60%的测试阻塞都是由数据问题引起的。本文将分享如何利用Dify工作流平台,构建一个智能化的测试数据工厂,彻底解决这一行业痛点。

一、测试数据准备的现状与痛点
传统测试数据准备的困境
手动造数的典型场景:

传统手动创建测试数据的方式

def create_manual_test_data():
# 用户数据
users = [
{"name": "张三", "email": "zhangsan@test.com", "phone": "13800138001"},
{"name": "李四", "email": "lisi@test.com", "phone": "13800138002"},
# ... 需要手动想几十个这样的测试数据
]

# 订单数据
orders = [{"order_id": "ORDER001", "amount": 100.50, "status": "paid"},{"order_id": "ORDER002", "amount": 200.00, "status": "pending"},# ... 更多手动创建的数据
]return users, orders

我们团队遇到的具体问题:

数据一致性难保证

用户ID在不同系统间不匹配
业务逻辑关联数据难以手动构造
外键约束导致数据插入失败
数据覆盖面不足

边界条件数据经常遗漏
异常场景数据难以构造
性能测试需要的大数据量难以生成
维护成本高昂

业务规则变更需要重造所有数据
环境切换需要重新准备数据
数据清理和重置耗时严重
痛点数据分析
image

二、Dify测试数据工厂:整体架构设计
解决方案概览
我们构建的Dify测试数据工厂采用分层架构,实现测试数据的智能化生成和管理:

364a3028-49a2-4478-96db-72d41b5d48b2

核心设计理念

  1. 声明式数据需求描述

传统方式:具体指定每个字段

{"name":"测试用户","age":25}

Dify方式:声明数据需求和规则

我需要:
-50个用户数据,年龄在18-60岁均匀分布
-包含正常用户、VIP用户、黑名单用户
-手机号符合中国运营商规则
-邮箱地址有效可接收邮件
2. 智能数据生成引擎

基于大模型理解业务语义
自动识别数据关联关系
支持复杂业务规则约束
3. 数据生命周期管理

自动化数据准备
智能数据清理
数据版本控制
三、环境搭建:快速部署Dify数据工厂
Dify平台部署

使用Docker Compose快速部署

git clone https://github.com/langgenius/dify
cd dify/docker

配置数据工厂专用环境变量

cat > .env << EOF
DIFY_API_KEYS=your_data_factory_key
DEEPSEEK_API_KEY=your_deepseek_key
TEST_DATABASE_URL=postgresql://test:test@test-db:5432/test_data
REDIS_URL=redis://redis:6379
DATA_RETENTION_DAYS=30
EOF

docker-compose up -d
测试数据库配置
-- 测试数据工厂专用数据库
CREATEDATABASE test_data_factory;

-- 创建数据模板表
CREATETABLE data_templates (
idSERIAL PRIMARY KEY,
nameVARCHAR(100) NOTNULL,
schema_def JSONB NOTNULL,
business_rules JSONB,
created_at TIMESTAMPDEFAULTNOW()
);

-- 创建生成记录表
CREATETABLE generation_records (
idSERIAL PRIMARY KEY,
template_id INTEGERREFERENCES data_templates(id),
data_count INTEGERNOTNULL,
generated_data JSONB NOTNULL,
created_at TIMESTAMPDEFAULTNOW()
);
四、核心工作流搭建:智能测试数据生成
工作流整体设计
我们的测试数据生成工作流包含以下核心节点:

[数据需求分析] → [数据模式识别] → [生成策略选择] →
[数据批量生成] → [质量校验] → [数据存储] → [结果反馈]
节点1:数据需求智能解析
自然语言输入配置:

节点类型: 文本输入
配置:
占位符: "请描述您的测试数据需求..."
示例: |
需要生成100个电商用户测试数据,要求:
- 包含普通用户和VIP用户
- 用户年龄在18-65岁之间
- 地理位置分布在不同省份
- 包含注册时间和最后登录时间
- 部分用户需要有订单数据
需求解析提示词:

你是一个测试数据需求分析师,请将自然语言描述的数据需求转化为结构化的数据规范。

输入需求:

输出要求:
请按照以下JSON格式输出:

{
"data_type": "数据类型",
"data_count": 数据量,
"fields": [
{
"field_name": "字段名",
"data_type": "字段类型",
"constraints": {
"required": true/false,
"min": 最小值,
"max": 最大值,
"pattern": "正则表达式",
"enum": ["枚举值1", "枚举值2"]
},
"generation_strategy": "生成策略"
}
],
"business_rules": ["业务规则1", "业务规则2"],
"data_relationships": [
{
"source_field": "字段A",
"target_field": "字段B",
"relationship": "一对一/一对多"
}
]
}

请确保识别出所有的业务约束和数据关联关系。
节点2:数据模式识别与策略选择
数据模式识别代码:

class DataPatternRecognizer:
def analyze_data_patterns(self, structured_requirements):
"""分析数据模式并选择生成策略"""
patterns = []

    # 识别基础数据类型模式patterns.extend(self.identify_basic_patterns(structured_requirements))# 识别业务规则模式patterns.extend(self.identify_business_patterns(structured_requirements))# 识别关联关系模式patterns.extend(self.identify_relationship_patterns(structured_requirements))return self.select_generation_strategy(patterns)def identify_basic_patterns(self, requirements):"""识别基础数据模式"""patterns = []for field in requirements['fields']:if field['data_type'] == 'string':if'email'in field['field_name']:patterns.append({'type': 'email', 'strategy': 'faker_email'})elif'phone'in field['field_name']:patterns.append({'type': 'phone', 'strategy': 'chinese_phone'})elif field['data_type'] == 'number':if field.get('constraints', {}).get('min') isnotNone:patterns.append({'type': 'range_number', 'strategy': 'uniform_distribution'})return patterns

节点3:智能数据生成引擎
多策略数据生成器:

class SmartDataGenerator:
def init(self):
self.generators = {
'faker_email': self.generate_email,
'chinese_phone': self.generate_chinese_phone,
'uniform_distribution': self.generate_uniform_number,
'business_rule_based': self.generate_by_business_rules
}

def generate_test_data(self, requirements, strategy):"""生成测试数据"""data_batch = []for i in range(requirements['data_count']):data_item = {}for field in requirements['fields']:generator = self.generators.get(field.get('generation_strategy'), self.default_generator)data_item[field['field_name']] = generator(field, i)# 应用业务规则data_item = self.apply_business_rules(data_item, requirements['business_rules'])data_batch.append(data_item)return data_batchdef generate_email(self, field, index):"""生成邮箱地址"""returnf"testuser{index}@example.com"def generate_chinese_phone(self, field, index):"""生成中国手机号"""prefixes = ['138', '139', '150', '151', '152', '157', '186', '187']prefix = random.choice(prefixes)suffix = ''.join(random.choices('0123456789', k=8))returnf"{prefix}{suffix}"

节点4:数据质量校验
多维度数据校验:

class DataQualityValidator:
def validate_data_batch(self, data_batch, requirements):
"""验证数据质量"""
validation_results = {
'format_errors': [],
'business_rule_violations': [],
'consistency_issues': [],
'statistical_checks': []
}

    for i, data_item in enumerate(data_batch):# 格式校验format_errors = self.validate_format(data_item, requirements['fields'])if format_errors:validation_results['format_errors'].extend(format_errors)# 业务规则校验rule_violations = self.validate_business_rules(data_item, requirements['business_rules'])if rule_violations:validation_results['business_rule_violations'].extend(rule_violations)# 统计分布校验statistical_issues = self.validate_statistical_distribution(data_batch, requirements)validation_results['statistical_checks'] = statistical_issuesreturn validation_resultsdef validate_format(self, data_item, fields):"""验证数据格式"""errors = []for field in fields:value = data_item.get(field['field_name'])constraints = field.get('constraints', {})# 必填校验if constraints.get('required') and (value isNoneor value == ''):errors.append(f"字段 {field['field_name']} 为必填字段")# 格式校验if constraints.get('pattern') and value:import reifnot re.match(constraints['pattern'], str(value)):errors.append(f"字段 {field['field_name']} 格式不正确: {value}")return errors

Dify技术学习交流群
image

五、实战案例:电商平台测试数据生成
案例背景
我们需要为电商平台的用户行为分析测试准备数据,具体要求:

用户数据:1000个活跃用户
商品数据:500个不同品类的商品
订单数据:5000个历史订单
行为数据:用户浏览、收藏、加购等行为日志
工作流配置
数据需求描述:

data_requirements:
users:
count:1000
fields:
-user_id:{type:"string",format:"uuid"}
-username:{type:"string",generator:"username"}
-email:{type:"string",format:"email"}
-age:{type:"number",range:[18,65]}
-region:{type:"string",distribution:"china_provinces"}
-user_type:{type:"enum",values:["normal","vip","svip"]}

products:
count:500
fields:
-product_id:{type:"string",format:"uuid"}
-product_name:{type:"string",generator:"product_name"}
-category:{type:"string",values:["electronics","clothing","food","books"]}
-price:{type:"number",range:[1,10000],distribution:"log_normal"}
-stock:{type:"number",range:[0,1000]}

orders:
count:5000
fields:
-order_id:{type:"string",format:"uuid"}
-user_id:{type:"string",reference:"users.user_id"}
-product_id:{type:"string",reference:"products.product_id"}
-quantity:{type:"number",range:[1,10]}
-order_time:{type:"datetime",range:["2023-01-01","2024-01-01"]}
Dify工作流节点配置:

  • 节点:电商数据生成器
    类型:自定义代码
    配置:
    data_templates:
    user_template:"templates/ecommerce_user.json"
    product_template:"templates/ecommerce_product.json"
    order_template:"templates/ecommerce_order.json"
    generation_strategy:"batch_with_relationships"
    batch_size:100
    生成结果示例
    用户数据样本:

{
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"username": "张伟_158",
"email": "zhangwei158@example.com",
"age": 32,
"region": "广东省",
"city": "深圳市",
"user_type": "vip",
"registration_time": "2023-05-15T10:30:00Z",
"last_login": "2024-01-20T14:25:00Z"
}
订单数据样本:

{
"order_id": "order_abc123def456",
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"product_id": "prod_xyz789uvw012",
"product_name": "iPhone 15 Pro",
"quantity": 1,
"unit_price": 7999.00,
"total_amount": 7999.00,
"order_time": "2023-11-15T09:45:30Z",
"order_status": "completed"
}
六、高级特性:让测试数据更智能

  1. 基于业务规则的数据生成
    业务规则引擎配置:

class BusinessRuleEngine:
def apply_ecommerce_rules(self, data_batch):
"""应用电商业务规则"""
for data in data_batch:
# VIP用户订单金额规则
if data.get('user_type') == 'vip'and data.get('total_amount', 0) > 1000:
data['discount_rate'] = 0.1# VIP用户享受9折
data['final_amount'] = data['total_amount'] * 0.9

        # 库存检查规则if data.get('quantity', 0) > data.get('stock', 0):data['order_status'] = 'out_of_stock'# 地域特定的业务规则if data.get('region') in ['新疆', '西藏']:data['shipping_fee'] = 25.00# 偏远地区运费else:data['shipping_fee'] = 10.00return data_batch
  1. 数据关联性维护
    关联数据生成策略:

class RelatedDataGenerator:
def generate_related_datasets(self, requirements):
"""生成有关联关系的数据集"""
# 先生成主数据(用户)
users = self.generate_users(requirements['users'])

    # 基于用户生成商品数据,保持合理的用户-商品关系products = self.generate_products(requirements['products'])# 基于用户和商品生成订单,保持数据一致性orders = self.generate_orders(requirements['orders'], users, products)return {'users': users,'products': products, 'orders': orders}def generate_orders(self, order_req, users, products):"""基于现有用户和商品生成订单"""orders = []user_ids = [user['user_id'] for user in users]product_ids = [product['product_id'] for product in products]for i in range(order_req['count']):order = {'order_id': f"order_{uuid.uuid4()}",'user_id': random.choice(user_ids),'product_id': random.choice(product_ids),'quantity': random.randint(1, 5),'order_time': self.generate_realistic_order_time()}orders.append(order)return orders
  1. 异常数据智能生成
    边界条件和异常场景数据:

class EdgeCaseGenerator:
def generate_edge_cases(self, base_data, edge_scenarios):
"""生成边界条件和异常场景数据"""
edge_cases = []

    for scenario in edge_scenarios:if scenario == 'empty_values':edge_cases.extend(self.generate_empty_value_cases(base_data))elif scenario == 'extreme_values':edge_cases.extend(self.generate_extreme_value_cases(base_data))elif scenario == 'format_violations':edge_cases.extend(self.generate_format_violation_cases(base_data))elif scenario == 'business_rule_violations':edge_cases.extend(self.generate_business_rule_violation_cases(base_data))return edge_casesdef generate_extreme_value_cases(self, base_data):"""生成极端值测试数据"""extreme_cases = []# 数值字段的边界值for data in base_data[:10]:  # 取前10条数据进行极端值改造extreme_data = data.copy()# 年龄字段的边界值if'age'in extreme_data:extreme_data['age'] = random.choice([0, 1, 17, 18, 65, 66, 150])# 金额字段的边界值if'amount'in extreme_data:extreme_data['amount'] = random.choice([0, 0.01, 999999.99, 1000000])extreme_cases.append(extreme_data)return extreme_cases

七、效能评估:自动化前后的对比
时间效率对比
image

手动准备的问题:

数据格式不一致:15%的字段需要重新调整
业务规则违反:8%的数据不符合业务约束
关联关系断裂:12%的外键关联失效
Dify生成的优势:

数据格式一致性:99.9%符合规范
业务规则符合度:100%通过校验
关联关系完整性:100%保持有效
维护成本对比

传统手动维护成本

manual_maintenance_cost = {
'业务变更影响': '需要重造所有相关数据',
'环境迁移': '需要重新准备全套数据',
'版本管理': '难以跟踪数据版本变化',
'团队协作': '依赖个人经验,知识难以共享'
}

Dify自动化维护成本

dify_maintenance_cost = {
'业务变更影响': '更新模板后自动重新生成',
'环境迁移': '一键重新生成所有数据',
'版本管理': '自动记录数据版本和变更',
'团队协作': '模板共享,知识沉淀'
}
八、最佳实践与避坑指南

  1. 数据模板设计规范
    良好的模板设计:

template_name: "电商用户数据模板"
version:"1.2"
description:"用于电商平台用户行为分析的测试数据"

fields:
user_id:
type:"string"
generator:"uuid"
description:"用户唯一标识"

username:
type:"string"
generator:"chinese_name"
constraints:
min_length:2
max_length:20

age:
type:"integer"
generator:"uniform_distribution"
constraints:
min:18
max:65
description:"用户年龄,符合业务规则"

business_rules:
-"VIP用户年龄必须大于等于18岁"
-"用户名不能包含特殊字符"
-"邮箱地址必须符合RFC标准"

relationships:
-source:"users.user_id"
target:"orders.user_id"
type:"one_to_many"
2. 性能优化策略
大数据量生成优化:

class PerformanceOptimizer:
def optimize_large_data_generation(self, requirements):
"""优化大数据量生成性能"""
optimization_strategies = {
'batch_processing': self.process_in_batches,
'parallel_generation': self.generate_in_parallel,
'lazy_validation': self.validate_after_generation,
'incremental_storage': self.store_incrementally
}

    # 根据数据量选择合适的优化策略if requirements['data_count'] > 10000:return self.apply_all_optimizations(requirements)elif requirements['data_count'] > 1000:return self.apply_batch_optimization(requirements)else:return self.standard_generation(requirements)def process_in_batches(self, data_generator, batch_size=1000):"""分批处理大数据量"""all_data = []for i in range(0, requirements['data_count'], batch_size):batch = data_generator.generate_batch(min(batch_size, requirements['data_count'] - i))all_data.extend(batch)return all_data
  1. 错误处理与降级方案
    健壮的错误处理机制:

class RobustDataGenerator:
def generate_with_fallback(self, requirements):
"""带降级方案的数据生成"""
try:
# 首选方案:智能生成
return self.smart_generation(requirements)
except GenerationError as e:
logger.warning(f"智能生成失败: {e}, 使用备选方案")

        try:# 备选方案:规则生成return self.rule_based_generation(requirements)except RuleError as e:logger.warning(f"规则生成失败: {e}, 使用基础方案")# 基础方案:随机生成return self.basic_generation(requirements)

九、扩展应用场景

  1. 性能测试数据生成
    performance_testing_data:
    用户数据:
    count:100000
    generation_strategy:"distributed"
    distribution:
    地域分布:"按中国实际人口分布"
    年龄分布:"正态分布,均值35,标准差10"

订单数据:
count:1000000
time_range:["2023-01-01","2024-01-01"]
temporal_distribution:"按实际业务时间模式"
2. 安全测试数据生成
security_test_data = {
'sql_injection_payloads': [
"' OR '1'='1",
"'; DROP TABLE users; --",
"UNION SELECT username, password FROM users"
],
'xss_payloads': [
"",
"",
"javascript:alert('XSS')"
],
'path_traversal_payloads': [
"../../../etc/passwd",
"..\..\..\windows\system32\drivers\etc\hosts"
]
}
3. 国际化测试数据
international_data_config = {
'locales': ['en_US', 'zh_CN', 'ja_JP', 'de_DE', 'fr_FR'],
'region_specific_rules': {
'en_US': {
'name_generator': 'western_name',
'address_format': 'street_city_state',
'phone_format': 'us_phone'
},
'zh_CN': {
'name_generator': 'chinese_name',
'address_format': 'province_city_district',
'phone_format': 'chinese_phone'
}
}
}
十、总结:从数据奴隶到数据主人
通过Dify构建的测试数据工厂,我们实现了:

量化收益
时间节省:测试数据准备时间减少85%
质量提升:数据准确率从85%提升到99.9%
覆盖完善:边界条件和异常场景覆盖率达到100%
维护简化:数据维护成本降低90%
质化价值
标准化:建立了统一的测试数据规范
知识化:将数据准备经验转化为可复用的模板
自动化:实现了测试数据的按需生成
智能化:利用AI理解业务语义,生成更真实的数据
实施路线图
对于想要实施类似方案的团队,建议采用渐进式策略:

第一阶段:从最痛苦的数据类型开始,建立基础数据模板
第二阶段:扩展数据场景,完善业务规则引擎
第三阶段:实现数据生命周期管理,建立完整的数据工厂
第四阶段:探索AI增强的数据生成,实现预测性数据准备
测试数据准备不再是"巧妇难为无米之炊"的困境,而是变成了"按需取用,智能生成"的便利。通过Dify工作流,测试团队可以真正从繁琐的数据准备工作中解放出来,专注于更有价值的测试设计和质量分析工作。

推荐学习
AIGC与智能体平台 Coze Dify N8N课程,限时免费,机会难得。扫码报名,参与直播,希望您在这场公开课中掌握AIGC快速实现让创业创收,快速开启创业创收之路!

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 vxe-table 展开行实现展开子表父子表格

如何使用 vxe-table 展开行实现展开子表父子表格 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table<template><div><vxe…

ubuntu操作系统增加swap内存 - Ladisson

检查当前 Swap 状态sudo swapon --show free -h关闭现有 Swapsudo swapoff /swapfile调整或创建 Swap 文件# 设置为16GB sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile启用新 Swap…

2025年航空VR智慧教室定做厂家权威推荐榜单:幼儿保育实训室/家政实训室/航空VR实训室源头厂家精选

随着虚拟现实技术在航空培训领域的深度应用,VR智慧教室正成为培养航空人才的重要平台。据行业数据显示,2025年中国航空VR培训市场规模预计突破42亿元,年复合增长率达28.5%。 航空VR智慧教室通过高度仿真的虚拟环境,…

stash 的一些操作

git stash 作用是将当前分支改动的代码存放到暂存区中,还原当前分支的改动,可以成功切换到其他待改动分支;保存当前分支改动代码到暂存区,并备注 xxxxgit stash save "xxxx"查询当前git项目下所有在暂存…

Ubuntu Netplan

什么是 Netplan? Netplan 是 Ubuntu 17.10 及更高版本中引入的网络配置工具,它使用 YAML 格式的配置文件来简化网络管理。 主要特点​​声明式配置​​ 使用易读的 YAML 格式 抽象底层网络守护进程(NetworkManager …

2025年成品岗亭供货厂家权威推荐榜单:成品门卫亭/小区保安亭/执法岗亭源头厂家精选

市场调研数据显示,2024年国内岗亭定制市场规模已突破80亿元,年增长率保持在15%以上,成品岗亭因其快速交付的优势备受市场青睐。 成品岗亭作为城市管理、社区安防和商业服务的基础设施,其市场需求随着城市化进程加速…

实时期货、黄金贵金属、外汇数据接口文档

StockTV 提供全面的期货、黄金贵金属和外汇市场数据接口,支持全球主要交易所的期货合约、贵金属现货及期货、全球外汇货币对等多种金融产品。所有接口返回数据均为 JSON 格式。 快速开始 1. 获取 API Key 请联系官方获…

python动态加载插件 - ling

获取当前脚本路径 根据当前位置获取绝对路径,区分打包后的可执行文件和开发环境 def get_plugins_dir(relative_path: str = "plugins") -> str:"""获取应用程序的插件目录如果是打包后的…

实用指南:C++设计模式_结构型模式_适配器模式Adapter

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年混凝土预制管桩设备定做厂家权威推荐榜单:PHC管桩生产设备/PHC管桩生产线/混凝土管桩生产设备源头厂家精选

在建筑工业化和基础建设持续发展的推动下,混凝土预制管桩设备的技术水平与定制化能力已成为衡量制造商实力的关键标尺。本文基于技术研发实力、设备性能参数、定制化解决方案及市场应用反馈,对行业内的专业设备制造企…

2025年微小流量质量流量计企业权威推荐榜单:差压质量流量计/液体质量流量计/数字式质量流量计源头厂家精选

在精密制造、生物医药和半导体等高端工业领域,微小流量质量流量计作为流体测控的核心设备,其测量精度与稳定性直接关系到生产工艺效率与产品质量。当前,随着生物制药向“高效发酵”升级、新能源储能进入“规模化并网…

2025年阻燃pp管厂商权威推荐榜单:阻燃pp管厂商/塑料pp管/pp化工管源头厂家精选

2025年阻燃PP管厂商权威推荐榜单:塑料PP管/PP化工管/FRPP管源头厂家精选 在化工、矿山、污水处理等行业,阻燃PP管以其卓越的耐腐蚀性和阻燃安全性,正成为工业流体输送系统的关键材料。 阻燃PP管作为工业流体输送系统…

ArkTS语言(六)

学习ArkTS语言 ArkTS是HarmonyOS的主要应用开发语言,在TypeScript基础上进行了扩展,保留了其基本风格,并通过增强静态检查和分析来提高程序的稳定性和性能。本教程将帮助开发者掌握ArkTS的核心功能、语法及最佳实践…

rbd元数据

rbd元数据https://cloud.tencent.com/developer/article/1006283 实际操作示例的 Ceph Pool → RBD → Object → OMAP 文档Ceph Pool / RBD / Object / OMAP 完整文档1️⃣ 关键概念说明概念说明Pool Ceph 的逻辑存储…

2025 年氧舱厂家最新推荐榜,聚焦企业技术创新、产品品质与市场口碑深度解析方圆组合式/减压/盾构气压/高原平衡/实验/软体氧舱公司推荐

引言 随着医疗健康与特殊环境保障需求的不断升级,氧舱市场规模持续扩大,但行业内企业资质、技术水平与产品质量差异显著。部分企业存在资质不全、技术滞后、产品类型单一等问题,导致采购方难以精准筛选符合需求的优…

2025年进口气动塑料球阀定制厂家权威推荐榜单:进口气动超低温球阀/进口气动三片式球阀/进口气动衬氟球阀源头厂家精选

2025年进口气动塑料球阀定制厂家权威推荐榜单:进口气动超低温球阀/进口气动三片式球阀/进口气动衬氟球阀源头厂家精选 在工业流体控制领域,进口气动塑料球阀以其独特的耐腐蚀性能和定制化服务,正成为化工、医药等特…

KL 散度

http://joschu.net/blog/kl-approx.htmlKL 散度定义标准的 k1 估计KL 散度, 方差大, 应为k1 有正有负k3 也是KL 散度的无偏估计, 但是元素都是正的, 方差小很多--- 她说, 她是仙,她不是神

2025年不锈钢编织绳网柔性加工厂权威推荐榜单:不锈钢编织绳网围网/不锈钢手工编织绳网/焊接不锈钢编织绳网源头厂家精选

随着建筑装饰与防护工程需求的升级,不锈钢编织绳网市场正以年均12.3%的速度增长,2025年全球市场规模预计突破58亿美元。 不锈钢编织绳网以其耐腐蚀、高强度、柔韧性好等特点,广泛应用于动物园围网、建筑装饰、体育场…

页面增加水印及水印防删

从以下几点判断水印消失: 1.选用canvas 防止水印内容篡改 2.选用MutationObserver 监听水印的style属性是否被篡改和监听水印元素是否被删除 3.定时更新元素的z-index动态计算最大层级 watermark.js let obj = JSON.p…

onBeforeMount 和 onMounted区分总结

onBeforeMount 和 onMounted区分总结 onMounted 是每个Vue文件必不可少。onBeforeMount 在出现bug时,ai给我的方案中偶尔出现。有时他两能共存,不太能区分他两具体的用法和场景的不同。故总结一下