在运行时禁用选定的自动测试

时间:2010-04-30 04:12:28

标签: c# automated-tests rhino-mocks

是否可以在运行时禁用所选的自动化测试?

我正在使用VSTS和rhino模拟并进行一些需要安装外部依赖性的集成测试(MQ)。并非我团队中的所有开发人员都安装了这个。

目前,所有需要MQ的测试都从一个基类继承,该基类检查是否安装了MQ,如果没有,则将测试结果设置为不确定。这可以阻止测试运行,但会将测试运行标记为unsuccseessful并且可以隐藏其他故障。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最终解决了这个问题,这就是我所做的。

在我的每个测试类(或类中只有少量测试需要MQ的方法)中有MQ依赖项时,我将以下内容添加到类(或方法)decleration

#if !RunMQTests
    [Ignore]
#endif

这会禁用测试,除非您有条件比较符号RunMQTests已解除,此符号未在项目文件中定义,因此默认情况下禁用测试。

要在开发人员必须记住是否安装了MQ以及添加或删除条件比较符号的情况下启用这些测试,我创建了一个自定义构建任务,它将告诉我们MQ是否已安装。

/// <summary>
/// An MSBuild task that checks to see if MQ is installed on the current machine.
/// </summary>
public class IsMQInstalled : Task
{
    /* Constructors removed for brevity */

    /// <summary>Is MQ installed?</summary>
    [Output]
    public bool Installed { get; set; }

    /// <summary>The method called by MSBuild to run this task.</summary>
    /// <returns>true, task will never report failure</returns>
    public override bool Execute()
    {
        try
        {
            // this will fail with an exception if MQ isn't installed
            new MQQueueManager();
            Installed = true;
        }
        catch { /* MQ is not installed */ }

        return true;
    }
}

然后我们只需要将任务添加到测试项目文件的顶部即可将其挂钩到构建过程中。

<UsingTask TaskName="IsMQInstalled" AssemblyFile="..\..\References\CustomBuildTasks.dll" />

并在BeforeBuild目标中调用新的自定义任务,并在此计算机安装了MQ时设置条件比较符号。

<Target Name="BeforeBuild">
  <IsMQInstalled>
    <Output TaskParameter="Installed" PropertyName="MQInstalled" />
  </IsMQInstalled>
  <Message Text="Is MQ installed: $(MQInstalled)" Importance="High" />
  <PropertyGroup Condition="$(MQInstalled)">
    <DefineConstants>$(DefineConstants);RunMQTests</DefineConstants>
  </PropertyGroup>
</Target>

这使得安装了MQ的用户可以运行我们的MQ集成测试,而不会让那些没有安装MQ的用户的测试运行失败。