4. 项目初始化与工程结构:打好地基,后面才不慌
说实话,我见过太多测试平台项目,代码写了一半,发现目录乱成一锅粥。配置文件散落在各个角落,虚拟环境里包冲突到让人崩溃。嗯,这些坑我都踩过。今天我们就聊聊,怎么从一开始就把这些基础工作做扎实。
4.1 项目目录设计:别让文件到处乱跑
一个测试平台的目录结构,说白了就是你的「工地规划图」。我个人的习惯是,先想清楚这个平台要做什么,再动手搭架子。下面这个结构,是我在多个项目中沉淀下来的,你可以直接拿来用。
test_platform/
├── api/ # 接口层,处理HTTP请求
│ ├── __init__.py
│ └── v1/ # API版本控制
├── core/ # 核心业务逻辑
│ ├── __init__.py
│ ├── runner/ # 测试执行引擎
│ ├── report/ # 报告生成
│ └── scheduler/ # 任务调度
├── models/ # 数据模型
│ ├── __init__.py
│ └── db/ # 数据库模型
├── utils/ # 工具函数
│ ├── __init__.py
│ ├── logger.py # 日志封装
│ └── helpers.py # 通用辅助函数
├── config/ # 配置文件
│ ├── __init__.py
│ ├── default.py # 默认配置
│ └── production.py # 生产环境配置
├── tests/ # 单元测试
│ ├── __init__.py
│ └── test_api/
├── docs/ # 文档
├── scripts/ # 运维脚本
├── requirements.txt # 依赖清单
├── .gitignore # Git忽略规则
└── README.md # 项目说明
核心原则:高内聚、低耦合。每个目录只做一件事,别让api层去直接操作数据库,也别让工具函数里塞业务逻辑。
我在项目中遇到过一个问题:有人把数据库连接字符串写在了某个工具函数里。结果换环境时,找了半天才找到这个「隐藏配置」。所以,配置文件必须统一管理,这是铁律。
4.2 虚拟环境搭建:隔离,是为了不打架
你想想看,如果两个项目都用 Flask,但一个要 2.0 版本,另一个要 3.0 版本。没有虚拟环境,它们就会在系统里「打架」。我建议用 Python 自带的 venv,简单又可靠。
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境(Windows)
venv\Scripts\activate
# 激活虚拟环境(macOS/Linux)
source venv/bin/activate
# 安装依赖
pip install -r requirements.txt
小技巧:把 venv/ 目录加到 .gitignore 里。虚拟环境是本地的东西,不要提交到 Git 仓库。每个开发者自己创建就好。
我曾经见过一个团队,把整个 venv 目录提交到了 Git 仓库。结果不同操作系统之间,路径全乱了。嗯,那场面,真是「一地鸡毛」。
4.3 版本控制(Git)初始化:给代码上把锁
Git 初始化其实就几步,但很多人忽略了 .gitignore 的重要性。我个人的习惯是,在 git init 之前,先把 .gitignore 写好。
# .gitignore 示例
venv/
__pycache__/
*.pyc
.env
*.log
dist/
build/
*.egg-info/
.idea/
.vscode/
然后执行初始化:
git init
git add .
git commit -m "chore: 项目初始化"
避坑指南:我曾经有一次忘记加 .env 到 .gitignore,结果把数据库密码提交到了公开仓库。嗯,那之后我养成了一个习惯:每次提交前,先跑一遍 git status,看看有没有不该出现的文件。
4.4 配置文件管理:环境切换,一键搞定
测试平台通常要跑在开发、测试、生产三个环境。每个环境的数据库地址、Redis 连接、日志级别都不一样。怎么管理?我推荐用「分层配置」的思路。
# config/default.py
class DefaultConfig:
DEBUG = False
SECRET_KEY = 'your-secret-key'
SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db'
REDIS_URL = 'redis://localhost:6379/0'
LOG_LEVEL = 'INFO'
# config/production.py
from .default import DefaultConfig
class ProductionConfig(DefaultConfig):
SQLALCHEMY_DATABASE_URI = 'mysql://user:pass@prod-host/db'
REDIS_URL = 'redis://prod-redis:6379/0'
LOG_LEVEL = 'WARNING'
然后在应用启动时,根据环境变量加载对应的配置:
import os
from config import default, production
env = os.getenv('APP_ENV', 'development')
if env == 'production':
app.config.from_object(production.ProductionConfig)
else:
app.config.from_object(default.DefaultConfig)
核心要点:敏感信息(密码、密钥)不要硬编码在配置文件里。用环境变量或者 .env 文件来管理。我习惯在 .env 里写 DB_PASSWORD=xxx,然后在配置里用 os.getenv('DB_PASSWORD') 读取。
4.5 知识体系总览
下面这张图,帮你把本章的核心逻辑串起来。从目录设计到配置管理,每一步都是环环相扣的。
好了,项目初始化这块就聊到这儿。记住一句话:前期多花十分钟搭架子,后期能省十个小时改 Bug。这是我从无数次重构中总结出来的教训。