NUnit утверждает в отдельном потоке - PullRequest
4 голосов
/ 21 июня 2011

Может ли nunit применяться в контексте многопоточности. Я, конечно, не хочу, чтобы nunit тестировал мое многопоточное приложение, но хочу использовать утверждения nunit

Простой пример - этот тест «зеленый». Что я не прав?

[Test]
public void Test()
{
  Action action = Async;
  action.BeginInvoke(action.EndInvoke, null).AsyncWaitHandle.WaitOne();
}

private void Async()
{
  Assert.IsTrue(false);
  Assert.DoesNotThrow( () =>
                       {
                         Console.WriteLine("Async");
                         throw new InvalidOperationException();
                       });
}

Ответы [ 2 ]

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

Исполняемый файл запуска теста NUnit настроен на игнорирование исключений в не тестовых потоках.Вы можете настроить это поведение с помощью элемента конфигурации app.config:

legacyUnhandledExceptionPolicy

Вы можете настроить не тестовые потоки так, чтобы они вызывали необработанные исключения, и тогда тесты не пройдут.Предостережение заключается в том, что во время выполнения другого теста могут возникать исключения не тестовых потоков, поэтому вы можете не получить точную картину , который тест не пройден.Кроме того, поскольку это будет необработанное исключение, выполнение теста будет остановлено в момент возникновения исключения, а не продолжено, что является нормальным поведением.

Лучше, чем игнорировать, хотя, на мой взгляд.

В следующей статье подробно рассматриваются темы для тестера ReSharper, но принципы те же.

Тестер ReSharper - исключения скрытых потоков

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

Придуманный пример

    [Test]
    public void Test()
    {
        Exception ex = null;

        Action test = () =>
        {
            Console.WriteLine("Async");

            ex = new InvalidOperationException();
        };

        test.BeginInvoke(test.EndInvoke, null).AsyncWaitHandle.WaitOne();

        Assert.That(ex, Is.Null, "Exception did not happen.");
    }
1 голос
/ 21 июня 2011
Assert.IsTrue(false);

Будет вызывать исключение перед вызовом DoesNotThrow.Но NUnit не работает над несколькими потоками.Кросс-потоки - это больше интеграция, чем UnitTest.В целом, я бы рекомендовал не подвергать потоки / задачи извне и выполнять внутреннее поведение используемого объекта, чтобы вы могли высмеивать это поведение в целях тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...