NUnit具有OneTimeSetup属性:https://github.com/nunit/docs/wiki/OneTimeSetUp-Attribute。当我可以使用它时,我想到一些场景。但是,我在网上找不到任何GitHub示例(即使我的链接没有示例):
说我有这样的代码:
[TestFixture]
public class MyFixture
{
IProduct Product;
[OneTimeSetUp]
public void OneTimeSetUp()
{
IFixture fixture = new Fixture().Customize(new AutoMoqCustomization());
Product = fixture.Create<Product>();
}
[Test]
public void Test1()
{
//Use Product here
}
[Test]
public void Test2()
{
//Use Product here
}
[Test]
public void Test3()
{
//Use Product here
}
}
这是在OneTimeSetup中初始化变量的有效方案,即因为在这个花瓶中;所有测试方法都使用产品吗?
答案 0 :(得分:3)
Moq的灯具设置对我来说似乎很合理。
然而,重复使用相同的Product
是可疑的,因为它可以被修改并意外地重复使用,这可能导致不稳定的测试。我会在每个测试运行中获得一个新的Product
,即它是否正在测试系统。
答案 1 :(得分:1)
是。不。: - )
是...... [OneTimeSetUp]
按预期工作。它会在所有测试和所有测试都使用相同产品之前执行一次。
不...你可能不应该这样使用它,假设Product的初始化并不是非常昂贵 - 它可能不是因为它基于模拟。
OneTimeSetUp
最适合用于创建数据库等极其昂贵的步骤。实际上,它在纯粹的单元测试中几乎没有用处。
你可能会想,“如果效率更高一点,为什么不一直使用呢?”答案是你正在编写测试,这意味着你实际上并没有知道测试中的代码会做什么。您的一个测试可能会改变常见产品,甚至可能将其置于无效状态。您的其他测试将开始失败,使得找出问题的根源变得棘手。几乎无一例外,您想要开始使用SetUp
,这将为您的每个测试创建一个单独的产品。
答案 2 :(得分:0)
是的,您使用OneTimeSetUp
(和OneTimeTearDown
)来完成将在该灯具中的测试之间共享的所有设置。它在每次测试运行时运行一次,因此无论在灯具中进行多少次测试,代码都会执行一次。通常,您将初始化保存在私有字段等中的实例以供其他测试使用,这样您就不会得到大量重复的设置代码。