MSTest,MyClassInitialize和实例变量

时间:2012-03-14 19:47:31

标签: c# visual-studio-2010 mstest

我想知道在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
    }
}

3 个答案:

答案 0 :(得分:9)

尽可能使用[TestInitialize]和[TestCleanup]。单元测试应该快速且隔离,因此最简洁的方法是对每个测试进行初始化和清理。这可确保测试结果不受另一个测试的影响。当测试的初始化需要很长时间时,您可能没有进行单元测试而是进行集成测试。

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

答案 1 :(得分:3)

静电有什么问题?

如果您的ObjectThatIsUsedByAllTests真的可以真正100%在所有测试之间共享,那么将其设置为静态并使用ClassInitialize - 这就是它的用途。

如果不是,则必须按TestInitialize进行初始化,这是TestInitialize的用途。

答案 2 :(得分:1)

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