SpecFlow - 运行并行测试

时间:2011-05-22 08:41:35

标签: visual-studio-2010 unit-testing specflow

我正在使用SpecFlow实现与彼此无关的测试。是否有启用并行测试执行的SpecFlow配置选项?我正在使用VS10和MSTest运行程序,它支持运行“最多5个并行单元测试”,正如他们在文档中所声称的那样。

谢谢, max.yz

4 个答案:

答案 0 :(得分:2)

我从MSTest搬到MbUnit来实现这一目标。您可以使用ParallelizableAttribute在MbUnit的测试夹具级别实现并行性。但是,由于测试装置是从.feature Gherkin文件生成的,我必须获取SpecFlow源代码并修改TechTalk.SpecFlow.Generator项目中的MbUnitTestGeneratorProvider类以输出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
{

目前唯一的问题是你需要确保测试装置不会相互冲突。也就是说,来自一个夹具的测试会添加或修改数据库行,该行会破坏与其同时运行的测试。有很多方法可以解决这个问题,但这可能超出了原始问题的范围。

亚历。

答案 1 :(得分:2)

最近由SpecFlow的制造商发布了一个名为SpecRun的新工具。 SpecRun将允许您并行运行这些测试。如果您使用SpecRun.Nunit包,则可以并行运行NUnit测试。我们在CI服务器上使用SpecRun来并行运行测试,但开发人员使用他们选择的测试运行器。

更改测试框架可能会造成破坏性。因为我们所有的测试都在NUnit中开始,所以我们只是添加了新的SpecRun运行器而没有其他任何改变。对开发人员来说非常简单和透明。由于它可以在NuGet上使用,因此安装非常简单。

答案 2 :(得分:2)

我创建了一个生成nant构建文件的解决方案,该文件在自定义并行nant任务中使用nunit:

https://github.com/MartyIce/SpecflowParallelizer

由于我的遗留测试的编写方式,我得到了后端并发问题,所以它对我来说还没有成功(但是),但希望这对其他人有效。

答案 3 :(得分:0)

测试项目的MSTest .testsettings文件中有一个选项。 默认情况下,测试运行器一次只运行1次测试,通过将执行节点的 parallelTestCount 属性更改为0,它将在尽可能多的线程上运行(由于某种原因限制为最多5)

右键单击.teststtings文件并选择打开;选择一个XML编辑器然后离开。

您不得运行任何编码的UI测试或配置任何数据采集器以使其正常工作。

有关详细说明see this article