1. 系统概述 本系统基于 Flask 框架开发,用于收集和分析测试用例的埋点数据。系统架构包括:
Flask 服务端:接收和处理测试用例的 JSON 数据
MySQL 数据库:存储埋点数据和错误记录
Docker 容器化部署:便于环境管理和部署
项目代码:ApiTrack: 测试埋点服务,python+flask+mysql
2. 数据库环境搭建 2.1 使用 Docker Compose 部署 MySQL 创建 docker-compose.yml 文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 services: db: image: mysql:8.0 container_name: test-mysql-db restart: always environment: MYSQL_ROOT_PASSWORD: root密码 MYSQL_USER: 账号 MYSQL_PASSWORD: 密码 MYSQL_DATABASE: test_track ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql command: - --default-authentication-plugin=mysql_native_password - --authentication-policy=mysql_native_password networks: - mysql-network volumes: mysql_data: networks: mysql-network: driver: bridge
/var/lib/mysql 是 容器内的路径 ,宿主机上对应的路径可能是 /var/lib/docker/volumes/mysql-docker_mysql_data/_data。
通过 docker exec 确认了容器内该目录存在且包含数据,说明挂载成功。
宿主机上无需直接操作 /var/lib/mysql(这是容器内部路径)。
2.2 启动 MySQL 服务 1 2 3 4 5 6 7 8 9 10 11 docker-compose up -d docker-compose ps docker-compose logs test-mysql-db docker-compose down && docker-compose up -d
2.3 安装 MySQL 客户端 1 2 3 4 5 6 7 sudo yum install mysqlsudo apt install mysql-clientsudo apt-get install mysql-client
3. 数据库操作 3.1 连接数据库 1 mysql -h 127.0.0.1 -P 3306 -u autotest -p
3.2 基本数据库操作 1 2 3 4 5 6 7 8 9 10 11 12 13 # 查看数据库 SHOW DATABASES; # 使用数据库 USE test_track; # 查看表 SHOW TABLES; # 查询数据 SELECT * FROM aw_info; SELECT * FROM aw_error_record; SHOW FULL COLUMNS FROM aw_statistics;
3.3 数据库表结构管理 建表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE TABLE aw_info ( aw_id INT(11) NOT NULL AUTO_INCREMENT, method_name VARCHAR(255) NOT NULL, class_name VARCHAR(255) NOT NULL, model_name VARCHAR(255) NULL, framework VARCHAR(45) NOT NULL, call_count INT(11) NOT NULL DEFAULT 0, last_call_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (aw_id), UNIQUE KEY (method_name) ); CREATE TABLE aw_error_record ( id INT(11) NOT NULL AUTO_INCREMENT, aw_id INT(11) NULL, aw_error_track LONGTEXT NULL, time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, result TINYINT(1) NULL, sn VARCHAR(45) NULL, isfixed TINYINT(1) NULL, case_name VARCHAR(255) NULL, PRIMARY KEY (id), KEY (aw_id), FOREIGN KEY (aw_id) REFERENCES aw_info(aw_id) );
1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE aw_statistics ( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', aw_count INT UNSIGNED DEFAULT NULL COMMENT '总用例数', aw_executed_count INT UNSIGNED DEFAULT NULL COMMENT '执行的用例数', aw_avg_executed_count DOUBLE DEFAULT NULL COMMENT '平均执行次数', aw_executed_rate DOUBLE DEFAULT NULL COMMENT '执行率', aw_module_count INT UNSIGNED DEFAULT NULL COMMENT '模块数量', aw_error_rate DOUBLE DEFAULT NULL COMMENT '错误率', stat_time TIMESTAMP NULL DEFAULT NULL COMMENT '统计时间', PRIMARY KEY (id), KEY idx_time (stat_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自动化统计表';
导出表结构 如果有现成的数据表,那么可以拿过来参考。
1 2 3 4 5 mysqldump -h 127.0.0.1 -u root -p --no-data test_track aw_error_record aw_info > tables_structure.sql scp tables_structure.sql autotest@10.xx.xxx.58:/home/autotest/work/test_track
导入表结构 1 mysql -h 127.0.0.1 -u autotest -p test_track < tables_structure.sql
3.4 表结构修改 根据不同的 MySQL 版本选择合适的语法:
MySQL 8.0 及以上版本 1 2 3 4 5 6 7 8 9 -- 重命名列 ALTER TABLE aw_info RENAME COLUMN execute_times TO call_count; ALTER TABLE aw_info RENAME COLUMN last_execute_time TO last_call_time; -- 添加新列 ALTER TABLE aw_error_record ADD COLUMN case_name VARCHAR(255) NULL COMMENT 'testcase name'; -- 修改类型 ALTER TABLE aw_statistics MODIFY COLUMN aw_avg_executed_count DOUBLE DEFAULT NULL;
MySQL 5.7 及以下版本 1 2 3 4 5 6 7 8 9 10 11 -- 重命名列(需要重新指定完整定义) ALTER TABLE aw_info CHANGE COLUMN last_execute_time last_call_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; ALTER TABLE aw_info CHANGE COLUMN execute_times call_count INT(11) NOT NULL DEFAULT 0; -- 添加新列 ALTER TABLE aw_error_record ADD COLUMN case_name VARCHAR(255) NULL COMMENT 'testcase name'; ALTER TABLE aw_statistics ADD COLUMN framework ENUM('all', 'pytest', 'androidtest') DEFAULT 'all' COMMENT '测试框架类型';
3.5 查看表结构和关系 1 2 3 4 5 6 7 DESC aw_info;DESC aw_error_record;SHOW CREATE TABLE aw_error_record;SHOW CREATE TABLE aw_info;
4. Flask 服务部署 项目代码:ApiTrack: 测试埋点服务,python+flask+mysql
4.1 创建部署脚本 创建 start.sh 脚本:
1 2 3 4 5 6 7 8 9 #!/bin/bash source ~/tools/miniforge3/etc/profile.d/conda.shconda activate testenvLinux which pythonpython --version flask --version gunicorn --version gunicorn -w 4 -b 0.0.0.0:5000 app:app --access-logfile gunicorn_access.log --error-logfile gunicorn_error.log
4.2 启动服务 1 2 3 4 5 chmod +x start.shsudo nohup ./start.sh >nohup.log 2>&1 &
未来采用 systemd 用服务的方式管理:systemd 管理 Flask 服务实践 | Magnolia’s Blog 。
4.3 环境配置 创建 .env 文件配置数据库连接:
1 2 3 4 5 MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 MYSQL_USER=autotest MYSQL_PASSWORD=密码 MYSQL_DATABASE=test_track
注意: 如果 .env 文件在 Windows 系统中编辑,传输到 Linux 后可能包含隐藏的回车符,需要清理:
5. 常见问题排查 5.1 Docker 网络问题 错误信息: network not found
解决方案:
1 2 3 4 5 docker-compose down -v docker-compose up -d
5.2 MySQL 连接问题 错误信息: Can't connect to MySQL server
1 {"error": "(pymysql.err.OperationalError) (2003, \"Can't connect to MySQL server on '127.0.0.1\\\\r' ([Errno -2] Name or service not known)\")\n(Background on this error at: https://sqlalche.me/e/20/e3q8)"}
原因和解决方案:
.env 文件中的配置包含隐藏的 \r 字符
5.3 数据卷管理 查看数据卷信息:
1 2 3 4 5 6 7 8 docker volume ls docker volume inspect test_track_mysql_data docker exec -it test-mysql-db ls /var/lib/mysql
说明: Docker Compose 使用 <项目名>_<卷名> 格式创建卷,实际卷名为 test_track_mysql_data。
5.4 命令执行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 docker-compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS test-mysql-db mysql:8.0 "docker-entrypoint.s…" db 42 minutes ago Up 42 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp docker-compose logs test-mysql-db docker-compose down && docker-compose up -d docker-compose exec db mysql -u root -p -e "SELECT user, host, plugin FROM mysql.user WHERE user='autotest';" Enter password: +----------+------+-----------------------+ | user | host | plugin | +----------+------+-----------------------+ | autotest | % | mysql_native_password | +----------+------+-----------------------+ docker-compose exec db mysql -u autotest -p -e "SHOW VARIABLES LIKE 'default_authentication_plugin';" Enter password: +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | mysql_native_password | +-------------------------------+-----------------------+ docker exec -it test-mysql-db ls /var/lib/mysql docker volume ls DRIVER VOLUME NAME local mysql-docker_mysql_datadocker volume inspect mysql-docker_mysql_data [ { "CreatedAt" : "2025-07-20T15:02:01+08:00" , "Driver" : "local" , "Labels" : { "com.docker.compose.project" : "mysql-docker" , "com.docker.compose.version" : "1.29.2" , "com.docker.compose.volume" : "mysql_data" }, "Mountpoint" : "/var/lib/docker/volumes/mysql-docker_mysql_data/_data" , "Name" : "mysql-docker_mysql_data" , "Options" : null, "Scope" : "local" } ]
6. 系统维护 6.1 日志管理 1 2 3 4 5 6 7 8 9 10 11 tail -f nohup.logtail -f gunicorn_access.logtail -f gunicorn_error.logdocker-compose logs -f test-mysql-db
6.2 数据备份 1 2 3 4 5 6 7 8 mysqldump -h 127.0.0.1 -u root -p test_track > test_track_backup.sql mysqldump -h 127.0.0.1 -u root -p test_track aw_info aw_error_record > tables_backup.sql mysql -h 127.0.0.1 -u root -p test_track < test_track_backup.sql
6.3 性能监控 1 2 3 4 5 6 7 8 docker-compose exec db mysql -u root -p -e "SHOW PROCESSLIST;" docker-compose exec db mysql -u root -p -e "SHOW TABLE STATUS FROM test_track;" docker stats test-mysql-db
7. API 接口使用 7.1 埋点数据上传 1 2 3 4 curl -X POST http://localhost:5000/api/upload \ -H "Content-Type: application/json" \ -d '{"test_case": "example_test", "result": "success", "timestamp": "2025-06-13T10:00:00"}'
7.2 数据查询 1 2 3 4 5 curl -X GET http://localhost:5000/api/stats curl -X GET http://localhost:5000/api/errors
8. 总结 本系统通过 Docker 容器化部署,提供了稳定的 MySQL 数据库环境,配合 Flask 服务实现了完整的埋点数据收集和分析功能。在使用过程中需要注意:
根据 MySQL 版本选择合适的 SQL 语法
注意文件编码问题,避免隐藏字符影响配置
定期备份数据,监控系统运行状态
合理配置日志级别,便于问题排查