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
メソッドを使用することです。
また、nUnitテストフィクスチャを通常のクラスとは考えていない場合でも、そのコンストラクトで定義している場合でも役立ちます。私はそれらを備品と考えています、そしてそれは精神的なハードルを乗り越え、この問題を見落とすことができます。
テストクラスでコンストラクタを使用する必要があるのはなぜですか?
各テストの前後に実行されるコードに[SetUp]
および[TearDown]
マークされたメソッドを使用し、同様に、コードの前に1回だけ実行される[TestFixtureSetUp]
および[TestFixtureTearDown]
マークされたメソッドを使用しますフィクスチャ内のすべてのテストが実行された後。
おそらくコンストラクターの代わりに[TestFixtureSetUp]
を使用できると思います(試していませんが)が、これはマークされたメソッドが提供する明確な慣習から外れているようです。
[TestFixtureSetup]
でできないことの1つは、コンストラクターでできることは、[TestFixture]
からパラメーターを受け取ることです。
テストフィクスチャをパラメーター化する場合は、少なくともsomeのセットアップにコンストラクターを使用する必要があります。これまでのところ、私はこれを統合テストにのみ使用しました。複数のデータプロバイダーでデータアクセスレイヤーをテストする場合:
[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つのメソッドのみが呼び出されます(具象クラスのみ)が、他のフィクスチャ初期化子は呼び出されません。この場合、コンストラクターに初期化を配置します。コンストラクターには、継承のための明確に定義されたセマンティクスがあります:)