我应该初始化每个测试方法,还是只初始化类,或者两者都不初始化?

问题描述 投票:0回答:4

我向自己提出的问题(现在向整个世界,甚至超越世界)提出的问题,在我下面的评论中:

[TestMethod()]
public void SetMessageTypeSubcodeTest()
{
    int AMessageTypeSubcode;
    // Should I put this class instantiation in MyTestInitialize?
    MessageClass target = new MessageClass(); 
. . .

我应该这样做吗:

[TestInitialize()]
public void MyTestInitialize()
{
MessageClass target = new MessageClass(); 
}

...或者这个:

[ClassInitialize()]
public void MyTestInitialize()
{
MessageClass target = new MessageClass(); 
}

...或者两者都不是?

由于 C#/.NET 是垃圾收集的,因此无需在 TestCleanup() 或 ClassCleanup() 方法中释放 MessageClass,不是吗?

visual-studio unit-testing mstest vs-unit-testing-framework
4个回答
3
投票

您想要为您的集合中的每一个测试测试类的全新实例。这将防止任何可能的副作用(可能发生),并因此测试(应该是单位,分开)相互影响。


2
投票

除非类的构建成本很高,否则每次测试都要进行。保证你有一个干净的记录。你是对的,你也不需要在测试结束时进行任何清理,除非你正在测试的特定内容需要它(数据库连接关闭,网络协议的关闭握手等)


1
投票

这个问题没有真正的“正确”答案。就我个人而言,考虑到您的代码,我不会将该类实例化放入任何类型的设置方法中。我会将其保留在每个测试中,以使测试更具可读性和完整性。

我相信使用 ClassInitialize 或 TestInitialize 方法的正确时机是当您想要为该类中的所有测试创建一个一致的环境时。这也是为什么我不喜欢“每个系统类单个测试类”方法的原因。每个测试类都是一个固定装置,为其测试提供一致的环境。

过度激进地重构测试代码以将每个“new Foo()”移动到 TestFixture 中将导致奇妙的分解,但难以阅读单元测试。对于测试,我更看重可读性而不是因式分解的水平。


0
投票

都不是。避免/最小化在测试类中使用成员变量。尽可能在测试方法中使用局部变量。它将使每个测试更加独立/分开/独立。

如果您需要一些通用的初始化代码,请创建一个带有可选参数的辅助函数,可以从(某些)测试方法调用该函数并允许您控制初始化数据。

另请参阅在单元测试之间共享成员变量是否是一个好习惯

© www.soinside.com 2019 - 2024. All rights reserved.