Files
MrleeAdmin/.windsurf/skills/backend-tests/SKILL.md
T

334 lines
10 KiB
Markdown
Raw Normal View History

2026-08-31 11:33:59 +08:00
---
name: backend-tests
description: 通用的测试脚本管理技能,专注于测试脚本的归类、组织和管理,避免脚本散落在根目录
---
# Tester Skill
本技能专注于测试脚本的组织、归类和管理。当需要创建、管理或执行测试脚本时,应使用此技能来确保所有测试脚本都按标准目录结构归类存放。
## 何时使用此技能
当遇到以下情况时使用此技能:
1. 测试脚本散落在项目根目录,需要整理归类
2. 需要创建新的测试脚本,需要遵循标准目录结构
3. 需要管理和组织测试脚本文件
4. 需要执行批量测试或验证
5. 需要统一的测试脚本管理规范
## 如何使用此技能
### 1. 测试目录结构管理规范
所有测试脚本必须归类存放,禁止在项目根目录创建临时测试文件。使用以下简化目录结构(最多一层子目录):
```
backend/tests/
├── plugin/ # 插件相关测试(直接放文件)
├── unit/ # 单元测试(直接放文件)
├── integration/ # 集成测试(直接放文件)
├── e2e/ # 端到端测试(直接放文件)
├── scripts/ # 测试脚本工具(直接放文件)
└── fixtures/ # 测试数据文件(直接放文件)
```
### 2. 测试脚本创建和归类流程
创建测试脚本时应遵循以下流程:
1. **确定测试类型**:根据测试目的选择适当的目录(unit/integration/e2e/plugin等)
2. **创建标准目录**:如果目录不存在,先创建标准目录结构
3. **命名规范**:使用有意义的文件名,如 `user-model-test.php`、`api-auth-test.php`
4. **归类存放**:将脚本放在正确的子目录中,避免根目录
5. **清理临时文件**:测试完成后,清理并删除临时测试文件
6. **更新目录文档**:更新相应目录的 README 或说明文件
### 2. 测试脚本归类规则
所有测试脚本必须按以下规则归类存放(最多一层目录):
#### 2.1 按测试类型归类
- **单元测试**:`tests/unit/` - 测试单个类或方法(直接放文件)
- **集成测试**:`tests/integration/` - 测试多个组件的交互(直接放文件)
- **端到端测试**:`tests/e2e/` - 测试完整业务流程(直接放文件)
- **插件测试**:`tests/plugin/` - 专门测试插件功能(直接放文件)
- **性能测试**:`tests/performance/` - 测试性能和负载(直接放文件)
#### 2.2 命名规范
- 使用有意义的文件名,如 `user-model-test.php`、`api-auth-test.php`
- 文件名应反映测试内容,避免通用名称如 `test.php`、`check.php`
#### 2.3 禁止行为
- ❌ 禁止在项目根目录创建测试脚本
- ❌ 禁止在 `public/`、`vendor/` 等目录创建测试脚本
- ❌ 禁止使用临时文件名(如 `test1.php`、`temp.php`)
- ❌ 禁止测试脚本残留临时文件
- ❌ 禁止创建多层子目录结构(最多一层)
### 4. 测试脚本质量标准
所有测试脚本应满足以下质量标准:
- ✅ 按标准目录结构归类存放
- ✅ 使用有意义的文件名,描述测试内容
- ✅ 包含清晰的注释和文档说明
- ✅ 输出标准的测试结果格式(✓/✗/⚠)
- ✅ 自动清理临时文件和资源
- ✅ 支持命令行参数和配置选项
- ✅ 可独立运行,不依赖复杂环境
### 5. 常用测试脚本模板
#### 4.1 单元测试模板(简化版)
```php
<?php
// tests/unit/UserModelTest.php
namespace Tests\Unit;
use App\Models\User;
class UserModelTest
{
public function testUserCreation()
{
echo "=== 用户模型测试 ===\n";
// 测试用户创建逻辑
$user = new User(['name' => 'Test User']);
if ($user->name === 'Test User') {
echo "✓ 用户创建测试成功\n";
} else {
echo "✗ 用户创建测试失败\n";
}
}
}
```
#### 4.2 API集成测试模板(简化版)
```php
<?php
// tests/integration/AuthApiTest.php
namespace Tests\Integration;
class AuthApiTest
{
public function testLoginApi()
{
echo "=== API认证测试 ===\n";
// 测试登录API逻辑
$response = $this->simulateApiCall('/api/login', [
'username' => 'test',
'password' => 'password'
]);
if ($response['status'] === 200 && isset($response['token'])) {
echo "✓ API认证测试成功\n";
} else {
echo "✗ API认证测试失败\n";
}
}
private function simulateApiCall($endpoint, $data)
{
// 模拟API调用逻辑
return ['status' => 200, 'token' => 'mock_token'];
}
}
```
#### 4.3 插件安装测试模板(简化版)
```php
<?php
// tests/plugin/MigrationTest.php
namespace Tests\Plugin;
class MigrationTest
{
public function run()
{
echo "=== 迁移文件测试 ===\n";
// 测试迁移文件语法
$this->testMigrationSyntax();
// 测试索引名称长度
$this->testIndexNames();
// 测试引擎设置
$this->testEngineSettings();
}
private function testMigrationSyntax()
{
// 迁移文件语法测试逻辑
}
}
```
### 6. 批量测试执行和归类检查
#### 5.1 运行所有测试(简化版)
使用 `tests/scripts/run-all-tests.php` 脚本执行所有归类好的测试:
```php
<?php
// tests/scripts/run-all-tests.php
echo "=== 批量测试执行 ===\n";
// 扫描所有测试目录中的文件
$testDirectories = ['plugin', 'unit', 'integration', 'e2e'];
foreach ($testDirectories as $directory) {
$dirPath = __DIR__ . '/../' . $directory;
if (!is_dir($dirPath)) {
continue;
}
echo "=== 执行 {$directory} 测试 ===\n";
$files = scandir($dirPath);
foreach ($files as $file) {
if ($file !== '.' && $file !== '..' && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
$testPath = $dirPath . '/' . $file;
include $testPath;
}
}
}
```
#### 5.2 检查测试脚本归类(简化版)
使用以下脚本检查是否有未归类的测试文件:
```php
<?php
// tests/scripts/check-classification.php
echo "=== 测试脚本归类检查 ===\n";
// 允许的目录
$allowedDirs = ['tests/', 'vendor/'];
// 查找项目根目录中的测试文件
function findTestFiles($dir)
{
$testFiles = [];
$patterns = ['/test.*\.php$/i', '/.*test\.php$/i', '/check.*\.php$/i'];
if ($handle = opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry === '.' || $entry === '..') continue;
$path = $dir . '/' . $entry;
if (is_dir($path)) {
// 递归查找子目录
$testFiles = array_merge($testFiles, findTestFiles($path));
} else {
// 检查是否是测试文件
foreach ($patterns as $pattern) {
if (preg_match($pattern, $entry)) {
$testFiles[] = $path;
break;
}
}
}
}
closedir($handle);
}
return $testFiles;
}
// 检查测试文件是否在允许的目录中
$projectRoot = realpath(__DIR__ . '/../../');
$allTestFiles = findTestFiles($projectRoot);
$unclassified = [];
foreach ($allTestFiles as $file) {
$isAllowed = false;
foreach ($allowedDirs as $allowed) {
if (strpos($file, $allowed) !== false) {
$isAllowed = true;
break;
}
}
if (!$isAllowed) {
$unclassified[] = $file;
}
}
// 输出结果
if (count($unclassified) > 0) {
echo "⚠ 发现 " . count($unclassified) . " 个未正确归类的测试脚本:\n\n";
foreach ($unclassified as $file) {
$relativePath = str_replace($projectRoot . '/', '', $file);
echo " • " . $relativePath . "\n";
}
echo "\n请将这些文件移动到 tests/ 目录下的相应子目录中。\n";
} else {
echo "✓ 所有测试脚本都已正确归类到 tests/ 目录中。\n";
}
```
### 6. 测试结果验证
每个测试脚本应输出明确的验证结果:
- ✓ 成功:绿色标记
- ✗ 失败:红色标记
- ⚠ 警告:黄色标记
- 详细说明:问题描述和修复建议
### 7. 临时文件管理
所有测试脚本应在完成后清理临时文件:
```php
// 清理临时文件
$tempFiles = ['test_*.php', 'check_*.php', 'fix_*.php'];
foreach ($tempFiles as $pattern) {
// 查找并删除临时文件
}
```
## 技能资源
本技能包含以下资源:
### 脚本资源 (`scripts/`)
- `create-test-directory.php`:创建测试目录结构的脚本
- `test-template-generator.php`:生成各种测试脚本模板
- `validate-migration-files.php`:验证迁移文件的完整脚本
- `check-index-names.php`:检查索引名称长度的脚本
### 参考资源 (`references/`)
- `mysql-limitations.md`:MySQL 限制参考(标识符长度、引擎等)
- `laravel-migration-guide.md`:Laravel 迁移最佳实践指南
- `plugin-install-flow.md`:插件安装流程和常见问题
- `testing-best-practices.md`:测试最佳实践和标准
### 资产资源 (`assets/`)
- `test-directory-structure.txt`:测试目录结构模板
- `test-script-templates/`:各种测试脚本模板文件
- `expected-output-examples/`:预期输出示例
## 执行流程示例
### 场景1:测试脚本归类检查
1. 使用 `tests/scripts/check-classification.php` 检查是否有未归类的测试脚本
2. 将发现的临时测试文件移动到正确的 `tests/` 子目录中
3. 使用有意义的文件名重命名测试文件
4. 执行 `tests/scripts/cleanup-temp.php` 清理残留临时文件
### 场景2:创建新的插件测试
1. 在 `tests/plugin/` 目录下创建新的测试文件,如 `official-plugin-test.php`
2. 编写测试逻辑,包含清晰的注释和输出格式
3. 执行测试验证功能是否正常
4. 确保测试完成后清理所有临时资源
### 场景3:批量执行测试
1. 使用 `tests/scripts/run-all-tests.php` 执行所有测试
2. 查看测试结果报告,识别失败的测试
3. 修复失败的测试或相关问题
4. 重新执行测试确保所有测试通过
通过本技能,可以系统化地管理和执行插件安装相关的测试工作,确保所有修复都经过充分验证,避免重复问题。