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

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

 public class MyTest { private MyClass myClass; public MyTest() { myClass = new MyClass(); } [TestFixtureSetUp] public void Init() { myClass = new MyClass(); } } 

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

我认为这是nUnit团队尚未解决的问题之一。 但是,有一个出色的xUnit项目看到了这个问题,并决定构造函数在testing夹具初始化中使用是一件好事。

对于nunit,在这种情况下,我最好的做法是使用文档中描述的TestFixtureSetUpTestFixtureTearDownSetUpTearDown方法。

我认为这也可以帮助我,当我不考虑nUnittesting夹具作为一个普通的类,即使你正在定义它的构造。 我把它们看作是固定装置,这让我头痛不已,让我忽略了这个问题。

为什么你需要在testing类中使用构造函数?

在每次testing之前和之后,我使用[SetUp][TearDown]标记的方法来执行代码,类似地[TestFixtureSetUp][TestFixtureTearDown]标记的方法仅用于在夹具的所有testing之前和之后执行一次的代码跑。

我想你可能可以用[TestFixtureSetUp]replace构造函数(尽pipe我还没有尝试过),但是这似乎只是标记方法提供的明确约定。

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

如果你想参数化你的testing夹具,那么你将不得不使用至less一些设置的构造函数。 到目前为止,我只用它来进行集成testing,例如用于testing具有多个数据提供者的数据访问层:

 [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) { ... } } 

我常常想知道[TestFixtureSetUp]是什么,因为有一个简单的,很好理解的第一类语言构造完全一样的东西。

我的首选是使用构造函数,以利用readonly关键字确保成员variables不能重新初始化。

构造函数和用[TestFixtureSetUp]属性标记的方法是有区别的。 根据NUnit文档:

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

所以如果你有任何昂贵的初始化,最好使用TestFixtureSetUp

我想我有一个好的答案 – 使用构造函数而不是属性的原因是当你在testing类之间有一个inheritance关系时。

只有一个用[TestFixtureSetup]注解的方法将被调用(仅在具体类上),但是其他的fixture初始化器不会。 在这种情况下,我宁愿把初始化放在构造函数中,这个构造函数有一个明确定义的inheritance的语义:)

[TestFixtureSetUp][TestFixtureTearDown]用于整个testing类。 只运行一次。

每个testing方法(testing)都有[SetUp][TearDown] 。 为每个testing运行。

构造函数和TestFixtureSetUp之间的一个重要区别是,至less在NUnit 2中,构造函数代码实际上是在testing枚举上执行的,而不仅仅是testing运行,所以基本上你想限制ctor代码只填充只读参数值。 任何导致副作用或做任何实际工作的事情都需要包装在Lazy中,或者在TestFixtureSetUp / OneTimeSetUp中完成。 所以,你可以把构造函数想象成只是一个configurationtesting的地方。 而TestFixtureSetUp是testing夹具(testing前系统所需的初始状态)运行的地方,而初始化的则是TestFixtureSetUp。

构造函数和SetUp方法的使用方式不同:
构造函数只运行一次。
但是,在执行每个testing用例之前, SetUp方法会运行多次。