2012-03-14 97 views
11

我想知道在MSTest下的测试类中初始化实例变量的最佳做法是什么。假设我有一个测试课,其中有很多开销来嘲弄和设置支持对象。我只想做一次,而不是在每个测试中重复相同的代码。我的想法是使用MyClassInitialize方法初始化所有测试可以访问的全局实例变量。这样,我一次初始化全局实例变量,并在每次测试运行时使用它们。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 
    } 
} 

回答

8

尽可能地使用[TestInitialize]和[TestCleanup]。单元测试应该是快速和独立的,所以最简洁的方法是对每个测试进行初始化和清理。这可确保测试结果不受其他测试的影响。当一个测试的初始化需要很长时间时,你可能没有考虑单元测试,而是一个集成测试。

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

1

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

3

你有什么问题与静态?

如果你的ObjectThatIsUsedByAllTests真的可以在你的所有测试之间真正被100%共享,那么使它成为静态的并且使用ClassInitialize--就是这样。

如果不是,那么您必须对每个测试初始化​​TestInitialize。

+1

无法真正量化我的静态问题。它只是不“感觉”正确,但我无法解释为什么。 – meyousikmann 2012-03-15 11:57:38

+0

静态意味着它由班级拥有。非静态的东西由类的实例拥有。当试图确定一件事是否应该是静态的时,问问自己'这是整个班级拥有还是只是一个实例? – Tristan 2014-10-03 04:16:30