Запустите все тесты в одном потоке 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. Теперь, когда я использую 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.


person HimBromBeere    schedule 29.09.2020    source источник
comment
Зная ваши ответы отсюда, я не уверен, поможет ли это вам. Как показано здесь, вам нужно добавить ApartmentState.STA в сборку , уровень класса и метода. Вы пробовали это? Не совсем понятно мне из вашего вопроса.   -  person nilsK    schedule 29.09.2020
comment
@nilsK Вау, это очень много, так как есть сотни тестов. Я попробую это, хотя.   -  person HimBromBeere    schedule 29.09.2020


Ответы (1)


По умолчанию консоль NUnit будет запускать несколько тестовых сборок параллельно. Добавьте --agents=1, чтобы две сборки запускались последовательно под одним агентом.


Просто чтобы прояснить некоторые другие вещи, которые вы пробовали...

[NonParallelizable] используется для предотвращения распараллеливания разных тестов в рамках одной сборки. По умолчанию тесты в сборке не выполняются параллельно, поэтому добавление этого атрибута, когда вы специально не добавили [Parallelizable] на более высоком уровне, не будет иметь никакого эффекта.

[Apartments(Apartment.STA)] можно добавить как атрибут уровня сборки, и его не нужно добавлять для каждого теста, как указано в комментариях. Ознакомьтесь с документацией здесь: https://docs.nunit.org/articles/nunit/writing-tests/attributes/apartment.html

person Chris    schedule 29.09.2020
comment
Это круто, так как мне не нужны никакие атрибуты, и поэтому я могу оставить свой тестовый код как есть. И последний вопрос: что, если я хочу запускать все тесты чтения параллельно и только тесты письма последовательно? Разве это не должно быть возможно и с одним агентом? Так что я бы просто добавил [Parallelizable] к тестам, которые выполняют только операции чтения в моей БД, и все в порядке (или альтернативно сделать сборку параллелизуемой, а тесты записи — нет)? - person HimBromBeere; 30.09.2020
comment
Это один из вариантов, да! Наиболее эффективный способ сделать это зависит от того, как разделены ваши тесты чтения/записи. Вероятно, стоит быстро прочитать документы здесь, чтобы увидеть различные варианты здесь. =) --› docs.nunit.org/articles/nunit /письменные тесты/атрибуты/ - person Chris; 30.09.2020