当前位置:  开发笔记 > 开发工具 > 正文

您是否使用TestInitialize或测试类构造函数来准备每个测试?为什么?

如何解决《您是否使用TestInitialize或测试类构造函数来准备每个测试?为什么?》经验,为你挑选了3个好方法。

这个问题涉及使用MSTest在Visual Studio中进行单元测试(这很重要,因为MSTest的执行顺序).标记为[TestInitialize]的方法和测试类构造函数都将在每个测试方法之前运行.

所以,问题是,你在这些领域中倾向于做什么?你是否避免在两者中进行某些活动?你的理由是什么:风格,技术,迷信?



1> Anthony Mast..:

构造函数只是该语言提供的结构.每个测试框架似乎都有自己的受控生命周期"初始化".您可能只会使用构造函数来改变您的本地人.

MSTest:您可以获得每个测试类的全新实例TestMethod.这可能是唯一可以在构造函数,初始化程序或测试方法中改变局部变量并且不影响其他测试方法的情况.

public class TestsForWhatever
{
    public TestsForWhatever()
    {
        // You get one of these per test method, yay!
    }

    [TestInitialize] 
    public void Initialize() 
    {
        // and one of these too! 
    }

    [TestMethod]
    public void AssertItDoesSomething() { }

    [TestMethod]
    public void AssertItDoesSomethingElse() { }
}

MSpec:你只有一次Establish,并Because为所有的断言(It).所以,不要在断言中改变你的本地人.并且不依赖于基本上下文中的本地变异(如果使用它们).

[Subject(typeof(Whatever))]
public class When_doing_whatever
{
    Establish context = () => 
    { 
        // one of these for all your Its
    };

    Because of = () => _subject.DoWhatever();

    It should_do_something;
    It should_do_something_else;
}


您可能还会指出`[ClassInitialize]`每次测试运行只运行一次(在所有内容之前),因此它可以用于任何昂贵的设置例程.
-1:你不应该讨厌你的问题; 实际上,这很有道理.例如,参见[xUnit.net](https://github.com/xunit/xunit):它建议使用构造函数作为*测试用例初始化程序."只是一种由语言提供的结构"并不是一件小事; 任何人编写任何类型的框架(包括测试框架)都应该*尝试重新发明轮子,并使用明确定义的标准(比如,你知道,使用构造函数来初始化东西,等等).

2> T. Webster..:

以下是我在TestInitialize中发现的一些优点.

在实例化测试类之前,无法访问某些环境变量(例如TestContext).

可以通过标记基本TestInitialize方法abstract来要求使用派生类进行实现.

可以轻松覆盖基本TestInitialize方法,并确定是在派生impl之前,之后还是根本调用基本impl.相反,如果从基本测试类派生测试类,则在无参数构造函数的情况下,无论您是否打算使用基本ctor,都将调用它.

它的明确定义使意图清晰,并补充了TestCleanup方法.你可能会争辩说你可以为每个构造函数创建一个析构函数,但不能保证MS Test会像你期望的那样处理析构函数.



3> 小智..:

使用TestInitialize()或ClassInitialize()而不是测试类实例或静态构造函数的主要优点是它的显式特性.它清楚地表明您在测试之前正在进行一些设置.持续这样做应该从长远来看提高可维护性.


我不同意.什么比构造函数更清晰?当然,您必须知道每个测试都会获得一个新的测试类实例,但这是您真正应该知道的.并且它不像`TestInitialize`这样一个明显的名称,不会引起任何混淆:/sf/ask/17360801/.
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有