运行 同一线程 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
我有一些测试在数据库上执行一些写操作。我知道那不是真正的 单元 测试,但让我们把它放在一边。
为了让每个测试都能在干净的工作区中运行,我回滚了到目前为止的所有事务。但是,由于无法建立数据库锁,我随机出现并发错误。
这是我的代码:
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