如何使用OneTimeSetup?

时间:2018-01-22 19:05:12

标签: c# unit-testing nunit

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中初始化变量的有效方案,即因为在这个花瓶中;所有测试方法都使用产品吗?

3 个答案:

答案 0 :(得分:3)

Moq的灯具设置对我来说似乎很合理。

然而,重复使用相同的Product是可疑的,因为它可以被修改并意外地重复使用,这可能导致不稳定的测试。我会在每个测试运行中获得一个新的Product,即它是否正在测试系统。

答案 1 :(得分:1)

是。不。: - )

是...... [OneTimeSetUp]按预期工作。它会在所有测试和所有测试都使用相同产品之前执行一次。

不...你可能不应该这样使用它,假设Product的初始化并不是非常昂贵 - 它可能不是因为它基于模拟。

OneTimeSetUp最适合用于创建数据库等极其昂贵的步骤。实际上,它在纯粹的单元测试中几乎没有用处。

你可能会想,“如果效率更高一点,为什么不一直使用呢?”答案是你正在编写测试,这意味着你实际上并没有知道测试中的代码会做什么。您的一个测试可能会改变常见产品,甚至可能将其置于无效状态。您的其他测试将开始失败,使得找出问题的根源变得棘手。几乎无一例外,您想要开始使用SetUp,这将为您的每个测试创建一个单独的产品。

答案 2 :(得分:0)

是的,您使用OneTimeSetUp(和OneTimeTearDown)来完成将在该灯具中的测试之间共享的所有设置。它在每次测试运行时运行一次,因此无论在灯具中进行多少次测试,代码都会执行一次。通常,您将初始化保存在私有字段等中的实例以供其他测试使用,这样您就不会得到大量重复的设置代码。