Подтвердить что ты не робот

Как последовательно запускать тестовые светильники NUnit?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Вы уверены в этом? Я просто попробовал это сделать.., поместив след в следующем виде в тестах в 3 diff NUnit, а затем "Запустить все". Кажется, что он не работает параллельно.

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

Ответ 3

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

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

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();
    }
}

Ответ 4

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