лучший способ для запуска многопоточных тестов nunit - PullRequest
3 голосов
/ 09 декабря 2008

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

Я не хочу начинать обсуждение более чем одного потока в модульном тесте. => "unit test" .Replace ("unit", "интегрирование");

Я уже прочитал много тем на нескольких форумах, знаю о CrossThreadTestRunner , но я ищу решение, которое интегрируется в nunit и не требует переписывания большого количества тестов. 1007 *

Ответы [ 3 ]

3 голосов
/ 23 июля 2010

Причина того, что исключения в не тестовых потоках (то есть в других порожденных потоках) не приводят к сбою тестов, заключается в том, что NUnit по умолчанию настроен на использование legacyUnhandledExceptionPolicy , который является параметром уровня .Net, который может быть применены через app.config, то есть:

<legacyUnhandledExceptionPolicy enabled="1"/>

Включение этого параметра (т. Е. Установка его в «1») приводит к исключениям, которые не возникают в главном потоке: игнорируется .

Я написал статью, в которой более подробно рассказывается об этой проблеме с помощью бегунка теста ReSharper, но он в равной степени относится и к бегунку теста NUnit:

http://gojisoft.com/blog/2010/05/14/resharper-test-runner-hidden-thread-exceptions/

0 голосов
/ 20 августа 2015

У меня была та же проблема, мое решение - перехватить исключение и увеличить счетчик исключений, поэтому метод Test должен просто установить счетчик исключений равным 0, чтобы подтвердить, что ни один поток не получил исключение.

Извлечение моего тестового кода после удаления определенных компонентов среды:

    const int MaxThreads = 25;
    const int MaxWait = 10;
    const int Iterations = 10;
    private readonly Random random=new Random();
    private static int startedThreads=MaxThreads ;
    private static int exceptions = 0;

...

[Test]
    public void testclass()
    {
        // Create n threads, each of them will be reading configuration while another one cleans up

        Thread thread = new Thread(Method1)
        {
            IsBackground = true,
            Name = "MyThread0"
        };

        thread.Start();
        for (int i = 1; i < MaxThreads; i++)
        {
            thread = new Thread(Method2)
            {
                IsBackground = true,
                Name = string.Format("MyThread{0}", i)
            };

            thread.Start();
        }

        // wait for all of them to finish
        while (startedThreads > 0 && exceptions==0)
        {
            Thread.Sleep(MaxWait);
        }
        Assert.AreEqual(0, exceptions, "Expected no exceptions on threads");
    }

    private void Method1()
    {
        try
        {
            for (int i = 0; i < Iterations; i++)
            {
            // Stuff being tested
                Thread.Sleep(random.Next(MaxWait));
            }
        }
        catch (Exception exception)
        {
            Console.Out.WriteLine("Ërror in Method1 Thread {0}", exception);
            exceptions++;
        }
        finally
        {
            startedThreads--;
        }
    }

    private void Method2()
    {
        try
        {
            for (int i = 0; i < Iterations; i++)
            {
                // Stuff being tested
                Thread.Sleep(random.Next(MaxWait));
            }
        }
        catch (Exception exception)
        {
            Console.Out.WriteLine("Ërror in Method2 Thread {0}", exception);
            exceptions++;
        }
        finally
        {
            startedThreads--;
        }
    }
0 голосов
/ 10 декабря 2008

Я решил проблему, создав дополнение для nunit, которое «устанавливает» ITestDecorator.

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