在基类中使用TestInitialize/TestCleanup的c#单元测试

本文关键字:TestCleanup 单元测试 TestInitialize 基类 | 更新日期: 2023-09-27 18:11:00

我正在测试一个模块,其中每个测试类共享相同的行为:

  • 开始事务
  • 执行SQL查询
  • 回滚事务

我决定使用TestInitialize和TestCleanup分别执行事务的Begin和Rollback。

直接的方法是在父类中编写TestInitialize/TestCleanup,但这在这个测试框架中是行不通的。

绕过的方法是使用部分类。这种方法在我的情况下似乎是可行的,因为我的测试类主要是无状态的。事件不是理想的解决方案,但它至少为我节省了几个复制/粘贴操作。

有人知道更好的方法吗?

下面是一个部分类解决方案的示例:在我的例子中,我分别测试每个模块,对于这个例子,我将使用Sales模块:

SalesTest.cs文件:

[TestClass]
public partial class SalesTest
{
    [TestInitialize]
    public void Setup()
    {
        //begin transaction
    }
    [TestCleanup]
    public void Cleanup()
    {
        //rollback transaction
    }
}

SalesTest。顺序文件:

public partial class SalesTest
{
    [TestMethod]
    public void SaveOrder_OnlyRequiredValuesFilled_SuccessfullySaved()
    {
        //Run some SQL queries 
    }
}

在基类中使用TestInitialize/TestCleanup的c#单元测试

看起来你正在使用Microsoft.VisualStudio.TestTools.UnitTesting框架。我不认为为Cleanup和Initialize使用基类有任何问题。

   [TestClass]
    public class TestDemo : BaseTests
    {
        [TestMethod]
        public void SaveOrder_OnlyRequiredValuesFilled_SuccessfullySaved()
        {
            //Run some SQL queries 
        }
    }
    [TestClass]
    public abstract class BaseTests
    {
        [TestInitialize]
        public void Setup()
        {
            Console.WriteLine("Setup executed.");
            //begin transaction
        }
        [TestCleanup]
        public void Cleanup()
        {
            Console.WriteLine("Cleanup executed.");
            //rollback transaction
        }
    }

这将工作得很好,我可以将BaseTest继承到任何测试,初始化和清理将在任何测试之前和之后执行。