我如何告诉mstest忽略基类中的测试而不是子类中的测试?

时间:2011-11-21 16:45:50

标签: c# inheritance mstest

我有一个我正在处理的日志解析器,这个日志解析器有一个ILogStore接口,它定义了任何日志记录存储引擎的基本方法(在内存中,在数据库中等等)。这个想法是开发人员和用户可以通过MEF插件界面添加或删除日志存储引擎。

但是,为了确认ILogStore实现可以正确存储,过滤和检索日志条目,我为单元/集成/ API测试创建了一个基类:

public class LogStoreBaseTests
{
    protected ILogStore _store;

    [TestMethod]
    public void Can_Store_And_Retrieve_Records() { }

    [TestMethod]
    public void Can_Filter_Records_By_Inclusive_Text() { }

    [TestMethod]
    public void Can_Filter_Records_By_Exclusive_Text() { }

    // etc...
}

我通过执行以下操作来测试我执行的任务:

[TestClass]
public class InMemoryLogStoreTests : LogStoreBaseTests
{
    [TestInitialize]
    public void Setup()
    {
        _store = new InMemoryLogStore();
    }
}

这很好用,除了MsTest注意到基类中的方法有[TestMethod]但是因为类没有[TestClass]而有错误,因为它不是因为它不是有效的测试自己的。

如何在不从子类运行时告诉MsTest忽略这些方法?

3 个答案:

答案 0 :(得分:13)

结果MSTest具有[Ignore]属性。我在基础测试中放置了[TestClass]属性,并且在子类下运行时使用基本测试方法正确地忽略了基本测试的测试方法

答案 1 :(得分:2)

不确定您是否可以告诉MS测试忽略某些测试,但您可以要求它不运行某些测试类别。

例如,以下属性将测试置于集成类别

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
    public class IntegrationTestAttribute : TestCategoryBaseAttribute
    {
        public IList<string> categories;

        public IntegrationTestAttribute()
        {
            this.categories = new List<String> { "Integration" };
        }

        public override IList<string> TestCategories
        {
            get
            {
                return this.categories;
            }
        }
    }

您可以采用另一种方法将基类标记为抽象,并使测试调用某些抽象方法,这样任何实现类的人都会实现这些方法。

例如

[TestClass]
public abstract class BaseUnitTest
{
    public BaseUnitTest(){}
    private TestContext testContextInstance;        
    public TestContext TestContext
    {
        get
        {
            return testContextInstance;
        }
        set
        {
            testContextInstance = value;
        }
    }        
    [TestMethod]
    public void can_run_this_test_for_each_derived_class()
    {
        Assert.IsNotNull(this.ReturnMeSomething());
    }
    protected abstract string ReturnMeSomething();
}

[TestClass]
public class Derived1 : BaseUnitTest
{

    protected override string ReturnMeSomething()
    {
        return "test1";
    }
}

[TestClass]
public class Derived2 : BaseUnitTest
{
    protected override string ReturnMeSomething()
    {
        return null;
    }
}

另一种方法是使用类似MSTestExtension的AOP,可以找到代码here

答案 2 :(得分:0)

当一个测试夹具继承另一个时,从未见过这种方法......我建议考虑采用其他方法而不是解决这些测试基础设施问题。

考虑:

  1. 将所有测试移至标有[TestClass]
  2. 的单个班级
  3. 创建两个完全独立的测试类别,以便它们不会耦合并相互影响