这个问题涉及使用MSTest在Visual Studio中进行单元测试(这很重要,因为MSTest的执行顺序).标记为[TestInitialize]的方法和测试类构造函数都将在每个测试方法之前运行.
所以,问题是,你在这些领域中倾向于做什么?你是否避免在两者中进行某些活动?你的理由是什么:风格,技术,迷信?
构造函数只是该语言提供的结构.每个测试框架似乎都有自己的受控生命周期"初始化".您可能只会使用构造函数来改变您的本地人.
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; }
以下是我在TestInitialize中发现的一些优点.
在实例化测试类之前,无法访问某些环境变量(例如TestContext).
可以通过标记基本TestInitialize方法abstract来要求使用派生类进行实现.
可以轻松覆盖基本TestInitialize方法,并确定是在派生impl之前,之后还是根本调用基本impl.相反,如果从基本测试类派生测试类,则在无参数构造函数的情况下,无论您是否打算使用基本ctor,都将调用它.
它的明确定义使意图清晰,并补充了TestCleanup方法.你可能会争辩说你可以为每个构造函数创建一个析构函数,但不能保证MS Test会像你期望的那样处理析构函数.
使用TestInitialize()或ClassInitialize()而不是测试类实例或静态构造函数的主要优点是它的显式特性.它清楚地表明您在测试之前正在进行一些设置.持续这样做应该从长远来看提高可维护性.