测试新增: - T05 Free 自由路径(FreePathAutomationTests:完整动画 + 逐帧位置=路径点) - T06 碰撞报告内容断言(CollisionReportAssertions 接入虚拟/真实物体测试) 服务端增强: - list-model-items 端点(枚举物体:DisplayName/PathId/包围盒中心/祖先链) - run-virtual-collision-test 支持 frameRate/durationSeconds(测试动画加速:15fps/5s) - 测试执行串行锁(SemaphoreSlim,防客户端超时后任务占用 UI 线程并发污染) - 标准路径清单/XML 增加自动测试_Free Bug 修复: - AnimationControlViewModel.InvalidateLastGeneratedReport(跨测试碰撞报告残留) - 真实物体身份校验 ReferenceEquals→InstanceGuid(NW ModelItem 实例不保证同引用) - 真实物体动态解析(ModelPath 跨会话不稳定,禁止硬编码 PathId) - PathImportValidity 测试点 Id 随机化(PathPoints.Id 全局主键,p1/p2 固定会冲突) - start-navisworks.ps1:启动前清理 AutoSave(避免恢复弹窗拦截)、文件关联打开模型、dismiss 兜底、启动 15s→4.4s 验证:集成测试 13/13 通过,完整集 6min→59.6s(动画 15fps/5s)
75 lines
3.2 KiB
C#
75 lines
3.2 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace NavisworksTransport.UnitTests.Integration
|
|
{
|
|
[TestClass]
|
|
[TestCategory("NavisworksIntegration")]
|
|
public class VirtualCollisionAutomationTests
|
|
{
|
|
private const int DefaultCollisionTimeoutSeconds = 240;
|
|
private const int TestFrameRate = 15;
|
|
private const double TestDurationSeconds = 5.0;
|
|
|
|
[TestMethod]
|
|
[Timeout(360000)]
|
|
public async Task GroundVirtualCollision_AutoTestRoute_Completes()
|
|
{
|
|
await AssertVirtualCollisionTestAsync("Ground").ConfigureAwait(false);
|
|
}
|
|
|
|
[TestMethod]
|
|
[Timeout(360000)]
|
|
public async Task HoistingVirtualCollision_AutoTestRoute_Completes()
|
|
{
|
|
await AssertVirtualCollisionTestAsync("Hoisting").ConfigureAwait(false);
|
|
}
|
|
|
|
[TestMethod]
|
|
[Timeout(360000)]
|
|
public async Task RailVirtualCollision_AutoTestRoute_Completes()
|
|
{
|
|
await AssertVirtualCollisionTestAsync("Rail").ConfigureAwait(false);
|
|
}
|
|
|
|
private static async Task AssertVirtualCollisionTestAsync(string pathType)
|
|
{
|
|
using (var client = new NavisworksTestAutomationClient())
|
|
{
|
|
await client.EnsureServiceReadyAsync(TimeSpan.FromSeconds(90)).ConfigureAwait(false);
|
|
|
|
JObject response = await client.RunCollisionTestAsync(
|
|
pathType,
|
|
DefaultCollisionTimeoutSeconds,
|
|
frameRate: TestFrameRate,
|
|
durationSeconds: TestDurationSeconds).ConfigureAwait(false);
|
|
Assert.IsTrue(response.Value<bool>("ok"), "测试 HTTP 接口返回失败: " + (string)response["error"]);
|
|
|
|
JObject data = (JObject)response["data"];
|
|
Assert.IsNotNull(data, "缺少测试结果 data");
|
|
|
|
Assert.AreEqual(pathType, (string)data["requestedPathType"], "请求的路径类型不匹配");
|
|
|
|
JObject route = (JObject)data["route"];
|
|
Assert.IsNotNull(route, "缺少 route");
|
|
Assert.AreEqual(pathType, (string)route["pathType"], "返回的路径类型不匹配");
|
|
Assert.IsFalse(string.IsNullOrWhiteSpace((string)route["name"]), "路径名为空");
|
|
|
|
JObject animatedObject = (JObject)data["animatedObject"];
|
|
Assert.IsNotNull(animatedObject, "缺少 animatedObject");
|
|
Assert.AreEqual("VirtualObject", (string)animatedObject["mode"], "当前集成测试应使用虚拟物体");
|
|
|
|
JObject animation = (JObject)data["animation"];
|
|
Assert.IsNotNull(animation, "缺少 animation");
|
|
Assert.AreEqual("Finished", (string)animation["currentState"], "动画未完成");
|
|
Assert.IsTrue((int)animation["totalFrames"] > 0, "动画总帧数应大于 0");
|
|
Assert.IsTrue(animation["detectionRecordId"] != null && (int)animation["detectionRecordId"] > 0, "检测记录 ID 无效");
|
|
|
|
CollisionReportAssertions.AssertReportStructure(data, route);
|
|
}
|
|
}
|
|
}
|
|
}
|