Как запустить тестовые приборы NUnit поочередно? - PullRequest
26 голосов
/ 21 июня 2011

У меня есть несколько наборов интеграционных тестов, реализованных в C # / NUNit. Каждый набор тестов представляет собой отдельный класс, каждая настройка прибора создает и заполняет базу данных SQL Server из сценариев. Раньше до Resharper 5.1 все работало нормально.

К сожалению, Resharper 5.1 начинает запускать несколько приборов одновременно. Это серьезное изменение - все они пытаются создать и заполнить одну и ту же базу данных, что, очевидно, приводит к беспорядку. Можно ли как-нибудь заставить Resharper запускать мои тестовые приборы поочередно?

Если нет, что бы вы предложили запускать мои тестовые устройства NUnit поочередно, по одному устройству за раз? Порядок выполнения отдельных тестов не имеет значения.

Ответы [ 4 ]

23 голосов
/ 21 июня 2011

Я не знаю, возможно ли предотвратить ReSharper от параллельного запуска тестов;в противном случае может работать следующий хак: создать статический класс со статическим членом только для чтения Monitor.Затем в [TestFixtureSetUp] наберите Enter() на мониторе и наберите Exit() на мониторе в [TestFixtureTearDown].Таким образом, одновременно будет разрешено запускать только одно тестовое устройство.Не красиво, хотя ...

1 голос
/ 24 июня 2011

Ты уверен в этом? Я только что попробовал это ..., поместив след следующей формы в тестах в 3 различных приборах NUnit с последующим "Run all". Кажется, не работает параллельно.

Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Start");
Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Done");

Вывод, который я вижу: (R # Build 5.1.1753.1)

01:06:41.6639IOC
01:06:41.6649Done - IOC

01:06:41.6679VC:Start
01:06:41.6729VC:Done

01:06:41.2439Mef
01:06:41.6589Mef-Done
0 голосов
/ 21 июня 2011

Дайте им алфавитные имена, то есть поставьте перед ними букву, обозначающую их порядок выполнения. Если вам нужно, чтобы это произошло, вы также должны принять это противное соглашение об именах.

0 голосов
/ 21 июня 2011

Если тестируемый код не имеет собственного управления транзакциями, вы можете запускать каждый тест внутри транзакции.Таким образом, различные тесты не будут мешать друг другу.Кроме того, вам не нужно беспокоиться об очистке после каждого теста, поскольку транзакция каждого теста может просто прерваться после его завершения.

В наших проектах мы обычно позволяем нашим интеграционным тестам наследоваться от классаэто выглядит примерно так:

public class TransactionalTestFixture
{
    private TransactionScope TxScope;

    [SetUp]
    public void TransactionalTestFixtureSetUp()
    {
        TxScope = new TransactionScope(TransactionScopeOption.RequiresNew, 
                                       new TransactionOptions {IsolationLevel = IsolationLevel.Serializable});
    }

    [TearDown]
    public void TransactionalTestFixtureTearDown()
    {
        TxScope.Dispose();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...