У меня есть несколько тестов, которые выполняют некоторые операции записи в базе данных. Я знаю, что на самом деле это не модульное-тестирование, но давайте оставим это в стороне.
Чтобы каждый тест работал в чистом рабочем пространстве, я откатываю все выполненные до сих пор транзакции. Однако я случайно получаю ошибки параллелизма из-за блокировок базы данных, которые не могут быть установлены.
Это мой код:
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
. Теперь, когда я использую nunit-console-runner с помощью nunit3-console Test1.dll Test2.dll
, я получаю следующую ошибку:
System.Runtime.InteropServices.COMException: таблица «GDB_DatabaseLocks» не может быть заблокирована; в настоящее время он используется пользователем «ADMIN» (это я) на хосте «MyHost» в ESRI.ArcGIS.Geodatabase.IWorkspaceEdit.StartEditing(логическое значение withUndoRedo)
myWorkspace
— это COM-объект (Arcobjects-interface IWorkspace
), относящийся к базе данных MS-Access. Я предполагаю, что это связано с тем, что nunit создает несколько потоков, которые одновременно вводят приведенный выше код. Поэтому я безуспешно добавил атрибут NonParalizable
к обеим сборкам. Я также пытался добавить Apartment(ApartmentState.STA)
в свою сборку, чтобы выполнять все в одном потоке, в результате чего консоль никогда не завершалась.
Что меня сводит с ума, так это то, что запуск моих тестов с помощью ReSahrpers test-runner работает отлично. Однако я понятия не имею, как ReSharper запускает nunit. Похоже, ReSharper использует не nunit-console, а nunit-API.
Есть ли другой способ заставить все мои тесты выполняться в одном потоке? Я использую nunit3.10 и ArcGIS 10.8.
ApartmentState.STA
в сборку , уровень класса и метода. Вы пробовали это? Не совсем понятно мне из вашего вопроса. - person nilsK   schedule 29.09.2020