SpecFlow - запуск параллельных тестов - PullRequest
8 голосов
/ 22 мая 2011

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

Спасибо, max.yz

Ответы [ 4 ]

2 голосов
/ 01 мая 2015

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

https://github.com/MartyIce/SpecflowParallelizer

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

2 голосов
/ 08 октября 2012

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

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

2 голосов
/ 24 мая 2011

Я перешел из MSTest в MbUnit, чтобы добиться этого.Вы можете достичь параллелизма на уровне тестовых приборов с помощью MbUnit, используя ParallelizableAttribute.Однако, поскольку тестовые фиксации генерируются из файлов .feature Gherkin, мне пришлось взять исходный код SpecFlow и изменить класс MbUnitTestGeneratorProvider в проекте TechTalk.SpecFlow.Generator для вывода 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
{

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

Алекс.

0 голосов
/ 25 января 2012

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

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

Запрещается запускать какие-либо тесты Coded UI или настраивать сборщики данных, чтобы это работало.

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

...