デフォルトのコンストラクタではなく、TestFixtureSetUp属性を使用するのはいつですか?
-
03-07-2019 - |
質問
NUnitのドキュメントには、 TestFixtureSetup
でメソッドを使用するタイミングと、コンストラクターでセットアップを実行するタイミングが示されていません。
public class MyTest
{
private MyClass myClass;
public MyTest()
{
myClass = new MyClass();
}
[TestFixtureSetUp]
public void Init()
{
myClass = new MyClass();
}
}
TestFixtureSetup
のデフォルトコンストラクターに対する良い/悪い習慣はありますか、それとも違いはありませんか?
解決
これは、nUnitチームが対処していない問題の1つであると思います。ただし、優れた xUnitプロジェクトがあり、この正確な問題を見て、コンストラクターを使用するのが良いと判断しました。 テストフィクスチャの初期化。
nunitの場合、この場合の私のベストプラクティスは、 TestFixtureSetUp
、 TestFixtureTearDown
、 SetUp
、および TearDown <ドキュメントに記載されている/ code>メソッド。
nUnitテストフィクスチャを通常のクラスとして考えていない場合でも、そのコンストラクトで定義している場合でも役立ちます。私はそれらを備品と考えており、それは精神的なハードルを乗り越え、この問題を見落とすことができます。
他のヒント
テストクラスでコンストラクターを使用する必要があるのはなぜですか?
各テストの前後に実行されるコードに対して、 [SetUp]
および [TearDown]
マークされたメソッドを使用します。同様に [TestFixtureSetUp]
および [TestFixtureTearDown]
は、フィクスチャ内のすべてのテストが実行される前後に一度だけ実行されるコードのメソッドをマークしました。
おそらく [TestFixtureSetUp]
をコンストラクターに置き換えることができると思いますが(試したことはありませんが)、これはマークされたメソッドが提供する明確な規則から外れているようです。
[TestFixtureSetup]
でコンストラクターで実行できないことの1つは、 [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)
{
...
}
}
まったく同じことを行うシンプルでよく理解されたファーストクラス言語のコンストラクトがあることを考えると、 [TestFixtureSetUp]
の必要性についてよく疑問に思います。
私の好みは、コンストラクターを使用して、読み取り専用キーワードを利用して、メンバー変数を再初期化できないようにすることです。
[TestFixtureSetUp]
属性でマークされたコンストラクターとメソッドには違いがあります。 NUnitのドキュメントによると:
NUnitはセッション中にオブジェクトを複数回作成する可能性があるため、コンストラクターには副作用がないことをお勧めします。
したがって、高価な初期化がある場合は、 TestFixtureSetUp
を使用することをお勧めします。
[TestFixtureSetUp]
および [TestFixtureTearDown]
は、テストクラス全体用です。一度だけ実行されます。
[SetUp]
および [TearDown]
は、すべてのテストメソッド(テスト)用です。すべてのテストで実行されます。
コンストラクターとTestFixtureSetUpの重要な違いは、少なくともNUnit 2では、コンストラクターコードは、テストの実行だけでなく、テスト列挙で実際に実行されるため、基本的に、読み取り専用、つまりパラメーター値のみを設定するようにctorコードを制限することです。副作用を引き起こすものや実際の作業を行うものはすべて、Lazyでラップするか、TestFixtureSetUp / OneTimeSetUpで行う必要があります。したがって、コンストラクターは、テストを構成するための単なる場所と考えることができます。 TestFixtureSetUpはテストフィクスチャであり、テストを実行する前にシステムに必要な初期状態は初期化されます。
否定的な良い答えがあると思います-属性の代わりにコンストラクターを使用する理由は、テストクラス間で継承がある場合です。
[TestFixtureSetup]
アノテーションが付けられた1つのメソッドのみが呼び出されます(具象クラスのみ)が、他のフィクスチャ初期化子は呼び出されません。この場合、コンストラクターに初期化を配置します。コンストラクターには、継承のための明確に定義されたセマンティクスがあります:)
コンストラクタと SetUp
メソッドの使用方法は異なります:
コンストラクターは1回だけ実行されます。
ただし、すべてのテストケースが実行される前に、 SetUp
メソッドが複数回実行されます。