2016-11-02 9 views
0

У меня есть модульные тесты в моем проекте C# (VisualStudio 2015, Nunit). Я хочу проверить методы во многих разных ситуациях с разными параметрами, для этого я использовал TestCases. Каждый метод тестирования работает очень медленно - несколько секунд, а число TestCases в моих проектах растет.Платформа тестирования .NET с параллельными тестовыми шкафами

Итак, теперь тестирование занимает несколько минут. Я попытался провести параллельные эти тесты, переместив каждый тест на разделение TestFixture - Nunit позволяет параллельно запускать TestFixtures - Nunit Documentation. Это немного изменило ситуацию, но не значительно. Я хочу проводить параллельные тесты не на уровне TestFixture, а на уровне тестовых регистров. Я не знаю, как это сделать. Я прочитал документацию для Nunit, Xunit, MBUnit и т. Д. И не нашел ответа.

Как я могу запускать свои тесты параллельно, таким образом, чтобы тестовые окна запускались одновременно? Какую структуру использовать?

Мои тесты пример псевдокода:

public static class GeneralTestCases 
{ 
    public static IEnumerable TestStoresCredentials 
    { 
     get 
     { 
      yield return new TestCaseData(...).SetName("incorrect password"); 
      ... 
      yield return new TestCaseData(...).SetName("incorrect login"); 
     } 
    } 
} 

[ TestFixture ] 
[ Parallelizable ] 
internal class GetProducts : BaseTest 
{ 
    [ Test ] 
    [ TestCaseSource(typeof(GeneralTestCases), "TestCases") ] 
    public void ReceiveProducts(TestCase case) 
    { 
     // ------------ Arrange 
     var service = CreateService(case.User, case.Key, ...); 

     // ------------ Act 
     var serviceResponse = service.GetProducts(case.SpecialType); 

     // ------------ Assert 
     ... 
     serviceResponse.Message.Should().NotBeNullOrEmpty(); 
     ... 
    } 
} 


[ TestFixture ] 
[ Parallelizable ] 
internal class GetOrders : BaseTest 
{ 
    [ Test ] 
    [ TestCaseSource(typeof(GeneralTestCases), "TestCases") ] 
    public void ReceiveOrders(TestCase case) 
    { 
     // ------------ Arrange 
     var service = CreateService(case.User, case.Key, ...); 

     // ------------ Act 
     var serviceResponse = service.GetOrders(case.SpecialType); 

     // ------------ Assert 
     ... 
     serviceResponse.Message.Should().NotBeNullOrEmpty(); 
     ... 
    } 
} 

enter image description here

Update1: Я думаю о nCrunch, но я не это поможет или нет

+0

может быть, это помогает https://stackoverflow.com/questions/3313163/how-can-i-run-nunit-tests-in-parallel – C1sc0

ответ

0

XUnit запускает каждый тестовый класс (тестовый сбор) параллельно по умолчанию.

Подробнее here.

+0

Спасибо! Если я правильно понимаю, этот подход соответствует моей текущей реализации, не так ли? Каждый класс может запускаться параллельно, это означает, что мне нужно создать новый класс для каждого тестового примера. Это приводит к дублированию - 100500 классов с теми же членами. Мне нужно что-то вроде горизонтальной шкалы. Посмотрите на картинку в моем вопросе. – burzhuy

+0

Я думаю, что запуск 100500 параллельно не принесет вам лучших результатов.В любом случае, вы должны определить какой-то предел - это будет зависеть от машины (CPU, памяти и т. Д.) И каких тестов операций (связанных с ЦП или привязкой IO) –

+0

Конечно, я говорю о нескольких сотнях. Даже если он заполняется, будет 100500 - будет намного быстрее создать 100500 тестовых площадок вместо 100500 тестов – burzhuy

0

После некоторого исследования я нашел 2 способа одновременного запуска тестов.

  1. Nunit + Ncrunch позволяет запускать тесты параллельно (тестовые случаи распараллеливание поддерживается). Но для меня это не удобно. I не нравится графический интерфейс Ncrunch, и требуется время, чтобы сконфигурировать его в правильном порядке (длинные настройки пороговых значений тестов, настройки многопоточности и т. Д.). Также Ncrunch не является бесплатным.
  2. Nunit + Nunit tests runner console. Я выбираю этот путь. Он позволяет выполнять параллельно, он бесплатный, легко конфигурируется, может быть запущен с консоли. Вы можете настроить параллельное выполнение нескольких тестов в одном окне с коносом или запустить несколько консолей, каждый из которых выполняет 1 тест во время