运行 同一线程 NUnit 中的所有测试

Run all tests in same thread NUnit

我有一些测试在数据库上执行一些写操作。我知道那不是真正的 单元 测试,但让我们把它放在一边。

为了让每个测试都能在干净的工作区中运行,我回滚了到目前为止的所有事务。但是,由于无法建立数据库锁,我随机出现并发错误。

这是我的代码:

Test1.dll

[TestFixture]
class MyTest1
{
    [OneTimeSetup]
    public void SetupFixture()
    {
        myworkspace.StartEditing(); // this will establish a lock on the underlying database
    }
    [OneTimeTearDow]
    public void TearDownFixture()
    {
        myWorkspace.Rollback();
    }
}

相同的代码也存在于另一个测试程序集中,我们将其命名为Test2.dll。现在,当我使用 nunit3-console Test1.dll Test2.dll 使用 nunit-console-运行ner 时,出现以下错误:

System.Runtime.InteropServices.COMException : Table 'GDB_DatabaseLocks' cannot be locked; it is currently used by user 'ADMIN' (this is me) on host 'MyHost' at ESRI.ArcGIS.Geodatabase.IWorkspaceEdit.StartEditing(Boolean withUndoRedo)

myWorkspace 是与 MS-Access 数据库相关的 COM 对象(Arcobjects 接口 IWorkspace)。我假设这是因为 nunit 创建了多个同时进入上述代码的线程。所以我向两个程序集添加了 NonParalizable 属性,但没有成功。我还尝试将 Apartment(ApartmentState.STA) 添加到我的程序集中,以便在单个线程中执行所有内容,这导致控制台永远不会完成。

让我抓狂的是,运行使用 ReSahrpers test-运行ner 进行测试非常完美。但是我不知道 ReSharper 如何启动 nunit。 ReSharper 似乎不使用 nunit-console,而是使用 nunit-API。

是否有另一种方法可以在单个线程中强制我的所有测试 运行?我使用 nunit3.10 和 ArcGIS 10.8。

默认情况下,NUnit 控制台将运行 并行测试多个程序集。添加 --agents=1 以强制两个程序集在单个代理下按顺序 运行。


只是为了澄清您也尝试过的其他一些事情...

[NonParallelizable] 用于防止单个程序集中不同测试的并行化。默认情况下,程序集中的测试 不会 运行 并行,因此当您没有在更高级别明确添加 [Parallelizable] 时添加此属性将不会效果。

[Apartments(Apartment.STA)] 可以添加为 assembly-level 属性,并且不必在每次测试时都添加,如评论中所述。在此处查看文档:https://docs.nunit.org/articles/nunit/writing-tests/attributes/apartment.html