#!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json import random import time # API基础URL BASE_URL = "http://127.0.0.1:9999/api/v1" # 测试数据 test_phone = f"1380000{random.randint(1000, 9999)}" test_password = test_phone[-6:] # 默认密码是手机号后6位 access_token = None user_id = None valuation_id = None def test_register(): """测试用户注册功能""" print("\n===== 测试用户注册 =====") url = f"{BASE_URL}/app-user/register" data = { "phone": test_phone } response = requests.post(url, json=data) print(f"请求URL: {url}") print(f"请求数据: {data}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "注册请求失败" result = response.json() assert result["code"] == 200, "注册失败" assert result["data"]["phone"] == test_phone, "返回的手机号不匹配" assert result["data"]["default_password"] == test_phone[-6:], "默认密码不正确" print("✅ 用户注册测试通过") return result def test_login(): """测试用户登录功能""" global access_token print("\n===== 测试用户登录 =====") url = f"{BASE_URL}/app-user/login" data = { "phone": test_phone, "password": test_password } response = requests.post(url, json=data) print(f"请求URL: {url}") print(f"请求数据: {data}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "登录请求失败" result = response.json() assert "access_token" in result, "登录失败,未返回token" # 保存token供后续请求使用 access_token = result["access_token"] print("✅ 用户登录测试通过") return result def test_create_valuation(): """测试创建估值评估申请""" global access_token print("\n===== 测试创建估值评估申请 =====") url = f"{BASE_URL}/app-valuations/" # 准备请求头,包含授权token headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } # 估值评估申请数据 - 根据估值字段.txt更新 data = { # 02 - 基础信息 - 非遗IP资产的基本信息 "asset_name": f"蜀绣-{random.randint(1000, 9999)}", # 资产名称:必须是企业全名称 "institution": "有数", # 所属机构:拥有或管理该非遗IP资产的机构名称 "industry": "文化艺术", # 所属行业:非遗IP资产所属的行业分类 # 03 - 财务状况 "rd_investment": "5", # :近12个月的研发费用(单位:万元) "annual_revenue": "100", # 近12个月的营收额(单位:万元),用于计算创新投入比 "three_year_income": [100, 120, 150], # 近三年的每年收益:资产近3年的年收益数据(单位:万元),用于计算年均收益和增长率 "funding_status": "国家级资助", # 资金支持: 国家级资助(10分)、省级资助(7分)、无资助(0分) # 04 - 非遗等级与技术 "inheritor_level": "国家级", # 传承人等级 "inheritor_ages": [60, 42, 35], # 传承人年龄 "inheritor_certificates": ["http://example.com/国家级非遗传承人证书.jpg"], # 传承人证书:传承人资质证明材料 "heritage_asset_level": "国家级非遗", # 非遗资产等级 "patent_remaining_years": "8", # [实际上就是专利号 通过API查询到的 ]专利剩余年限:资产相关专利的剩余保护期,8年对应7分 "historical_evidence": { # 资产历史证据类型+数量:历史传承的证据材料 "artifacts": 1, # 出土实物数量 "ancient_literature": 2, # 古代文献数量 "inheritor_testimony": 3, # 传承人佐证数量 "modern_research": 1 # 现代研究数量 }, # 专利证书: "patent_certificates": ["http://example.com/专利证书1.jpg", "http://example.com/专利证书2.jpg"], "pattern_images": ["pattern1.jpg"], # 纹样图片:资产相关的纹样图片文件 # 04 - 非遗应用与推广 "implementation_stage": "成熟应用", # 非遗资产应用成熟度 "coverage_area": "区域覆盖", # 非遗资产应用覆盖范围 "collaboration_type": "品牌联名", # 非遗资产跨界合作深度 "offline_teaching_count": 12, # 近12个月线下相关演讲活动次数 "platform_accounts": { # 线上相关宣传账号信息 "bilibili": { "followers_count": 8000, # 粉丝数量 "likes": 1000, # 点赞数 "comments": 500, # 评论数 "shares": 500 # 转发数 }, # B站账号 "douyin": { "followers_count": 8000, # 粉丝数量 "likes": 1000, # 点赞数 "comments": 500, # 评论数 "shares": 500 # 转发数 } # 抖音账号 }, # 06 - 非遗资产衍生商品信息 #该商品近12个月销售量 "sales_volume": "1000", # 近12个月销售量:资产衍生商品的近12个月销售量(单位:件) 链接购买量 # 该商品近12个月的链接浏览量 "link_views": "10000", # 近12个月链接浏览量:资产衍生商品相关链接的近12个月浏览量(单位:次) 浏览量 "scarcity_level": "流通", # 稀缺等级:资产的稀缺程度,流通(发行量>1000份)对应0.1分 "market_activity_time": "近一月", # 市场活动的时间 "monthly_transaction_amount": "<100万元", # 月交易额:资产衍生商品的月交易额水平,<100万元对应-0.1 "price_range": { # 资产商品的价格波动率:近30天商品价格的波动情况 "highest": 239, # 最高价(单位:元) "lowest": 189 # 最低价(单位:元) }, "market_price": 0, # 直接提供的市场价格(单位:万元) 用户输入: 专家审核 或者 系统默认 专家审核 # 内置API 计算字段 "infringement_record": "无侵权记录", # 侵权记录:资产的侵权历史情况,无侵权记录对应10分 "patent_count": "1", # 专利使用量:资产相关的专利数量,每引用一项专利+2.5分 "esg_value": "10", # ESG关联价值:根据行业匹配的ESG(环境、社会、治理)关联价值 "policy_matching": "10", # 政策匹配度:根据行业自动匹配的政策匹配度分值 "online_course_views": 2000, # 线上课程点击量:抖音/快手播放量按100:1折算为学习人次,B站课程按50:1折算 "pattern_complexity": "1.459", # 结构复杂度:纹样的结构复杂度值 搞一个默认值: 0.0 "normalized_entropy": "9.01", # 归一化信息熵:纹样的归一化信息熵值 搞一个默认值: 0.0 "legal_risk": "无诉讼", # 法律风险-侵权诉讼历史:资产所属机构的诉讼历史,无诉讼对应10分 # 动态质押率DPR:计算公式=基础质押率*(1+流量修正系数)+政策加成系数-流动性调节因子 "base_pledge_rate": "50%", # 基础质押率:基础质押率固定值50% "flow_correction": "0.3", # 流量修正系数:固定值0.3 } response = requests.post(url, headers=headers, json=data) print(f"请求URL: {url}") print(f"请求头: {headers}") print(f"请求数据: {json.dumps(data, ensure_ascii=False, indent=2)}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "创建估值评估申请请求失败" result = response.json() assert result["code"] == 200, "创建估值评估申请失败" print("✅ 创建估值评估申请测试通过") return result def test_get_profile(): """测试获取用户个人信息""" global access_token, user_id print("\n===== 测试获取用户个人信息 =====") url = f"{BASE_URL}/app-user/profile" headers = { "Authorization": f"Bearer {access_token}" } response = requests.get(url, headers=headers) print(f"请求URL: {url}") print(f"请求头: {headers}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "获取用户信息请求失败" result = response.json() user_id = result["id"] # 保存用户ID供后续使用 print("✅ 获取用户个人信息测试通过") return result def test_change_password(): """测试修改密码""" global access_token print("\n===== 测试修改密码 =====") url = f"{BASE_URL}/app-user/change-password" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } new_password = "new" + test_password data = { "old_password": test_password, "new_password": new_password } response = requests.post(url, headers=headers, json=data) print(f"请求URL: {url}") print(f"请求头: {headers}") print(f"请求数据: {data}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "修改密码请求失败" result = response.json() assert result["code"] == 200, "修改密码失败" print("✅ 修改密码测试通过") return result def test_update_profile(): """测试更新用户信息""" global access_token print("\n===== 测试更新用户信息 =====") url = f"{BASE_URL}/app-user/profile" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } data = { "nickname": f"测试用户{random.randint(100, 999)}", "avatar": "https://example.com/avatar.jpg", "gender": "male", "email": f"test{random.randint(100, 999)}@example.com" } response = requests.put(url, headers=headers, json=data) print(f"请求URL: {url}") print(f"请求头: {headers}") print(f"请求数据: {data}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "更新用户信息请求失败" result = response.json() # 更新用户信息接口直接返回用户对象,不包含code字段 assert "id" in result, "更新用户信息失败" print("✅ 更新用户信息测试通过") return result def test_logout(): """测试用户登出""" global access_token print("\n===== 测试用户登出 =====") url = f"{BASE_URL}/app-user/logout" headers = { "Authorization": f"Bearer {access_token}" } response = requests.post(url, headers=headers) print(f"请求URL: {url}") print(f"请求头: {headers}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "登出请求失败" result = response.json() assert result["code"] == 200, "登出失败" print("✅ 用户登出测试通过") return result def test_get_valuation_list(): """测试获取用户估值列表""" global access_token print("\n===== 测试获取用户估值列表 =====") url = f"{BASE_URL}/app-valuations/" headers = { "Authorization": f"Bearer {access_token}" } response = requests.get(url, headers=headers) print(f"请求URL: {url}") print(f"请求头: {headers}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "获取估值列表请求失败" result = response.json() assert result["code"] == 200, "获取估值列表失败" print("✅ 获取用户估值列表测试通过") return result def test_get_valuation_detail(): """测试获取估值详情""" global access_token, valuation_id # 先获取估值列表,获取第一个估值ID if not valuation_id: list_result = test_get_valuation_list() if list_result["data"] and len(list_result["data"]) > 0: valuation_id = list_result["data"][0]["id"] else: print("⚠️ 没有可用的估值记录,跳过估值详情测试") return None print("\n===== 测试获取估值详情 =====") url = f"{BASE_URL}/app-valuations/{valuation_id}" headers = { "Authorization": f"Bearer {access_token}" } response = requests.get(url, headers=headers) print(f"请求URL: {url}") print(f"请求头: {headers}") print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") assert response.status_code == 200, "获取估值详情请求失败" result = response.json() assert result["code"] == 200, "获取估值详情失败" print("✅ 获取估值详情测试通过") return result def run_tests(): """运行所有测试""" try: # 测试注册 test_register() # 等待一秒,确保数据已保存 time.sleep(1) # 测试登录 test_login() # 测试获取用户个人信息 test_get_profile() # 测试更新用户信息 test_update_profile() # 测试创建估值评估申请 test_create_valuation() # 测试获取估值列表 test_get_valuation_list() # 测试获取估值详情 test_get_valuation_detail() # 测试修改密码 test_change_password() # 测试登出 test_logout() print("\n===== 所有测试通过 =====") except AssertionError as e: print(f"\n❌ 测试失败: {e}") except Exception as e: print(f"\n❌ 发生错误: {e}") if __name__ == "__main__": run_tests()