Flask 埋点测试系统操作

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 # 将数据卷挂载到 MySQL 数据目录
command:
- --default-authentication-plugin=mysql_native_password
- --authentication-policy=mysql_native_password
networks:
- mysql-network

volumes:
mysql_data: # 定义一个命名数据卷,用于持久化 MySQL 数据

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
# CentOS/RHEL
sudo yum install mysql
# ubuntu
sudo apt install mysql-client

# Ubuntu/Debian
sudo 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;

-- 查看建表语句(仅提供 `DESC` 信息,没法完全判断这两张表存在外键关系,只有查看建表语句,才能确定。)
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
# shellcheck disable=SC1090
source ~/tools/miniforge3/etc/profile.d/conda.sh
conda activate testenvLinux
which python
python --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.sh

# 后台启动服务
sudo 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 后可能包含隐藏的回车符,需要清理:

1
sed -i 's/\r$//' .env

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 字符

1
sed -i 's/\r$//' .env

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

# 查看容器 MySQL 启动日志
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_data

# 检查卷详情(包括存储路径)
docker 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"
}
]
# Docker Compose 默认会使用 <项目名>_<卷名> 的格式创建卷。
# 这里项目名是 mysql-docker,所以实际创建的卷名是 mysql-docker_mysql_data,而不是 mysql_data。

6. 系统维护

6.1 日志管理

1
2
3
4
5
6
7
8
9
10
11
# 查看 Flask 服务日志
tail -f nohup.log

# 查看 Gunicorn 访问日志
tail -f gunicorn_access.log

# 查看 Gunicorn 错误日志
tail -f gunicorn_error.log

# 查看 MySQL 容器日志
docker-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
# 查看 MySQL 进程
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 服务实现了完整的埋点数据收集和分析功能。在使用过程中需要注意:

  1. 根据 MySQL 版本选择合适的 SQL 语法
  2. 注意文件编码问题,避免隐藏字符影响配置
  3. 定期备份数据,监控系统运行状态
  4. 合理配置日志级别,便于问题排查