本目录包含完整的端到端(E2E)测试套件,使用 pyodbc 验证 MaxCompute ODBC 驱动的所有功能。
test/e2e/
├── config.py # 测试配置和环境变量加载
├── base_test.py # 基础测试类和工具函数
├── test_connection.py # 连接测试
├── test_maxqa.py # MaxQA 功能测试
├── test_query.py # 查询执行测试
├── test_metadata.py # 元数据查询测试
├── test_data_types.py # 数据类型测试
├── test_transactions.py # 事务测试
├── test_errors.py # 错误处理测试
├── test_performance.py # 性能测试
├── runner.py # 测试运行器
├── check_odbc_setup.py # ODBC 环境检查工具
└── E2E_TEST_README.md # 本文档
-
Python 3.7+
-
依赖安装:
pip install pyodbc pip install pytest # 可选,用于更高级的测试功能 -
已构建的 ODBC 驱动:
cmake --build build --config Release
创建 .env 文件或设置环境变量:
export MCO_DRIVER_PATH="/path/to/libmaxcompute_odbc.dylib"
export MAXCOMPUTE_ENDPOINT="https://service.cn-shanghai.maxcompute.aliyun.com/api"
export MAXCOMPUTE_PROJECT="your_project"
export ALIBABA_CLOUD_ACCESS_KEY_ID="your_access_key_id"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="your_access_key_secret"
export MAXCOMPUTE_QUOTA_NAME="your_quota_name" # 可选编辑 config.py 中的默认值。
cd test/e2e
python3 runner.py# 只运行连接测试
python3 test_connection.py
# 只运行 MaxQA 测试
python3 test_maxqa.py
# 只运行查询测试
python3 test_query.pycd test/e2e
pytest -v# 运行所有 MaxQA 测试
pytest test_maxqa.py -v
# 运行特定测试方法
pytest test_query.py::TestQuery::test_select -v
# 运行带特定标记的测试
pytest -m "smoke" # 运行冒烟测试
pytest -m "performance" # 运行性能测试验证基本的连接功能:
- ✅ 标准连接(无 MaxQA)
- ✅ 交互模式连接(默认 quota)
- ✅ 交互模式 + quota 名称
- ✅ Quota hints 模式(非交互 + quota)
- ✅ 多次连接/断开
- ✅ 连接字符串参数验证
- ✅ 连接超时处理
- ✅ 不同的认证方式
专门测试 MaxQA 功能:
- ✅ 标准模式(无 MaxQA)
- ✅ 交互模式(默认 quota)
- ✅ 交互模式 + 指定 quota
- ✅ Quota hints 模式
- ✅ 交互模式下的多次查询
- ✅ 同一会话中的多个查询
- ✅ SET 语句解析和传递
- ✅ 参数化查询
- ✅ Prepared Statement
测试查询执行功能:
- ✅ 简单 SELECT 查询
- ✅ 带条件的 SELECT 查询
- ✅ JOIN 查询
- ✅ 子查询
- ✅ UNION 查询
- ✅ GROUP BY 和聚合函数
- ✅ ORDER BY
- ✅ LIMIT 和 OFFSET
- ✅ INSERT 语句
- ✅ UPDATE 语句
- ✅ DELETE 语句
- ✅ DDL 语句(CREATE/ALTER/DROP)
测试 ODBC 元数据功能:
- ✅ SQLTables - 获取表列表
- ✅ SQLColumns - 获取列信息
- ✅ SQLPrimaryKeys - 获取主键
- ✅ SQLStatistics - 获取统计信息
- ✅ SQLTablePrivileges - 获取表权限
- ✅ SQLColumnPrivileges - 获取列权限
- ✅ SQLGetTypeInfo - 获取类型信息
- ✅ SQLDescribeCol - 描述列属性
- ✅ SQLColAttribute - 获取列属性
测试所有 MaxCompute 数据类型:
- ✅ 基本类型:BIGINT, INT, SMALLINT, TINYINT
- ✅ 浮点类型:DOUBLE, FLOAT, DECIMAL
- ✅ 字符串类型:STRING, VARCHAR, CHAR
- ✅ 日期时间类型:DATE, DATETIME, TIMESTAMP
- ✅ 布尔类型:BOOLEAN
- ✅ 二进制类型:BINARY
- ✅ 复杂类型:ARRAY, MAP, STRUCT
- ✅ NULL 值处理
- ✅ 类型转换
测试事务功能:
- ✅ 自动提交模式
- ✅ 手动提交
- ✅ 回滚
- ✅ 嵌套事务
- ✅ 事务隔离级别
测试错误处理:
- ✅ 无效的连接参数
- ✅ SQL 语法错误
- ✅ 表不存在
- ✅ 列不存在
- ✅ 认证失败
- ✅ 网络错误
- ✅ 超时错误
- ✅ 诊断信息获取 (SQLGetDiagRec)
测试驱动性能:
- ✅ 连接建立时间
- ✅ 查询执行时间
- ✅ 大结果集获取
- ✅ 批量操作
- ✅ 并发连接
- ✅ 内存使用
测试使用 pytest 标记进行分类:
@pytest.mark.smoke- 冒烟测试(快速验证基本功能)@pytest.mark.maxqa- MaxQA 相关测试@pytest.mark.query- 查询执行测试@pytest.mark.metadata- 元数据测试@pytest.mark.datatype- 数据类型测试@pytest.mark.error- 错误处理测试@pytest.mark.performance- 性能测试@pytest.mark.slow- 慢速测试(需要真实数据)
成功运行时,你应该看到类似以下的输出:
============================================================
MaxCompute ODBC Driver - E2E Test Suite
============================================================
[1/10] Running Connection Tests...
✓ test_standard_connection
✓ test_interactive_mode_default_quota
✓ test_interactive_mode_with_quota
✓ test_quota_hints_mode
Connection Tests: 4/4 PASSED
[2/10] Running MaxQA Tests...
✓ test_standard_mode
✓ test_interactive_mode
✓ test_quota_hints_mode
✓ test_multiple_queries_session
MaxQA Tests: 4/4 PASSED
[3/10] Running Query Tests...
✓ test_simple_select
✓ test_select_with_where
✓ test_join_query
✓ test_aggregate_functions
Query Tests: 4/4 PASSED
...
============================================================
Test Summary
============================================================
Total Tests: 40
Passed: 38
Failed: 0
Skipped: 2
Duration: 45.2s
✓ All critical tests PASSED!
✗ Driver not found: /path/to/libmaxcompute_odbc.dylib
解决方案:
# 确保已构建驱动
cmake --build build --config Release
# 检查驱动文件是否存在
ls -la build/lib/libmaxcompute_odbc.dylib
# 设置正确的路径
export MCO_DRIVER_PATH="/absolute/path/to/libmaxcompute_odbc.dylib"✗ pyodbc not installed
解决方案:
pip install pyodbc✗ Connection failed: [IM002] [unixODBC][Driver Manager]Data source name not found
解决方案:
- 使用环境变量配置
- 或在连接字符串中使用绝对路径
- 或注册 ODBC 驱动到系统
✗ Authentication failed
解决方案:
- 检查 Access Key ID 和 Access Key Secret 是否正确
- 确认账户权限是否足够
- 检查网络连接
✗ Test timeout after 30s
解决方案:
- 增加测试超时时间
- 检查网络连接
- 使用更简单的测试查询
from base_test import BaseTest
import pytest
class TestNewFeature(BaseTest):
"""测试新功能的基类"""
@pytest.mark.smoke
def test_basic_functionality(self):
"""测试基本功能"""
conn = self.connect()
cursor = conn.cursor()
# 你的测试逻辑
cursor.execute("SELECT 1")
result = cursor.fetchone()
assert result[0] == 1
conn.close()
@pytest.mark.maxqa
def test_with_maxqa(self):
"""测试 MaxQA 模式下的功能"""
conn = self.connect(interactive_mode=True)
cursor = conn.cursor()
# 你的测试逻辑
cursor.execute("SELECT 1")
result = cursor.fetchone()
assert result[0] == 1
conn.close()pytest test_new_feature.py -vname: E2E Tests
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
e2e-tests:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
pip install pyodbc pytest
- name: Build driver
run: |
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release
- name: Run E2E tests
env:
MCO_DRIVER_PATH: ${{ github.workspace }}/build/lib/libmaxcompute_odbc.dylib
MAXCOMPUTE_ENDPOINT: ${{ secrets.MAXCOMPUTE_ENDPOINT }}
MAXCOMPUTE_PROJECT: ${{ secrets.MAXCOMPUTE_PROJECT }}
ALIBABA_CLOUD_ACCESS_KEY_ID: ${{ secrets.ALIBABA_CLOUD_ACCESS_KEY_ID }}
ALIBABA_CLOUD_ACCESS_KEY_SECRET: ${{ secrets.ALIBABA_CLOUD_ACCESS_KEY_SECRET }}
run: |
cd test/e2e
python3 runner.py --smoke --maxqa- 使用环境变量: 避免在代码中硬编码敏感信息
- 独立测试: 每个测试应该独立运行,不依赖其他测试
- 清理资源: 确保每个测试都正确关闭连接和游标
- 错误处理: 捕获并记录所有异常
- 清晰的输出: 使用清晰的测试名称和输出
- 标记测试: 使用 pytest 标记对测试进行分类
- 超时设置: 为慢速测试设置合理的超时时间
- 测试数据: 使用专门的测试表和测试数据