You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NUnit多程序集测试单线程执行:解决ArcGIS数据库锁冲突

解决NUnit控制台运行ArcGIS数据库测试的并发锁问题

首先,你的推测完全正确——NUnit3控制台默认会并行处理不同测试程序集的测试,这就导致两个测试集同时尝试获取Access数据库的锁,触发了ArcObjects的COM异常。ReSharper测试运行器之所以正常,是因为它默认不会启用跨程序集的并行执行,而是按顺序跑测试。

下面是几个能强制所有测试单线程执行的有效方法:

1. 使用NUnit控制台的--workers=1参数

这是最直接的解决方案,通过指定工作线程数为1,彻底禁用NUnit的并行执行能力。修改你的运行命令为:

nunit3-console Test1.dll Test2.dll --workers=1

这样所有测试都会在同一个线程里按顺序执行,就不会出现数据库锁冲突了。

2. 配置NUnit全局禁用并行

如果不想每次都加命令行参数,可以创建一个nunit3.config配置文件,添加并行控制的配置:

<NUnit>
  <TestRunner>
    <!-- 设置Workers为1禁用并行 -->
    <Parallelize Workers="1" />
  </TestRunner>
</NUnit>

然后运行测试时指定该配置文件:

nunit3-console Test1.dll Test2.dll --config=nunit3.config

3. 确认NonParallelizable属性的正确使用

你提到添加了NonParallelizable属性无效,可能是因为只加在了测试类上。要确保在程序集级别添加该属性,在每个测试程序集的AssemblyInfo.cs中添加:

[assembly: NonParallelizable]

不过需要注意:NUnit3的NonParallelizable属性默认只会阻止同一程序集内的测试并行,但跨程序集的测试仍然可能并行执行。所以结合--workers=1才是最稳妥的方案。

关于ApartmentState.STA的问题

你尝试设置Apartment(ApartmentState.STA)后控制台无法结束,大概率是因为ArcGIS的COM对象在STA线程中需要正确释放资源。如果你的COM对象必须在STA线程运行,可以结合--workers=1和程序集级别的STA属性,同时确保OneTimeTearDown中正确释放myWorkspace资源(比如调用COM对象的ReleaseComObject方法)。

最后再提醒一下:因为你的测试涉及数据库写入和回滚,单线程执行虽然解决了锁的问题,但会增加整体测试运行时间,这是必要的取舍,不过对于你的场景来说是完全合理的。

内容的提问来源于stack exchange,提问作者MakePeaceGreatAgain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:22:34