在运行测试方法时侵入 MsTest 的任何方法

本文关键字:MsTest 任何 方法 运行 测试方法 | 更新日期: 2023-09-27 18:35:41

有没有一种方法或方法,例如测试方法的方法装饰器或属性,可以说:

"在运行方法 B 之前运行方法 C"

所以基本上你在 C 和 B 之间创建了一个依赖关系。我知道测试最好是原子的,而且应该是原子的,但有时最好保持你的测试小而切中要害。当它要查找的项目根本不存在时,不运行"RemoveItem"测试方法是有意义的。

大多数人会事先添加该项目,然后测试以查看是否可以删除 - "全部在同一测试中"。我不喜欢这种方法,并希望使我的测试更小,更指向点,并且尽可能更原子。

在运行测试方法时侵入 MsTest 的任何方法

就像你说的,你不希望测试之间相互依赖。如果您不喜欢在删除测试中的"删除"之前使用"添加",从而在错误的位置测试 Add 方法,那么我建议使用 testInitialize 来设置测试可以操作的一些对象。但是,我确实建议在运行 Remove 之前实际运行 Add 的做法,在 Remove 的测试中。

[Testclass]
public class TestStacks
{
  private Stack<string> emptyStack;
  private Stack<string> singleItemStack;
  [TestInitialize]
  public void Setup()
  {
    singleItemStack = new Stack<string>();
    singleItemStack.Push("Item");
    emptyStack = new Stack<string>();
  }
  [TestMethod]
  public void TestPush()
  {       
    emptyStack.Push("Added");
    Assert.AreEqual(1, emptyStack.Count);
  }
  [TestMethod]
  public void TestRemove()
  {       
    singleItemStack.Pop();
    Assert.AreEqual(0, singleItemStack.Count);
  }  
  [TestMethod]
  [ExpectedException(typeof(InvalidOperationException))]
  public void TestPopFromEmpty()
  {       
    emptyStack.Pop();
  }  
}

如果您需要在测试移除之前添加某些项目,则添加项目的最佳位置arrange删除测试的一部分。这将使移除测试的上下文变得清晰。

但是 DRY 原则在这里也有效 - 您可以将加法逻辑移动到单独的帮助程序方法。然后调用它两次 - 在测试添加和安排删除上下文时:

[Testclass]
public class Tests
{        
    [TestMethod]
    public void TestAddition()
    {
        AddItem();
        // Assert addition           
    }   
    [TestMethod]
    public void TestRemoval()
    {
       AddItem();
       // Remove item
       // Assert removal
    } 
    private void AddItem()
    {
       // Add item           
    }
}