第 12 章:系统集成、测试与发布
从模块拼接到可部署的系统 — 集成测试、安全加固、镜像制作
🎯 本章学习目标
- 掌握系统集成测试的 AI 辅助设计和执行方法
- 学会安全加固的完整流程:防火墙、最小权限、安全审计
- 理解性能调优的方法论:基准测试 → 分析瓶颈 → 优化 → 验证
- 能够制作可部署的镜像(ISO/Docker)和安装脚本
- 完成项目复盘与 AI 编程方法论总结
12.1 集成测试策略
测试层次与覆盖目标
| 测试类型 | 工具 | 覆盖目标 | 执行频率 |
|---|---|---|---|
| 单元测试 | pytest | 每个模块 > 85% | 每次 commit |
| API 集成测试 | pytest + httpx | 所有 API 端点 | 每次 PR |
| 端到端测试 | Playwright | 核心用户流程 | 每次发布 |
| 安全测试 | bandit + safety | 已知漏洞检查 | 每次 PR |
| 性能测试 | locust | 关键 API 性能 | 每次大版本 |
| 系统测试 | 自定义脚本 | 完整系统功能 | 每次发布 |
API 集成测试示例
"""tests/integration/test_disk_api.py — 磁盘管理 API 集成测试"""
import pytest
from httpx import AsyncClient, ASGITransport
from nas.main import app # FastAPI 应用实例
@pytest.fixture
async def client():
"""创建测试客户端"""
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as ac:
yield ac
@pytest.fixture
def auth_headers():
"""获取测试认证令牌"""
return {"Authorization": "Bearer test_token_admin"}
class TestDiskAPI:
"""磁盘管理 API 集成测试"""
@pytest.mark.integration
async def test_list_disks_requires_auth(self, client):
"""未认证用户应被拒绝"""
response = await client.get("/api/disks/")
assert response.status_code == 401
@pytest.mark.integration
async def test_list_disks_returns_array(self, client, auth_headers):
"""认证用户可获取磁盘列表"""
response = await client.get("/api/disks/", headers=auth_headers)
assert response.status_code == 200
data = response.json()
assert "disks" in data
assert isinstance(data["disks"], list)
@pytest.mark.integration
async def test_get_nonexistent_disk(self, client, auth_headers):
"""不存在的磁盘返回 404"""
response = await client.get("/api/disks/sdzzz", headers=auth_headers)
assert response.status_code == 404
@pytest.mark.integration
async def test_mount_nonexistent_device(self, client, auth_headers):
"""挂载不存在的设备返回 400"""
response = await client.post(
"/api/disks/mount",
headers=auth_headers,
json={"device": "/dev/sdzzz", "mount_point": "test", "fs_type": "ext4"}
)
assert response.status_code == 400
12.2 安全加固
安全加固清单
🔒 网络层
- 配置 iptables/nftables,仅开放必要端口
- HTTPS 强制,HTTP → HTTPS 重定向
- API 限流:同一 IP 每分钟最多 60 次请求
🔑 认证层
- JWT 令牌 24 小时过期
- 密码最小长度 8 位,支持复杂度检查
- 登录失败 5 次后锁定 15 分钟
🛡️ 应用层
- 所有用户输入经过 Pydantic 验证
- 文件路径防遍历(Path.resolve + 白名单检查)
- 系统命令调用禁止 shell=True
安全加固脚本
#!/bin/bash
# scripts/harden.sh — NAS 系统安全加固脚本
set -euo pipefail
echo "🔒 开始 NAS 系统安全加固..."
# 1. 配置防火墙
echo " → 配置防火墙规则..."
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp comment 'SSH'
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
ufw allow 445/tcp comment 'SMB'
ufw allow 2049/tcp comment 'NFS'
ufw --force enable
# 2. SSH 加固
echo " → 加固 SSH 配置..."
sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#MaxAuthTries.*/MaxAuthTries 3/' /etc/ssh/sshd_config
systemctl reload sshd
# 3. 内核安全参数
echo " → 设置内核安全参数..."
cat > /etc/sysctl.d/99-nas-security.conf <<'EOF'
# 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
# 忽略 ICMP 广播
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 防止 SYN 洪水
net.ipv4.tcp_syncookies = 1
# 记录可疑包
net.ipv4.conf.all.log_martians = 1
EOF
sysctl -p /etc/sysctl.d/99-nas-security.conf
# 4. 文件权限加固
echo " → 加固关键文件权限..."
chmod 640 /etc/shadow
chmod 644 /etc/passwd
chmod 640 /etc/samba/smb.conf
# 5. 删除不必要的包
echo " → 清理不必要的软件包..."
apt-get purge -y telnetd rsh-server 2>/dev/null || true
echo "✅ 安全加固完成"
12.3 部署打包
一键安装脚本
#!/bin/bash
# scripts/install.sh — NAS 系统一键安装脚本
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
NAS_HOME="/opt/nas-os"
VENV_DIR="$NAS_HOME/venv"
echo "🚀 开始安装 NAS 操作系统..."
echo "================================"
# 1. 系统依赖
echo "📦 安装系统依赖..."
apt-get update
apt-get install -y --no-install-recommends \
python3.11 python3.11-venv python3-pip \
samba nfs-kernel-server \
smartmontools lvm2 mdadm \
nginx redis-server \
exfatprogs ntfs-3g btrfs-progs
# 2. 创建 NAS 目录
echo "📁 创建目录结构..."
mkdir -p "$NAS_HOME" /mnt/nas /etc/nas /var/log/nas
cp -r "$SCRIPT_DIR/../src" "$NAS_HOME/"
cp "$SCRIPT_DIR/../nas.service" /etc/systemd/system/
# 3. Python 虚拟环境
echo "🐍 配置 Python 环境..."
python3.11 -m venv "$VENV_DIR"
source "$VENV_DIR/bin/activate"
pip install --upgrade pip
pip install -r "$NAS_HOME/src/requirements.txt"
# 4. 配置文件
echo "⚙️ 生成配置文件..."
if [ ! -f /etc/nas/config.yaml ]; then
cat > /etc/nas/config.yaml <<'EOF'
web:
host: "0.0.0.0"
port: 8000
storage:
mount_base: "/mnt/nas"
health_check_interval: 3600
auth:
jwt_secret: "CHANGE_ME_IN_PRODUCTION"
jwt_expire_hours: 24
max_login_attempts: 5
lockout_minutes: 15
EOF
echo " ⚠️ 请修改 /etc/nas/config.yaml 中的 jwt_secret!"
fi
# 5. systemd 服务
echo "🔧 注册 systemd 服务..."
systemctl daemon-reload
systemctl enable nas-api nas-worker nas-monitor
systemctl start nas-api
# 6. Nginx 配置
echo "🌐 配置 Nginx..."
cat > /etc/nginx/sites-available/nas <<'NGINX'
server {
listen 80;
server_name _;
client_max_body_size 10G;
location /api/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {
root /opt/nas-os/static;
index index.html;
try_files $uri $uri/ /index.html;
}
}
NGINX
ln -sf /etc/nginx/sites-available/nas /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
echo "================================"
echo "✅ NAS 系统安装完成!"
echo " 访问 http://$(hostname -I | awk '{print $1}'):80"
echo " 默认管理员: admin / admin123(请立即修改密码!)"
12.4 项目复盘与 AI 编程方法论总结
AI 编程的十大核心法则
- 精确胜于简洁 — 好的提示词往往"精确冗长",用约束收窄 AI 的发挥空间
- 接口先行 — 先定义契约,再让 AI 生成实现,接口是质量的锚点
- 短迭代快反馈 — 每次生成 50-200 行代码,审查通过后再继续
- 零信任验证 — AI 生成的每一行代码都必须经过审查,特别是安全相关
- 三层体系 — 主提示词(全局) + 模块提示词(边界) + 工具提示词(操作)
- 测试驱动 AI — 让 AI 先生成测试,再生成实现,测试是需求的精确表达
- 知识沉淀 — 每次调试的根因、每个好用的提示词,都纳入知识库
- 人机分工 — 人负责"为什么"和"验证",AI 负责"怎么做"
- 上下文即资本 — 精心管理 AI 的上下文窗口,信息密度优先于信息量
- 持续进化 — 提示词库、风格字典、模块文档与代码同步演进
📋 本章提示词模板
模板 12.1:集成测试生成器
📋
请为以下 API 模块生成完整的集成测试:
## API 模块
[粘贴 FastAPI Router 代码]
## 测试要求
1. 使用 httpx.AsyncClient + ASGITransport
2. 覆盖所有端点(包括成功和失败场景)
3. 测试认证中间件(无 Token / 过期 Token / 无效 Token)
4. 测试参数验证(缺失必填字段 / 非法值 / 边界值)
5. 测试错误处理路径(模拟服务层异常)
## 输出
- 使用 pytest + pytest-asyncio
- 使用 conftest.py 管理 fixtures
- 每个测试函数有清晰的 docstring 说明测试意图
- 标记为 @pytest.mark.integration
模板 12.2:发布检查清单
📋
请根据以下项目状态,生成发布检查清单:
## 项目信息
- [项目名和版本号]
- [变更内容摘要]
## 检查清单结构
### 代码质量
- [ ] 所有测试通过(单元 + 集成 + E2E)
- [ ] Lint 零警告
- [ ] 类型检查通过(mypy strict)
- [ ] 安全扫描无 Critical/High 问题
### 文档
- [ ] CHANGELOG 已更新
- [ ] API 文档与代码同步
- [ ] 安装/升级文档已验证
### 部署
- [ ] 配置迁移脚本已准备
- [ ] 回滚方案已测试
- [ ] 监控告警规则已配置
### 性能
- [ ] 基准测试通过(不低于上一版本 95%)
- [ ] 内存泄漏检查通过
- [ ] 并发压力测试通过
请输出可勾选的 Markdown 清单。
🛠️ 实战演练:端到端测试脚本
NAS 系统安装验收测试
#!/bin/bash
# tests/e2e/test_install.sh — 端到端安装验证
echo "🧪 NAS 系统端到端测试"
echo "========================"
PASS=0
FAIL=0
check() {
local desc="$1"
shift
if "$@" > /dev/null 2>&1; then
echo " ✅ $desc"
((PASS++))
else
echo " ❌ $desc"
((FAIL++))
fi
}
# 1. 服务状态
check "NAS API 服务运行中" systemctl is-active nas-api
check "Samba 服务运行中" systemctl is-active smbd
check "NFS 服务运行中" systemctl is-active nfs-kernel-server
check "Nginx 服务运行中" systemctl is-active nginx
check "Redis 服务运行中" systemctl is-active redis-server
# 2. API 端点
check "健康检查端点响应" curl -sf http://localhost:8000/api/health
check "磁盘列表 API 可访问" curl -sf http://localhost:8000/api/disks/ -H "Authorization: Bearer test"
# 3. 端口监听
check "端口 80 (HTTP) 监听中" ss -tlnp | grep -q ":80 "
check "端口 443 (HTTPS) 监听中" ss -tlnp | grep -q ":443 "
check "端口 445 (SMB) 监听中" ss -tlnp | grep -q ":445 "
# 4. 文件系统
check "NAS 挂载基础目录存在" test -d /mnt/nas
check "NAS 配置目录存在" test -f /etc/nas/config.yaml
# 5. 安全
check "防火墙已启用" ufw status | grep -q "Status: active"
check "SSH root 登录已禁用" grep -q "PermitRootLogin no" /etc/ssh/sshd_config
echo "========================"
echo "结果: ✅ $PASS 通过, ❌ $FAIL 失败"
exit $FAIL
📝 全书总结
恭喜你完成了《AI 编程实战》全部 12 章的学习!
从思维重塑到提示词工程,从软件工程方法到系统级编程,最终完成了一个完整的 NAS 操作系统。
你掌握的不仅是使用 AI 写代码,更是一套完整的AI 赋能软件工程方法论:
- 用 三层提示词体系 驾驭复杂项目
- 用 描述-生成-验证循环 保证代码质量
- 用 接口先行 + 测试驱动 控制 AI 输出
- 用 知识沉淀 + 持续进化 不断提升效率
AI 不会替代开发者,但会用 AI 的开发者会替代不会用的。
祝你在 AI 编程的道路上越走越远 🚀