SpecFlow — запуск параллельных тестов

#visual-studio-2010 #unit-testing #specflow

#visual-studio-2010 #модульное тестирование #specflow

Вопрос:

Я внедряю тесты с использованием SpecFlow, которые не имеют ничего общего друг с другом. Существует ли параметр конфигурации для SpecFlow, который позволяет выполнять параллельные тесты? Я использую VS10 и MSTest runner, которые поддерживают запуск «до 5 параллельных модульных тестов», как они утверждают в документации.

Спасибо, Макс.yz

Комментарии:

1. Для SpecFlow существует новый специализированный тестовый модуль SpecRun ( http://www.specrun.com ), который позволяет выполнять параллельные тесты наряду с некоторыми другими функциями интеллектуального интеграционного тестирования.

Ответ №1:

Чтобы добиться этого, я перешел с MSTest на MbUnit. Вы можете добиться параллелизма на уровне тестовых приспособлений с помощью MbUnit, используя ParallelizableAttribute. Однако , поскольку тестовые приспособления генерируются из .мне пришлось взять исходный код SpecFlow и изменить класс MbUnitTestGeneratorProvider в TechTalk.SpecFlow.Проект генератора для вывода атрибута ParallelizableAttribute. Таким образом, в итоге вы получаете что-то вроде этого:

 public class MbUnitTestGeneratorProvider : IUnitTestGeneratorProvider
{
    private const string TESTFIXTURE_ATTR = "MbUnit.Framework.TestFixtureAttribute";
    private const string PARALLELIZABLE_ATTR = "MbUnit.Framework.ParallelizableAttribute";
    private const string TEST_ATTR = "MbUnit.Framework.TestAttribute";
    private const string ROWTEST_ATTR = "MbUnit.Framework.RowTestAttribute";
    private const string ROW_ATTR = "MbUnit.Framework.RowAttribute";
    private const string CATEGORY_ATTR = "MbUnit.Framework.CategoryAttribute";
    private const string TESTSETUP_ATTR = "MbUnit.Framework.SetUpAttribute";
    private const string TESTFIXTURESETUP_ATTR = "MbUnit.Framework.FixtureSetUpAttribute";
    private const string TESTFIXTURETEARDOWN_ATTR = "MbUnit.Framework.FixtureTearDownAttribute";
    private const string TESTTEARDOWN_ATTR = "MbUnit.Framework.TearDownAttribute";
    private const string IGNORE_ATTR = "MbUnit.Framework.IgnoreAttribute";
    private const string DESCRIPTION_ATTR = "MbUnit.Framework.DescriptionAttribute";

    public bool SupportsRowTests { get { return true; } }

    public void SetTestFixture(CodeTypeDeclaration typeDeclaration, string title, string description)
    {
        typeDeclaration.CustomAttributes.Add(
            new CodeAttributeDeclaration(
                new CodeTypeReference(TESTFIXTURE_ATTR)));

        typeDeclaration.CustomAttributes.Add(
            new CodeAttributeDeclaration(
                new CodeTypeReference(PARALLELIZABLE_ATTR)));

        SetDescription(typeDeclaration.CustomAttributes, title);
    }
  

Если вы скомпилируете это и будете использовать, то в итоге получите распараллеливаемые тестовые приспособления:

 [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.6.1.0")]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[MbUnit.Framework.TestFixtureAttribute()]
[MbUnit.Framework.ParallelizableAttribute()]
[MbUnit.Framework.DescriptionAttribute("Test")]
public partial class TestFeature
{
  

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

Алекс.

Ответ №2:

Существует новый инструмент под названием SpecRun, который недавно был выпущен создателями SpecFlow. SpecRun позволит вам запускать эти тесты параллельно. Если вы используете SpecRun.Пакет Nunit с его помощью вы можете запускать тесты NUnit параллельно. Мы используем SpecRun на нашем сервере CI для параллельного выполнения тестов, но разработчики используют любой выбранный ими тестовый модуль.

Изменение вашей тестовой среды может привести к сбоям. Поскольку все наши тесты запускались в NUnit, мы просто добавили новый бегун SpecRun, и больше ничего не изменилось. Очень простой и прозрачный для разработчиков. И поскольку он доступен на NuGet, его было очень легко установить.

Комментарии:

1. это платное программное обеспечение

Ответ №3:

Я создал решение, которое генерирует файл сборки nant, который использует nunit в пользовательской параллельной задаче nant:

https://github.com/MartyIce/SpecflowParallelizer

Из-за того, как были написаны мои устаревшие тесты, у меня возникают проблемы с параллелизмом бэкенда, поэтому для меня это не было успешным (пока), но, надеюсь, это сработает для кого-то другого.

Ответ №4:

В файле MSTest .testsettings есть опция для тестового проекта. По умолчанию программа запуска тестирования будет запускать только 1 тест за раз, изменив атрибут parallelTestCount узла Execute на 0. Он будет выполняться на столько потоках, сколько доступно (по какой-то причине ограничено максимум 5).

Просто щелкните правой кнопкой мыши файл .teststtings и выберите открыть с помощью; выберите редактор XML и готово.

Вы не должны запускать какие-либо закодированные тесты пользовательского интерфейса или настраивать какие-либо сборщики данных, чтобы это работало.

Более подробное объяснение смотрите в этой статье