MSTest、MyClassInitialize和实例变量

本文关键字:实例 变量 MyClassInitialize MSTest | 更新日期: 2023-09-27 18:27:44

我想知道在MSTest下初始化测试类中的实例变量的最佳实践是什么。假设我有一个测试类,在该类中模拟和设置支持对象会有很多开销。我只想做一次,而不是在每次测试中重复相同的代码。我的想法是使用MyClassInitialize方法初始化所有测试都可以访问的一些全局实例变量。这样,我初始化全局实例变量一次,每次测试运行时都会使用它们。

不幸的是,MyClassInitialize方法是静态的,因此无法初始化全局实例变量。我曾想过将全局实例变量设置为静态,但似乎不是正确的解决方案。接下来,我想把初始化代码放在测试类本身的构造函数中,但我内心一直在说MyClassInitialize是我应该使用的。另一个想法是使用MyTestInitialize,因为该方法不是静态的,但这将是在每次测试中反复创建对象。这样合适吗?

是否有关于如何在测试中使用变量的最佳实践,其中这些变量只需要在测试运行前初始化一次?下面是我所说的一个做作的例子。

[TestClass()]
public class ProgramTest
{
    // this object requires extensive setup so would like to just do it once
    private SomeObjectThatIsUsedByAllTestsAndNeedsInitialization myObject;
    private TestContext testContextInstance;
    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext)
    {
        // initializing SomeObjectThatIsUsedByAllTestsAndNeedsInitialization clearly will
        // not work here because this method is static.
    }
    [TestMethod()]
    public void Test1()
    {
        // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here
    }
    [TestMethod()]
    public void Test2()
    {
        // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here
    }
    [TestMethod()]
    public void Test3()
    {
        // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here
    }
}

MSTest、MyClassInitialize和实例变量

尽可能使用[TestInitialize]和[TestCleanup]。单元测试应该是快速和孤立的,所以最干净的方法是初始化和清理每个测试。这样可以确保测试的结果不受另一个测试的影响。当测试的初始化需要很长时间时,您可能不需要单元测试,而是需要集成测试。

例外情况是转到数据库或其他资源的集成测试,您可能希望执行一次操作,然后使用多个断言(TestMethods)验证结果。我曾经有一个特定的泛型类,它的上下文类型每个类只初始化一次。但现在我认为这太过分了,只是把依赖关系和结果放在私有静态变量中。

静态有什么问题?

如果你的ObjectThatIsUsedByAllTest真的可以在所有测试之间100%共享,那么就让它成为静态的并使用ClassInitialize——这就是它的用途。

如果不是,那么你必须在每次测试中初始化它,这就是TestInitialize的作用。

您可以在其他类中使用实例变量的惰性初始化。不过不要忘记,MSTest将为它运行的每个测试方法创建一个测试类的新实例。因此,您希望在测试方法中保持该类中的任何变量最好是静态的。