<!--
 * @Author: wangchao67 wangchao67@mychery.com
 * @Date: 2025-05-30 14:47:18
 * @LastEditors: wangchao67
 * @LastEditTime: 2025-06-09 18:50:22
 * @Description: file content
-->
# TestConfig - Vue3 测试环境自动配置工具

## 🎯 项目介绍

TestConfig 是一个专为 Vue3 + Vite 项目设计的自动化测试环境配置工具，能够快速为您的项目配置 Vitest（单元测试）和 Cypress（E2E测试）环境。支持 JavaScript 和 TypeScript，一键配置完整的测试环境。

## ✨ 功能特性

- 🚀 **一键配置**：自动安装和配置 Vitest 和 Cypress
- 🔍 **智能检测**：自动检测项目是否使用 TypeScript
- 🌐 **多语言支持**：支持 JavaScript、TypeScript 或两者兼容
- 📁 **统一目录结构**：将所有测试文件统一放在 `test/` 目录下
- ⚙️ **完整配置**：生成完整的配置文件和示例测试
- 📦 **依赖管理**：智能检测并安装必需的依赖包
- ⚡ **Vue3 优化**：专门针对 Vue3 + Vite 项目优化
- 🎭 **覆盖率报告**：自动配置代码覆盖率收集
- 🎨 **UI 界面**：支持 Vitest UI 可视化测试界面

## 💻 系统要求

- Node.js >= 16.0.0
- npm >= 7.0.0 或 yarn >= 1.22.0
- Vue 3 项目
- Vite 构建工具

## 📥 安装

### 方式一：直接使用（推荐）

```bash
# 克隆仓库到本地
git clone <仓库地址>
cd testConfig

# 在你的 Vue3 项目根目录运行
node /path/to/testConfig/index.js
```

### 方式二：复制到项目中

```bash
# 将 testConfig 文件夹复制到你的项目根目录
cp -r testConfig /path/to/your/vue3-project/

# 在项目根目录运行
cd /path/to/your/vue3-project
node testConfig/index.js
```

## 🚀 使用方法

### 基本用法

```bash
# 为当前目录的项目配置测试环境
node index.js

# 为指定项目配置测试环境
node index.js <项目路径>

# 示例：为 vueDemo 项目配置测试环境
node index.js ./vueDemo
```

### 交互式配置

运行脚本后，工具会自动检测您的项目环境并提供选择：

```
🔍 检测到项目使用: TypeScript
📍 项目路径: /path/to/your/project

🤔 请选择测试脚本的语言支持：
1. JavaScript 脚本
2. TypeScript 脚本  
3. 同时支持 JavaScript 和 TypeScript

请选择 (1/2/3): 
```

## 📂 生成的目录结构

配置完成后，工具会创建以下目录结构：

```
your-project/
├── test/                          # 测试根目录
│   ├── unit/                      # 单元测试目录
│   │   ├── components/            # 组件测试
│   │   │   └── Demo.spec.ts       # 示例组件测试
│   │   └── utils/                 # 工具函数测试
│   └── e2e/                       # E2E 测试目录
│       ├── specs/                 # 测试规范
│       │   └── example.cy.ts      # 示例 E2E 测试
│       ├── fixtures/              # 测试数据
│       └── support/               # 支持文件
│           ├── commands.ts        # 自定义命令
│           └── e2e.ts            # 全局配置
├── vitest.config.ts               # Vitest 配置文件
├── cypress.config.ts              # Cypress 配置文件
└── package.json                   # 更新的包配置
```

## 🔧 自动安装的依赖

### Vitest 相关依赖（3.2.2版本）

为了避免parseAstAsync错误和版本冲突，工具会自动安装以下版本的依赖：

```json
{
  "vitest": "^3.2.2",
  "@vue/test-utils": "^2.4.0", 
  "jsdom": "^24.1.0",
  "@vitest/coverage-v8": "^3.2.2",
  "@vitest/ui": "^3.2.2"
}
```

### Cypress 相关依赖

```json
{
  "cypress": "latest"
}
```

> **版本控制策略**：
> - 所有 Vitest 相关包使用相同的主版本号（1.6.x）
> - 使用 `^` 版本范围，允许兼容的小版本更新
> - 避免不同包依赖不兼容的 Vitest 版本

> **测试环境选择**：
> - 使用 `jsdom` 替代 `happy-dom`，提供更好的 ES 模块兼容性
> - 避免在 ES 模块环境中的 `__dirname` 未定义错误
> - 与 Vue 3 + Vite 项目完全兼容

## 📜 自动添加的 NPM 脚本

配置完成后，`package.json` 中会自动添加以下脚本：

```json
{
  "scripts": {
    "test": "vitest",
    "test:ui": "vitest --ui",
    "test:run": "vitest run",
    "test:coverage": "vitest run --coverage",
    "test:e2e": "cypress open",
    "test:e2e:headless": "cypress run"
  }
}
```

## 🎮 使用测试命令

配置完成后，您可以使用以下命令：

```bash
# 运行单元测试（监听模式）
npm run test

# 运行单元测试（UI界面）
npm run test:ui

# 运行单元测试（单次运行）
npm run test:run

# 运行单元测试并生成覆盖率报告
npm run test:coverage

# 打开 Cypress E2E 测试界面
npm run test:e2e

# 运行 E2E 测试（无头模式）
npm run test:e2e:headless
```

## 🚨 故障排除

### parseAstAsync 错误处理

如果遇到以下错误：
```
The requested module 'vitest/node' does not provide an export named 'parseAstAsync'
```

**原因分析**：
- 项目中存在多个不兼容的vitest版本
- 某些工具期望更高版本的vitest，但项目使用的是低版本

**自动处理机制**：
TestConfig工具会自动检测并处理这个问题：

1. **版本冲突检测**：自动检查现有vitest相关包的版本
2. **智能卸载**：自动卸载冲突的低版本包
3. **统一安装**：安装vitest@3.2.2及其配套包

**手动解决步骤**（如果自动处理失败）：
```bash
# 1. 卸载所有vitest相关包
npm uninstall vitest @vitest/ui @vitest/coverage-v8

# 2. 清理缓存
npm cache clean --force

# 3. 重新运行TestConfig工具
node testConfig/index.js

# 4. 或手动安装3.2.2版本
npm install -D vitest@^3.2.2 @vitest/ui@^3.2.2 @vitest/coverage-v8@^3.2.2
```

### 版本控制预防措施

TestConfig工具采用以下策略避免版本冲突：

- ✅ **统一版本**：所有vitest相关包使用相同主版本号（3.2.2）
- ✅ **冲突检测**：自动检测并卸载不兼容的旧版本
- ✅ **智能安装**：确保所有依赖包版本兼容
- ✅ **环境验证**：安装后验证配置的正确性

## 📋 生成的示例测试

### 单元测试示例 (TypeScript)

```typescript
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import { createApp } from 'vue'

// 示例组件测试
describe('Vue Component Tests', () => {
  it('应该正确创建 Vue 应用实例', () => {
    const app = createApp({})
    expect(app).toBeDefined()
  })
  
  // 更多测试示例...
})
```

### E2E 测试示例 (TypeScript)

```typescript
describe('应用基本功能测试', () => {
  beforeEach(() => {
    cy.visit('/')
  })

  it('应该正确显示首页', () => {
    cy.contains('Welcome')
    cy.get('[data-testid="app"]').should('be.visible')
  })
  
  // 更多测试示例...
})
```

## ⚙️ 配置文件

### Vitest 配置 (vitest.config.ts)

工具会生成针对 Vue3 优化的 Vitest 配置：

- 支持 Vue SFC 组件
- 配置 jsdom 测试环境
- 设置覆盖率收集
- 配置 UI 界面
- 设置测试文件匹配规则

### Cypress 配置 (cypress.config.ts)

生成的 Cypress 配置包含：

- E2E 测试配置
- 视频录制设置
- 屏幕截图配置
- 自定义命令支持

## 🛠️ 故障排除

### 常见问题

1. **权限错误**
   ```bash
   # 确保有写入权限
   chmod +x index.js
   ```

2. **Node.js 版本过低**
   ```bash
   # 升级 Node.js 到 16+ 版本
   node --version
   ```

3. **包安装失败**
   ```bash
   # 清理 npm 缓存
   npm cache clean --force
   
   # 删除 node_modules 重新安装
   rm -rf node_modules package-lock.json
   npm install
   ```

4. **TypeScript 类型错误**
   
   确保项目已安装 TypeScript：
   ```bash
   npm install -D typescript
   ```

5. **Vitest 版本冲突（重要）**

   **问题现象**：
   ```
   The requested module 'vitest/node' does not provide an export named 'parseAstAsync'
   vitest@1.6.1 invalid: "3.2.2" from node_modules/@vitest/coverage-v8
   ```

   **预防措施**：
   - ✅ 工具已自动指定兼容版本：`vitest@^1.6.0`、`@vitest/ui@^1.6.0`、`@vitest/coverage-v8@^1.6.0`
   - ✅ 所有相关包使用相同的主版本号
   
   **如果仍遇到版本冲突**：
   ```bash
   # 1. 检查版本冲突
   npm list vitest
   
   # 2. 清理并重新安装（如有需要）
   npm uninstall vitest @vitest/ui @vitest/coverage-v8
   rm -rf node_modules package-lock.json
   npm install
   
   # 3. 重新运行配置工具
   node testConfig/index.js
   ```

6. **ES 模块兼容性错误**

   **问题现象**：
   ```
   ReferenceError: __dirname is not defined
   This might cause false positive tests.
   ```

   **解决方案**：
   - ✅ 工具已自动使用 `jsdom` 环境替代 `happy-dom`
   - ✅ 提供更好的 ES 模块兼容性
   
   **如果仍遇到问题**：
   ```bash
   # 检查 vitest.config.js 中的环境配置
   # 确保使用：environment: 'jsdom'
   ```

### 手动清理

如果需要重新配置，可以删除生成的文件：

```bash
# 删除测试目录
rm -rf test/

# 删除配置文件
rm vitest.config.ts cypress.config.ts

# 手动从 package.json 中移除测试脚本
```

## 🔄 重新运行

如果您需要重新配置测试环境：

1. 确保先清理之前的配置（可选）
2. 重新运行配置脚本
3. 工具会检测已存在的文件并询问是否覆盖

## 🤝 贡献

欢迎提交 Issue 和 Pull Request 来改进这个工具！

## 📄 许可证

MIT License

## 📞 支持

如果您在使用过程中遇到问题，请：

1. 检查控制台输出的错误信息
2. 确认 Node.js 和 npm 版本
3. 查看项目是否为有效的 Vue3 项目
4. 提交 Issue 描述问题详情

---

**享受测试驱动开发的乐趣！🎉**
