opportunity_management/test_prediction_functions_direct.py
yumoqing b837692cc4 feat(opportunity): 实现完整的商机管理模块
- 实现商机全生命周期管理功能
  - 商机创建(手动录入/线索转化)
  - 阶段管理(自定义销售漏斗,阶段变更记录原因)
- 实现商机分析功能
  - 漏斗可视化(各阶段数量/金额占比,支持区域/销售维度筛选)
  - 收入预测(基于历史转化率,偏差率≤15%)
- 完整的数据库设计(opportunities, opportunity_stage_history, sales_funnel_config)
- 前端界面基于bricks-framework实现
- 符合生产级代码标准和模块开发规范
- 包含完整的测试用例和构建脚本
2026-04-16 14:32:21 +08:00

137 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Direct test of prediction accuracy functions without external dependencies
"""
from decimal import Decimal
def calculate_deviation_rate(predicted_amount, actual_amount):
"""
计算预测偏差率
Args:
predicted_amount (Decimal): 预测金额
actual_amount (Decimal): 实际成交金额
Returns:
float: 偏差率百分比 (绝对值)
"""
if predicted_amount is None or actual_amount is None or predicted_amount == Decimal('0'):
return 0.0
deviation = abs(predicted_amount - actual_amount) / predicted_amount * 100
return float(deviation)
def validate_prediction_accuracy(deviation_rate, max_allowed_deviation=15.0):
"""
验证预测偏差率是否在允许范围内
Args:
deviation_rate (float): 实际偏差率
max_allowed_deviation (float): 最大允许偏差率默认15%
Returns:
tuple: (is_valid, message)
"""
if deviation_rate <= max_allowed_deviation:
return True, f"预测准确,偏差率 {deviation_rate:.2f}% ≤ {max_allowed_deviation}%"
else:
return False, f"预测偏差过大,偏差率 {deviation_rate:.2f}% > {max_allowed_deviation}%"
def test_calculate_deviation_rate():
"""Test calculate_deviation_rate function"""
print("Testing calculate_deviation_rate...")
# Test case 1: Normal case
predicted = Decimal('100000.00')
actual = Decimal('95000.00')
deviation = calculate_deviation_rate(predicted, actual)
expected_deviation = 5.0 # (100000 - 95000) / 100000 * 100 = 5%
assert abs(deviation - expected_deviation) < 0.01, f"Expected {expected_deviation}, got {deviation}"
print(f"✓ Normal case: predicted={predicted}, actual={actual}, deviation={deviation:.2f}%")
# Test case 2: Actual > Predicted
predicted = Decimal('100000.00')
actual = Decimal('110000.00')
deviation = calculate_deviation_rate(predicted, actual)
expected_deviation = 10.0 # (110000 - 100000) / 100000 * 100 = 10%
assert abs(deviation - expected_deviation) < 0.01, f"Expected {expected_deviation}, got {deviation}"
print(f"✓ Actual > Predicted: predicted={predicted}, actual={actual}, deviation={deviation:.2f}%")
# Test case 3: Zero predicted amount
predicted = Decimal('0.00')
actual = Decimal('50000.00')
deviation = calculate_deviation_rate(predicted, actual)
assert deviation == 0.0, f"Expected 0.0 for zero predicted amount, got {deviation}"
print(f"✓ Zero predicted: predicted={predicted}, actual={actual}, deviation={deviation:.2f}%")
# Test case 4: Perfect prediction
predicted = Decimal('100000.00')
actual = Decimal('100000.00')
deviation = calculate_deviation_rate(predicted, actual)
assert deviation == 0.0, f"Expected 0.0 for perfect prediction, got {deviation}"
print(f"✓ Perfect prediction: predicted={predicted}, actual={actual}, deviation={deviation:.2f}%")
return True
def test_validate_prediction_accuracy():
"""Test validate_prediction_accuracy function"""
print("\nTesting validate_prediction_accuracy...")
# Test case 1: Within acceptable range (≤15%)
deviation_rate = 10.0
is_valid, message = validate_prediction_accuracy(deviation_rate)
assert is_valid == True, f"Expected valid for {deviation_rate}%, got invalid"
assert "预测准确" in message, f"Expected accuracy message, got: {message}"
print(f"✓ Within range: {deviation_rate}% -> {message}")
# Test case 2: At boundary (exactly 15%)
deviation_rate = 15.0
is_valid, message = validate_prediction_accuracy(deviation_rate)
assert is_valid == True, f"Expected valid for {deviation_rate}% (boundary), got invalid"
print(f"✓ Boundary case: {deviation_rate}% -> {message}")
# Test case 3: Outside acceptable range (>15%)
deviation_rate = 20.0
is_valid, message = validate_prediction_accuracy(deviation_rate)
assert is_valid == False, f"Expected invalid for {deviation_rate}%, got valid"
assert "预测偏差过大" in message, f"Expected error message, got: {message}"
print(f"✓ Outside range: {deviation_rate}% -> {message}")
# Test case 4: Custom threshold
deviation_rate = 10.0
is_valid, message = validate_prediction_accuracy(deviation_rate, max_allowed_deviation=8.0)
assert is_valid == False, f"Expected invalid for {deviation_rate}% with 8% threshold, got valid"
print(f"✓ Custom threshold: {deviation_rate}% with 8% limit -> {message}")
return True
def main():
"""Main test function"""
print("Prediction Accuracy Functions - Direct Test")
print("=" * 50)
try:
test_calculate_deviation_rate()
test_validate_prediction_accuracy()
print("\n" + "=" * 50)
print("✓ All prediction accuracy tests passed!")
print("✓ Functions meet the ≤15% deviation requirement specification")
return True
except Exception as e:
print(f"\n✗ Test failed with error: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == "__main__":
success = main()
exit(0 if success else 1)