313 lines
7.2 KiB
Markdown
313 lines
7.2 KiB
Markdown
# NetServer.Test - 测试和示例项目
|
||
|
||
这个项目包含了 Sharp.NetServer 框架的完整测试和使用示例。
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
NetServer.Test/
|
||
├── UnitTests/ # 单元测试
|
||
│ ├── RouteTableTests.cs # 路由表测试
|
||
│ ├── MiddlewarePipelineTests.cs # 中间件管道测试
|
||
│ └── MiddlewareTests.cs # 中间件功能测试
|
||
│
|
||
├── IntegrationTests/ # 集成测试
|
||
│ └── ServerIntegrationTests.cs # 服务器集成测试
|
||
│
|
||
├── Examples/ # 完整示例
|
||
│ ├── Controllers/
|
||
│ │ ├── UserController.cs # 用户管理示例
|
||
│ │ ├── ProductController.cs # 产品管理示例
|
||
│ │ └── AuthController.cs # 认证示例
|
||
│ └── ExampleProgram.cs # 示例程序入口
|
||
│
|
||
└── NetServer.Test.csproj # 项目配置
|
||
```
|
||
|
||
## 🚀 运行测试
|
||
|
||
### 运行所有测试
|
||
|
||
```bash
|
||
cd test/NetServer.Test
|
||
dotnet test
|
||
```
|
||
|
||
### 运行特定测试类
|
||
|
||
```bash
|
||
dotnet test --filter "FullyQualifiedName~RouteTableTests"
|
||
dotnet test --filter "FullyQualifiedName~MiddlewarePipelineTests"
|
||
dotnet test --filter "FullyQualifiedName~ServerIntegrationTests"
|
||
```
|
||
|
||
## 🎯 运行示例程序
|
||
|
||
### 方式一:直接运行
|
||
|
||
```bash
|
||
cd test/NetServer.Test
|
||
dotnet run
|
||
|
||
# 或指定端口
|
||
dotnet run 8080
|
||
```
|
||
|
||
### 方式二:编译后运行
|
||
|
||
```bash
|
||
dotnet build
|
||
cd bin/Debug/net8.0
|
||
./NetServer.Test.exe # Windows
|
||
./NetServer.Test # Linux/Mac
|
||
```
|
||
|
||
## 📚 测试说明
|
||
|
||
### 1. 单元测试 (UnitTests/)
|
||
|
||
#### RouteTableTests.cs
|
||
|
||
测试路由系统的核心功能:
|
||
|
||
- ✅ 路由注册和发现
|
||
- ✅ 路由匹配(包括路径参数)
|
||
- ✅ 特性解析(授权、限流、缓存等)
|
||
- ✅ 无效路由处理
|
||
|
||
#### MiddlewarePipelineTests.cs
|
||
|
||
测试中间件管道:
|
||
|
||
- ✅ 中间件执行顺序
|
||
- ✅ 多个中间件的链式调用
|
||
- ✅ 中间件短路机制
|
||
|
||
### 2. 集成测试 (IntegrationTests/)
|
||
|
||
#### ServerIntegrationTests.cs
|
||
|
||
测试完整的服务器功能:
|
||
|
||
- ✅ HTTP GET/POST 请求处理
|
||
- ✅ 查询参数解析
|
||
- ✅ 404 错误处理
|
||
- ✅ CORS 响应头
|
||
- ✅ 并发请求处理
|
||
|
||
**注意**: 集成测试会启动一个真实的 HTTP 服务器,监听端口 15000。
|
||
|
||
## 💡 示例说明
|
||
|
||
### 1. 用户管理示例 (UserController.cs)
|
||
|
||
展示了完整的 CRUD 操作:
|
||
|
||
- `GET /api/users` - 获取所有用户(需要 Admin 角色)
|
||
- `GET /api/users/{id}` - 获取单个用户(带缓存)
|
||
- `POST /api/users` - 创建用户(需要 Admin 角色)
|
||
- `PUT /api/users/{id}` - 更新用户
|
||
- `DELETE /api/users/{id}` - 删除用户(需要 Admin 角色)
|
||
- `GET /api/users/search` - 搜索用户(允许匿名)
|
||
|
||
**特性展示**:
|
||
|
||
- 角色授权 (`[Authorize(Roles = "Admin")]`)
|
||
- 限流保护 (`[RateLimit]`)
|
||
- 响应缓存 (`[ResponseCache]`)
|
||
- 允许匿名访问 (`[AllowAnonymous]`)
|
||
|
||
### 2. 产品管理示例 (ProductController.cs)
|
||
|
||
展示了产品管理功能:
|
||
|
||
- `GET /api/products` - 获取所有产品(公开接口,带缓存和限流)
|
||
- `GET /api/products/{id}` - 获取产品详情(带缓存)
|
||
- `POST /api/products` - 创建产品(需要 Admin)
|
||
- `PATCH /api/products/{id}/stock` - 更新库存(需要认证)
|
||
- `DELETE /api/products/{id}` - 删除产品(需要 Admin)
|
||
- `GET /api/products/search` - 搜索产品(支持价格范围)
|
||
|
||
**特性展示**:
|
||
|
||
- 查询参数处理
|
||
- 部分更新 (PATCH)
|
||
- 复杂搜索条件
|
||
- 响应缓存策略
|
||
|
||
### 3. 认证示例 (AuthController.cs)
|
||
|
||
展示了完整的认证流程:
|
||
|
||
- `POST /api/auth/login` - 用户登录
|
||
- `POST /api/auth/logout` - 用户登出
|
||
- `GET /api/auth/me` - 获取当前用户信息
|
||
- `POST /api/auth/change-password` - 修改密码
|
||
- `POST /api/auth/refresh` - 刷新 Token
|
||
|
||
**特性展示**:
|
||
|
||
- 简单的 Token 认证实现
|
||
- Cookie 操作
|
||
- 密码验证
|
||
- 防暴力破解限流
|
||
|
||
### 4. 完整示例程序 (ExampleProgram.cs)
|
||
|
||
一个完整的可运行示例,包含:
|
||
|
||
- ✅ 服务器配置和启动
|
||
- ✅ CORS 配置
|
||
- ✅ 认证授权配置
|
||
- ✅ 限流和缓存配置
|
||
- ✅ 自定义中间件(请求计时)
|
||
- ✅ 日志配置
|
||
- ✅ 依赖注入
|
||
|
||
## 🔧 使用示例
|
||
|
||
### 启动服务器
|
||
|
||
```bash
|
||
cd test/NetServer.Test
|
||
dotnet run
|
||
```
|
||
|
||
服务器将在 `http://localhost:5000/` 启动。
|
||
|
||
### 测试 API
|
||
|
||
#### 1. 登录获取 Token
|
||
|
||
```bash
|
||
curl -X POST http://localhost:5000/api/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"admin","password":"admin123"}'
|
||
```
|
||
|
||
响应示例:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"token": "YWRtaW46QWRtaW46MTczNDU2Nzg5MA==",
|
||
"username": "admin",
|
||
"role": "Admin",
|
||
"expiresIn": 3600
|
||
},
|
||
"message": "登录成功",
|
||
"timestamp": 1734567890123
|
||
}
|
||
```
|
||
|
||
#### 2. 获取所有产品(无需认证)
|
||
|
||
```bash
|
||
curl http://localhost:5000/api/products
|
||
```
|
||
|
||
#### 3. 搜索用户(无需认证)
|
||
|
||
```bash
|
||
curl "http://localhost:5000/api/users/search?keyword=张"
|
||
```
|
||
|
||
#### 4. 获取用户详情(需要认证)
|
||
|
||
```bash
|
||
curl http://localhost:5000/api/users/1 \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE"
|
||
```
|
||
|
||
或使用 Cookie 认证:
|
||
|
||
```bash
|
||
curl http://localhost:5000/api/users/1 \
|
||
-b "auth_token=YOUR_TOKEN_HERE"
|
||
```
|
||
|
||
#### 5. 创建产品(需要 Admin 角色)
|
||
|
||
```bash
|
||
curl -X POST http://localhost:5000/api/products \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{"name":"新产品","price":299,"stock":50,"category":"测试"}'
|
||
```
|
||
|
||
#### 6. 更新库存(需要认证)
|
||
|
||
```bash
|
||
curl -X PATCH http://localhost:5000/api/products/1/stock \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{"quantity":100}'
|
||
```
|
||
|
||
## 🔑 测试账号
|
||
|
||
- **管理员**: `admin` / `admin123`
|
||
- **普通用户**: `user` / `user123`
|
||
|
||
## 📊 功能特性展示
|
||
|
||
### 认证授权
|
||
|
||
- ✅ 基于 Token 的认证
|
||
- ✅ Cookie 支持
|
||
- ✅ 角色验证
|
||
- ✅ 权限验证
|
||
|
||
### 限流
|
||
|
||
- ✅ 基于 IP 的限流
|
||
- ✅ 基于用户的限流
|
||
- ✅ 防暴力破解
|
||
|
||
### 缓存
|
||
|
||
- ✅ 内存响应缓存
|
||
- ✅ 基于查询参数的缓存变化
|
||
|
||
### CORS
|
||
|
||
- ✅ 跨域资源共享
|
||
- ✅ 预检请求处理
|
||
|
||
### 日志
|
||
|
||
- ✅ 请求日志记录
|
||
- ✅ 错误日志记录
|
||
- ✅ 性能监控(慢请求警告)
|
||
|
||
## 🎓 学习路径
|
||
|
||
1. **初学者**: 从 `ExampleProgram.cs` 开始,了解基本配置
|
||
2. **进阶**: 查看各个 Controller,学习如何使用特性
|
||
3. **高级**: 阅读单元测试和集成测试,深入理解框架原理
|
||
|
||
## 📝 注意事项
|
||
|
||
1. **端口占用**: 确保 5000 端口未被占用,或通过参数指定其他端口
|
||
2. **管理员权限**: Windows 上监听非 localhost 地址可能需要管理员权限
|
||
3. **Token 安全**: 示例中的 Token 实现仅用于演示,生产环境应使用 JWT
|
||
4. **数据持久化**: 示例使用内存存储,重启后数据会丢失
|
||
|
||
## 🚧 扩展建议
|
||
|
||
基于这些示例,你可以:
|
||
|
||
- 添加数据库支持(Entity Framework Core)
|
||
- 实现真正的 JWT 认证
|
||
- 添加 Swagger/OpenAPI 文档
|
||
- 实现文件上传功能
|
||
- 添加 WebSocket 支持
|
||
- 集成分布式缓存(Redis)
|
||
- 实现更复杂的业务逻辑
|
||
|
||
## 📖 相关文档
|
||
|
||
- [框架 README](../../src/Sharp/NetServer/README.md)
|
||
- [架构文档](../../src/Sharp/NetServer/ARCHITECTURE.md)
|