繁体   English   中英

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

[英]How do I tell mstest to ignore tests in a base class but not in subclasses?

我有一个我正在处理的日志解析器,这个日志解析器有一个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忽略这些方法?

结果是MSTest有一个[Ignore]属性。 我把它和[TestClass]属性放在我的基础测试上,并且在子类下运行时使用基本测试方法正确地忽略了基本测试的测试方法

不确定您是否可以告诉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,代码可以在这里找到

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

考虑:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM