using System;
using System.Linq;
using System.Threading.Tasks;
using Amazon.S3;
using Amazon.S3.Model;
using Dpz.Core.Service.ObjectStorage;
using Dpz.Core.Service.ObjectStorage.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NUnit.Framework;
namespace Dpz.Core.Server.ObjectStorage.Test;
/// <summary>
/// COS 视频服务集成测试
/// </summary>
[TestFixture]
public class CosVideoCloudServiceIntegrationTest
{
private const string TestVideoM3U8 = "/Video/JingGuowang-One/1080p.m3u8";
/// <summary>
/// 对真实 COS 上的 m3u8 视频获取元数据:验证能解析出大于 0 的时长、非空的分片列表,
/// 且各分片时长之和与总时长一致(精度 0.001)。
/// </summary>
[Test]
public async Task GetVideoMetaAsync_WhenRealCosM3u8_ReturnsDurationAndSegments()
{
Assume.That(
Environment.GetEnvironmentVariable("DPZ_ENABLE_COS_INTEGRATION_TESTS") == "1",
"需要显式开启真实 COS 集成测试"
);
var service = CreateService();
var result = await service.GetVideoMetaAsync(TestVideoM3U8);
Assert.That(result.Success, Is.True, result.Message);
Assert.That(result.Data, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(result.Data!.Duration, Is.GreaterThan(0));
Assert.That(result.Data.Points, Is.Not.Empty);
Assert.That(result.Data.Points.Sum(), Is.EqualTo(result.Data.Duration).Within(0.001));
});
}
/// <summary>
/// 对真实 COS 上的 m3u8 视频在 47 秒处截图:验证截图成功、返回的封面地址指向
/// Video/JingGuowang-One/video.webp,且该封面已真实写入 COS(ContentType 为 image/jpeg)。
/// 注意:本用例会真实写入并覆盖线上封面文件。
/// </summary>
[Test]
public async Task VideoScreenshotAsync_WhenRealCosM3u8_UploadsCover()
{
Assume.That(
Environment.GetEnvironmentVariable("DPZ_ENABLE_COS_INTEGRATION_TESTS") == "1",
"需要显式开启真实 COS 集成测试"
);
var provider = CreateServiceProvider();
var service = provider.GetRequiredService<IVideoCloudService>();
var options = provider.GetRequiredService<S3ObjectStorageOptions>();
var amazonS3 = provider.GetRequiredService<IAmazonS3>();
var result = await service.VideoScreenshotAsync(TestVideoM3U8, TimeSpan.FromSeconds(47));
Assert.That(result.Success, Is.True, result.Message);
Assert.That(result.Data, Does.EndWith("/Video/JingGuowang-One/video.webp"));
var metadata = await amazonS3.GetObjectMetadataAsync(
new GetObjectMetadataRequest
{
BucketName = options.Bucket,
Key = "Video/JingGuowang-One/video.webp",
}
);
Assert.Multiple(() =>
{
Assert.That(metadata.Headers.ContentType, Is.EqualTo("image/jpeg"));
});
}
private static IVideoCloudService CreateService()
{
return CreateServiceProvider().GetRequiredService<IVideoCloudService>();
}
private static ServiceProvider CreateServiceProvider()
{
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.Test.json").Build();
var services = new ServiceCollection();
services.AddSingleton<IConfiguration>(configuration);
services.AddLogging(x => x.AddConsole());
services.AddS3ObjectStorage();
services.AddCosVideoSyncHandleService();
return services.BuildServiceProvider();
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
代码解释
这是一个针对腾讯云 COS(Cloud Object Storage)视频服务的集成测试类,使用 NUnit 测试框架编写。
主要功能
1. 测试类概述
[TestFixture]
public class CosVideoCloudServiceIntegrationTest
- 测试腾讯云对象存储上的视频处理功能
- 包含两个核心测试用例,针对 M3U8 格式的视频文件
2. 测试用例一:视频元数据获取
GetVideoMetaAsync_WhenRealCosM3u8_ReturnsDurationAndSegments()
测试目标: 验证从真实 COS 获取 M3U8 视频的元数据
验证点:
- ✅ 能成功解析视频
- ✅ 视频时长 > 0
- ✅ 分片列表(Points)不为空
- ✅ 所有分片时长之和 = 总时长(精度 0.001 秒)
前置条件: 需要设置环境变量 DPZ_ENABLE_COS_INTEGRATION_TESTS=1 才会执行
3. 测试用例二:视频截图
VideoScreenshotAsync_WhenRealCosM3u8_UploadsCover()
测试目标: 在视频第 47 秒处截取封面图并上传到 COS
验证点:
- ✅ 截图操作成功
- ✅ 返回的封面路径以
/Video/JingGuowang-One/video.webp结尾 - ✅ 文件已真实上传到 COS
- ✅ 文件 ContentType 为
image/jpeg
⚠️ 注意: 此测试会真实写入并覆盖线上封面文件
4. 辅助方法
CreateServiceProvider()
构建依赖注入容器:
- 加载 appsettings.Test.json 配置文件
- 注册日志服务(控制台输出)
- 注册 S3 对象存储服务
- 注册 COS 视频同步处理服务
CreateService()
简化服务获取的快捷方法
技术要点
| 技术栈 | 说明 |
|---|---|
| NUnit | 测试框架 |
| AWS S3 SDK | 兼容 COS 的对象存储 SDK |
| 依赖注入 | 使用 Microsoft.Extensions.DependencyInjection |
| 异步编程 | 所有测试方法使用 async/await |
| 集成测试保护 | 通过环境变量控制是否执行真实 COS 操作 |
设计特点
- 安全防护:使用
Assume.That确保不会意外执行真实环境测试 - 完整验证:不仅验证返回值,还通过 AWS S3 SDK 直接验证 COS 上的实际文件
- 多重断言:使用
Assert.Multiple提高测试效率 - 真实环境测试:直接操作生产级别的 COS 服务,确保功能可用性
AI 正在分析代码…
评论加载中...