前置知识: 软件测试

测试层级

3 minBeginner2026/6/14

软件测试层级:单元测试、集成测试、系统测试、验收测试详解。

1. 测试金字塔

1.1 经典金字塔

        ╱  E2E 测试  ╲         少量、慢、贵
       ╱──────────────╲
      ╱   集成测试      ╲       适量、中速
     ╱──────────────────╲
    ╱     单元测试        ╲     大量、快、便宜
   ╱──────────────────────╲

1.2 各层对比

层级范围速度成本数量
单元测试函数/毫秒
集成测试模块适量
系统测试整体系统分钟
验收测试业务场景分钟

2. 单元测试

2.1 定义

对软件中最小可测试单元(函数、方法、)进行验证。

2.2 特点

特点描述
隔离性与外部依赖隔离
快速毫秒级执行
自动化CI/CD 集成
可重复任何环境结果一致

2.3 AAA 模式

def test_user_creation():
    # Arrange(准备)
    user_data = {"name": "Alice", "email": "alice@example.com"}

    # Act(执行)
    user = create_user(user_data)

    # Assert(断言)
    assert user.name == "Alice"
    assert user.email == "alice@example.com"

2.4 Mock 与 Stub

技术描述用途
Stub返回固定值替换外部依赖
Mock验证交互行为验证方法是否被调用
Spy记录调用部分模拟
Fake简化实现内存数据库
from unittest.mock import Mock, patch

# Stub
db = Mock()
db.get_user.return_value = {"id": 1, "name": "Alice"}

# Mock
email_service = Mock()
create_user(data, email_service)
email_service.send_welcome.assert_called_once_with("alice@example.com")

3. 集成测试

3.1 定义

验证模块间的接口和交互是否正确。

3.2 集成策略

策略描述优缺点
大爆炸一次性集成所有模块简单但定位困难
自顶向下从上层模块开始需要 Stub
自底向上从底层模块开始需要 Driver
三明治上下同时进行综合方案
增量式逐步添加模块定位容易

3.3 集成测试

描述
组件集成模块接口测试
系统集成子系统间测试
API 集成接口契约测试
数据库集成数据层交互测试

3.4 示例

import pytest
from httpx import AsyncClient
from app.main import app

@pytest.mark.asyncio
async def test_user_api_integration():
    async with AsyncClient(app=app, base_url="http://test") as client:
        # 创建用户
        response = await client.post("/api/users", json={
            "name": "Alice",
            "email": "alice@example.com"
        })
        assert response.status_code == 201
        user_id = response.json()["id"]

        # 查询用户
        response = await client.get(f"/api/users/{user_id}")
        assert response.status_code == 200
        assert response.json()["name"] == "Alice"

4. 系统测试

4.1 定义

对完整系统进行端到端测试,验证是否满足需求规格。

4.2 测试

描述
功能测试验证功能需求
非功能测试性能、安全、兼容性
端到端测试完整业务流程

4.3 端到端测试示例

// Playwright E2E 测试
import { test, expect } from '@playwright/test';

test('user can login and view dashboard', async ({ page }) => {
  await page.goto('/login');
  await page.fill('[name="email"]', 'user@example.com');
  await page.fill('[name="password"]', 'password123');
  await page.click('button[type="submit"]');

  await expect(page).toHaveURL('/dashboard');
  await expect(page.locator('h1')).toContainText('Welcome');
});

5. 验收测试

5.1 定义

由用户或客户验证软件是否满足业务需求。

5.2

描述执行者
Alpha 测试开发环境中的用户测试内部用户
Beta 测试生产环境中的用户测试外部用户
UAT用户验收测试业务用户
合同验收合同要求验证客户代表

5.3 验收准则

Feature: 用户登录
  Scenario: 成功登录
    Given 用户在登录页面
    When 输入正确的用户名和密码
    Then 跳转到首页
    And 显示欢迎消息

  Scenario: 密码错误
    Given 用户在登录页面
    When 输入错误的密码
    Then 显示错误提示
    And 仍在登录页面

6. 测试层级选择

场景推荐层级
日常开发单元测试为主
API 开发单元+集成测试
Web 应用单元+集成+E2E
微服务契约测试+集成测试
关键业务全层级覆盖