何时使用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,在这种情况下,我最好的做法是使用文档中描述的TestFixtureSetUp
, TestFixtureTearDown
, SetUp
和TearDown
方法。
我认为这也可以帮助我,当我不考虑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
方法会运行多次。