【问题标题】:How do I tell mstest to ignore tests in a base class but not in subclasses?如何告诉 mstest 忽略基类中的测试而不是子类中的测试?
【发布时间】:2011-11-22 23:37:44
【问题描述】:

我有一个正在开发的日志解析器,这个日志解析器有一个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] 而出错,因为它本身不是有效的测试。

p>

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

【问题讨论】:

    标签: c# inheritance mstest


    【解决方案1】:

    原来 MSTest 有一个 [Ignore] 属性。我将它和[TestClass] 属性放在我的基础测试中,它正确地忽略了基础测试的测试方法,同时在子类下运行时使用基础测试方法

    【讨论】:

      【解决方案2】:

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

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

      [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 找到

      【讨论】:

      • 哇,呃。不知道为什么我不认为只将基类标记为抽象。这可能真的可以,只需要我回家后测试它。
      • 只是将测试设置为抽象是行不通的。您如何告诉 MSTest 不运行特定类别?
      • 在visual studio测试列表编辑器中,你可以按类别对测试进行分组,我明天将答案放在抽象/派生类中。
      • 我意识到 MSTest 有一个 [Ignore] 属性,不幸的是,这比这些方法容易得多。在我看来,这两者都让我很难立即看到发生了什么。
      【解决方案3】:

      当一个测试夹具继承另一个夹具时,从未见过这种方法...我建议考虑另一种方法,而不是围绕这种测试基础设施工作。

      考虑:

      1. 将所有测试移动到一个由[TestClass] 标记的类中或
      2. 创建两个完全独立的测试分类,这样它们就不会耦合和相互影响

      【讨论】:

      • 希望它们相互影响,以确保所有 ILogStore 实现的核心功能在其行为上保持一致,并且当需求发生变化时ILogStore 检索方法旨在返回它已确认适用于所有实现的新要求。
      猜你喜欢
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2017-07-24
      • 2015-01-15
      • 2017-12-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多