我何时使用TestFixtureSetUp属性而不是默认构造函数?

Pac*_*aco 70 c# nunit unit-testing

NUnit文档没有告诉我何时使用带有a的方法TestFixtureSetup以及何时在构造函数中进行设置.

public class MyTest
{
    private MyClass myClass;

    public MyTest()
    {
        myClass = new MyClass();
    }

    [TestFixtureSetUp]
    public void Init()
    {
        myClass = new MyClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

关于TestFixtureSetup与默认构造函数有任何好/坏的做法,或者没有任何区别?

Sam*_*sel 64

为什么需要在测试类中使用构造函数?

我使用[SetUp][TearDown]标记了在每次测试之前和之后执行代码的方法,以及类似[TestFixtureSetUp][TestFixtureTearDown]标记的方法,用于在夹具中的所有测试之前和之后仅执行一次代码.

我猜你可能会替换[TestFixtureSetUp]构造函数(虽然我没有尝试过),但这似乎只是打破了标记方法提供的明确约定.

  • 我不知道为什么我需要一个构造函数,但我也不知道为什么我需要一个TestFixtureSetUp.我知道setup,teardown和testfixtureteardown属性.我只是不知道构造函数和testfixturesetup属性之间的区别. (4认同)
  • 只是回答你的问题.如果您有参数化的测试夹具,则需要在测试类中使用构造函数. (3认同)

cas*_*ora 15

我认为这是nUnit团队尚未解决的问题之一.然而,有一个优秀的xUnit项目,它看到了这个确切的问题,并决定构造函数在测试夹具初始化时使用是一件好事.

对于NUnit的,在这种情况下,我最好的做法是使用TestFixtureSetUp,TestFixtureTearDown,SetUp,和TearDown如文档中描述的方法.

我认为当我没有将nUnit测试夹具视为普通类时,它也会对我有所帮助,即使您使用该构造定义它也是如此.我认为它们是固定装置,这让我超越了心理障碍,让我忽略了这个问题.

  • 请注意,[xUnit的文章(https://xunit.github.io/docs/comparisons.html)更是建议`Setup`s(以及构造函数)通常是一个坏主意,让测试代码[难走](http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html),并非构造函数优于`Setup`s.无参数构造函数是真正需要它的人的最后手段.也看到这一点:[测试样式,避免安装/拆卸(https://lostechies.com/jimmybogard/2013/09/26/test-styles-and-avoiding-setupteardown/) (2认同)

Erg*_*wun 12

[TestFixtureSetup]你可以在构造函数中做的一件事就是从中接收参数[TestFixture].

如果要对测试夹具进行参数化,则必须至少对某些设置使用构造函数.到目前为止,我只将其用于集成测试,例如,用于测试具有多个数据提供者的数据访问层:

[TestFixture("System.Data.SqlClient",
  "Server=(local)\\SQLEXPRESS;Initial Catalog=MyTestDatabase;Integrated Security=True;Pooling=False"))]
[TestFixture("System.Data.SQLite", "Data Source=MyTestDatabase.s3db")])]
internal class MyDataAccessLayerIntegrationTests
{
    MyDataAccessLayerIntegrationTests(
        string dataProvider,
        string connectionString)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

我经常想知道需要什么[TestFixtureSetUp],因为有一个简单的,易于理解的第一类语言结构完全相同的东西.

我的偏好是使用构造函数,以利用readonly关键字确保成员变量无法重新初始化.

  • readonly关键字不能确保成员不会被修改.如果该成员是一个类,则可以在测试中修改该类的内部状态,并且该状态将被转移到下一个测试方法(因为nunit不会在每次测试运行之间重新创建该类) (4认同)

ode*_*bas 9

构造函数和用[TestFixtureSetUp]属性标记的方法之间存在差异.根据NUnit文档:

建议构造函数没有任何副作用,因为NUnit可能会在会话过程中多次构造对象.

因此,如果您有任何昂贵的初始化,最好使用TestFixtureSetUp.