78

NUnit のドキュメントには、TestFixtureSetupいつメソッドを使用してコンストラクターでセットアップを行うべきかが記載されていません。

public class MyTest
{
    private MyClass myClass;

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

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

対デフォルトコンストラクターについて良い/悪い慣行TestFixtureSetupはありますか、それとも違いはありませんか?

4

9 に答える 9

65

テストクラスでコンストラクターを使用する必要があるのはなぜですか?

各テストの前後にコードを実行するためにマークされたメソッド[SetUp]を使用し、同様に、フィクスチャ内のすべてのテストが実行される前と後にコードが 1 回だけ実行されるようにマークされたメソッドを使用します。[TearDown][TestFixtureSetUp][TestFixtureTearDown]

おそらくコンストラクターの代わりに を使用できると思いますが[TestFixtureSetUp](試したことはありません)、これはマークされたメソッドが提供する明確な規則から逸脱しているように見えます。

于 2008-10-17T16:02:41.250 に答える
19

これは、nUnit チームが対処していない問題の 1 つだと思います。ただし、この正確な問題を見て、コンストラクターがテスト フィクスチャの初期化に使用するのに適していると判断した優れたxUnit プロジェクトがあります。

nunit の場合、この場合の私のベスト プラクティスは、ドキュメントに記載されているように、、、、およびメソッドTestFixtureSetUpTestFixtureTearDown使用SetUpすることです。TearDown

nUnit テスト フィクスチャを通常のクラスとは考えていない場合にも役立つと思います。たとえその構成体で定義していてもです。私はそれらを備品と考えており、それが精神的なハードルを乗り越え、この問題を見逃すことを可能にしています。

于 2008-10-17T18:00:17.910 に答える
13

コンストラクターで実行できることで実行できないことの 1 つ[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)
    {
        ...
    }
}
于 2010-08-27T01:36:39.850 に答える
10

[TestFixtureSetUp]コンストラクターと属性でマークされたメソッドには違いがあります。NUnit のドキュメントによると:

NUnit はセッション中にオブジェクトを複数回構築する可能性があるため、コンストラクターに副作用がないことをお勧めします。

したがって、高価な初期化がある場合は、 を使用することをお勧めしますTestFixtureSetUp

于 2012-01-11T10:37:20.863 に答える
9

[TestFixtureSetUp]まったく同じことを行う、単純でよく理解された第一級の言語構造があることを考えると、私はしばしば、その必要性が何であるか疑問に思ってきました。

私の好みは、メンバー変数を再初期化できないようにする readonly キーワードを利用するために、コンストラクターを使用することです。

于 2009-05-06T16:26:22.633 に答える
3

コンストラクターと TestFixtureSetUp の重要な違いは、少なくとも NUnit 2 では、コンストラクター コードはテストの実行だけでなく、実際にはテスト列挙で実行されるため、基本的には ctor コードを読み取り専用、つまりパラメーター値の入力のみに制限する必要があることです。副作用を引き起こしたり、実際の作業を行ったりするものはすべて、Lazy でラップするか、TestFixtureSetUp / OneTimeSetUp で実行する必要があります。したがって、コンストラクターは、テストを構成するためだけの場所と考えることができます。一方、TestFixtureSetUp は、テスト フィクスチャ (テストが実行される前に必要なシステムの初期状態) が初期化される場所です。

于 2016-03-16T17:40:09.657 に答える
2

私は否定的な良い答えを持っていると思います-属性の代わりにコンストラクターを使用する理由は、テストクラス間で継承がある場合です。

で注釈が付けられた 1 つのメソッドのみ[TestFixtureSetup]が呼び出されますが (具象クラスでのみ)、他のフィクスチャ初期化子は呼び出されません。この場合、継承のための明確に定義されたセマンティクスを持つコンストラクターに初期化を入れたいと思います:)

于 2009-07-25T07:13:49.160 に答える
-2

コンストラクターとSetUpメソッドの使用方法は異なります
。コンストラクターは 1 回だけ実行されます。
ただし、SetUpすべてのテスト ケースが実行される前に、メソッドが複数回実行されます。

于 2012-06-13T09:13:36.293 に答える