07-测试覆盖审查.md 6.8 KB

第七阶段:测试覆盖审查报告

审查概述

项目 详情
审查日期 2026年5月19日
审查范围 测试现状、测试覆盖率、测试策略
发现问题数 8个
高风险 3个
中风险 3个
低风险 2个

1. 测试现状分析

1.1 测试文件统计

指标 数量
PHP 文件总数 610
测试目录文件数 1
PHPUnit 测试类 0
测试方法数 0
测试覆盖率 0%

1.2 现有测试文件

文件tests/lottery_test.php

分析

  • 不是 PHPUnit 测试,只是一个独立脚本
  • 用于测试抽奖概率模拟
  • 没有断言(assert),只是输出结果
  • 需要手动运行查看结果
// 当前代码
$result = $lottery->draw(0, $userHistory, $prizePool);
echo "批次数:{$sessionCount},每批抽:{$drawPerSession} 次...";

// 缺少断言
// $this->assertIsArray($result);
// $this->assertTrue($result['success']);

1.3 PHPUnit 配置分析

文件phpunit.xml

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>
            <directory suffix=".php">application/</directory>
        </whitelist>
    </filter>
</phpunit>

问题

  • 配置存在但未使用
  • whitelist 配置指向 application/ 但无测试覆盖
  • PHPUnit 版本可能与 PHP 版本不兼容

2. 关键路径测试缺失

🔴 高风险(无测试覆盖)

2.1 支付流程

位置api/controller/v1/Pay.phpservice/GamePayService.php

缺失测试

  • 支付创建
  • 支付回调验证
  • 订单状态更新
  • 退款处理
  • 金额计算精度

2.2 用户认证

位置api/controller/v1/Login.phpapi/controller/v1/Register.php

缺失测试

  • 登录验证
  • Token 生成/验证
  • 密码加密
  • 会话管理

2.3 渠道适配器

位置api/complex/(53个文件)

缺失测试

  • 登录验证逻辑
  • 签名验证
  • 数据转换
  • 错误处理

🟡 中风险(无测试覆盖)

2.4 定时任务

位置crontab/

缺失测试

  • 支付超时处理
  • 数据统计计算
  • 队列消费逻辑

2.5 数据模型

位置common/model/(151个文件)

缺失测试

  • 模型关联
  • 数据验证
  • 软删除
  • 事件回调

2.6 工具函数

位置common.php

缺失测试

  • 加密/解密函数
  • 金额格式化
  • 渠道层级查询
  • IP 处理

3. 测试策略建议

3.1 测试金字塔

        /\
       /  \        E2E 测试 (10%)
      /    \       - 关键业务流程
     /------\
    /        \     集成测试 (20%)
   /          \    - API 接口测试
  /            \   - 数据库交互测试
 /--------------\
/                \ 单元测试 (70%)
/                  \ - 工具函数
/--------------------\- 模型方法
                      - 服务层方法

3.2 优先级排序

优先级 测试类型 范围 工作量
P0 单元测试 支付计算、加密函数、金额处理 2天
P1 集成测试 API 接口、数据库操作 5天
P2 E2E 测试 支付流程、登录流程 3天
P3 回归测试 全量测试套件 持续

3.3 推荐测试工具

工具 用途
PHPUnit 单元测试、集成测试
Mockery Mock 对象
Faker 测试数据生成
Codeception 全栈测试
Postman/Newman API 测试

4. 问题汇总

按风险等级分类

🔴 高风险

序号 问题 影响
1 测试覆盖率为 0% 无法保证代码质量
2 支付流程无测试 资金安全风险
3 认证流程无测试 安全风险

🟡 中风险

序号 问题
1 定时任务无测试
2 数据模型无测试
3 工具函数无测试

🟢 低风险

序号 问题
1 PHPUnit 配置未使用
2 现有测试非标准格式

5. 改进建议

第一优先级(核心测试)

  1. 支付流程测试:覆盖支付创建、回调、退款
  2. 认证流程测试:覆盖登录、Token、权限
  3. 金额计算测试:确保精度正确

第二优先级(基础测试)

  1. 工具函数测试:加密、格式化、转换
  2. 模型方法测试:关联、验证、事件
  3. API 接口测试:请求/响应验证

第三优先级(完善测试)

  1. 定时任务测试:异步逻辑验证
  2. 渠道适配器测试:第三方对接验证
  3. 回归测试套件:全量自动化测试

第四优先级(CI/CD 集成)

  1. 引入 CI/CD:自动运行测试
  2. 代码覆盖率报告:监控覆盖率
  3. 测试驱动开发:新功能先写测试

6. 参考测试代码

PHPUnit 测试示例

<?php
namespace tests\unit;

use PHPUnit\Framework\TestCase;
use app\common\library\PayUtil;

class PayUtilTest extends TestCase
{
    public function testFormatFenToYuan()
    {
        $this->assertEquals('1.00', PayUtil::formatFenToYuan(100));
        $this->assertEquals('0.01', PayUtil::formatFenToYuan(1));
        $this->assertEquals('100.50', PayUtil::formatFenToYuan(10050));
    }
    
    public function testFormatYuanToFen()
    {
        $this->assertEquals(100, PayUtil::formatYuanToFen(1.00));
        $this->assertEquals(1, PayUtil::formatYuanToFen(0.01));
        $this->assertEquals(10050, PayUtil::formatYuanToFen(100.50));
    }
    
    public function testMakeOrderid()
    {
        $orderid = PayUtil::makeOrderid('TEST');
        $this->assertMatchesRegularExpression('/^TEST\d{18}$/', $orderid);
    }
}

API 测试示例

<?php
namespace tests\integration;

use PHPUnit\Framework\TestCase;

class PayApiTest extends TestCase
{
    public function testCreateOrder()
    {
        $response = $this->post('/api/v1/pay/index', [
            'userid' => 1,
            'gameid' => 1,
            'amount' => 100,
            'paytype' => 'zfb',
        ]);
        
        $this->assertEquals(200, $response->getStatusCode());
        $data = json_decode($response->getBody(), true);
        $this->assertEquals(1, $data['code']);
        $this->assertArrayHasKey('orderid', $data['data']);
    }
    
    public function testPayCallback()
    {
        // 测试支付回调
    }
}

审查报告生成时间:2026年5月19日