阶段四:实战篇 ⭐⭐⭐ 实战

第 12 章:系统集成、测试与发布

从模块拼接到可部署的系统 — 集成测试、安全加固、镜像制作

🎯 本章学习目标

  1. 掌握系统集成测试的 AI 辅助设计和执行方法
  2. 学会安全加固的完整流程:防火墙、最小权限、安全审计
  3. 理解性能调优的方法论:基准测试 → 分析瓶颈 → 优化 → 验证
  4. 能够制作可部署的镜像(ISO/Docker)和安装脚本
  5. 完成项目复盘与 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 编程的十大核心法则

  1. 精确胜于简洁 — 好的提示词往往"精确冗长",用约束收窄 AI 的发挥空间
  2. 接口先行 — 先定义契约,再让 AI 生成实现,接口是质量的锚点
  3. 短迭代快反馈 — 每次生成 50-200 行代码,审查通过后再继续
  4. 零信任验证 — AI 生成的每一行代码都必须经过审查,特别是安全相关
  5. 三层体系 — 主提示词(全局) + 模块提示词(边界) + 工具提示词(操作)
  6. 测试驱动 AI — 让 AI 先生成测试,再生成实现,测试是需求的精确表达
  7. 知识沉淀 — 每次调试的根因、每个好用的提示词,都纳入知识库
  8. 人机分工 — 人负责"为什么"和"验证",AI 负责"怎么做"
  9. 上下文即资本 — 精心管理 AI 的上下文窗口,信息密度优先于信息量
  10. 持续进化 — 提示词库、风格字典、模块文档与代码同步演进

📋 本章提示词模板

模板 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 编程的道路上越走越远 🚀