2

nunitとninjectを使用するVS2012の新しいMVC4ソリューションでncrunchを実行しています。

私が最初にソリューションを開いたとき、50ほどすべてのテストが実行され、正常に合格しました。

コードを変更した後(空のスペースを追加しただけでも)、ncrunchはほとんどの単体テストが失敗したことを報告します。ncrunchウィンドウで「すべてのテストを実行」を押しても同じことが起こります。

ただし、[ここに表示されているすべてのテストを実行する]ボタンを押すと、50個すべてのテストに再度合格し、ncrunchはすべてが正常であると報告します。

また、各テストを個別に実行すると、毎回合格します。

それらが失敗するとき、それらは私のninjectセットアップコードで失敗しているようです

エラー:ControllerTestSetupでTestFixtureSetUpが失敗しました

public class ControllerTestSetup
{

    [SetUp]
    public void InitIntegrationTest()
    {
        var context = IntegrationTestContext.Instance;
        context.Init();
        context.NinjectKernel.Load<MediGapWebTestModule>();
    }

    [TearDown]
    public void DisposeIntegrationTest()
    {
        IntegrationTestContext.Instance.Dispose();
    }
}

public class IntegrationTestContext : IDisposable
{  

    private static IntegrationTestContext _instance = null;
    private static readonly object _monitor = new object();

    private IntegrationTestContext() { }

    public static IntegrationTestContext Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_monitor)
                {
                    if (_instance == null)
                    {
                        _instance = new IntegrationTestContext();
                    }
                }
            }

            return _instance;
        }
    }
}

すべてのテストは、毎回問題なくresharperテストランナーで実行されます。

誰かがこれを引き起こしている可能性があることを知っていますか?

Instanceプロパティ内のシングルトンロックコードと関係があると思いますが、よくわかりません。

================================================== ============================進捗状況:

これをtrycatchステートメントでラップし、出力ウィンドウにエラーを書き込むことで、上記のninjectsetupメソッドのエラーまで追跡することができました。

例外は、モジュールを複数回ロードしようとしたことが原因でした。たとえ私が絶対にロードしておらず、どのタイプの自動モジュールロードも使用していない場合でもです。

これは回線上で発生します

LocalSessionFactoryModule.SetMappingAssemblies(() => new[] { typeof(ProviderMap).Assembly });

_kernel.Load<LocalSessionFactoryModule>();
_sessionFactory = _kernel.Get<ISessionFactory>();

ここで、LocalSessionFactoryModuleは、NinjectModuleクラスから派生したninjectモジュールクラスです。

これがncrunchでのみ発生するのはなぜですか?この問題を解決するにはどうすればよいですか?モジュールがすでにロードされているかどうかを確認する方法はありますか?

4

1 に答える 1

5

NCrunchは、同じプロセス内でテストの同時実行を実行することはありません。したがって、テストロジック内でマルチスレッドの動作がない限り、これはシングルトンのロックまたはスレッド化によって引き起こされる問題ではないと言っても過言ではありません。

すでに並列実行を無効にしようとしましたが、これは違いがないので、テストランナープロセス外のリソース(つまり、ディスク上のファイル)の同時使用が問題の原因ではないと思います。

これは、問題がテストが実行されているシーケンスにほぼ確実に関連していることを意味します。ほとんどすべての手動テストランナー(Resharperを含む)は、定義された順序で最初から最後までテストを実行します。これは一貫性を保つのに役立ちますが、テストが一貫性のない/ランダムな順序で実行されたときに表面化する可能性のある問題を隠すことができます。NCrunchは優先度の高い順にテストを実行し、テスト実行間でテストプロセスを再利用することもできます。これを考慮して設計されていない場合、テストの実行時の動作が異なる可能性があります。

シーケンス関連の問題を明らかにする(したがってデバッグする)ための便利な方法は、NCrunchを使用して手動で定義された順序でテストを実行してみることです。NCrunch Tests Window内のテストを右クリックすると、[Advanced]メニューの下に、既存のタスクランナープロセスを使用してテストを実行するオプションがあります。いくつかのテストに対してこのアクションを試して、問題を表面化するシーケンスを再現できるかどうかを確認してください。それが起こったとき、あなたは簡単にデバッガーをテストに入れて、それが失敗する理由を見つけることができるはずです。

シーケンス関連の問題のほとんどは、クリアされていない静的メンバーが原因で発生するため、プロセス内で実行された別のテストによって既存の状態が取り残される可能性があることを前提として、各テストが記述されていることを確認してください。もう1つのオプションは、分解のテストによってすべての状態が完全にクリアされることを確認することです(ただし、私の意見では、これはあまり実用的でないアプローチであることがよくあります)。

于 2012-10-02T10:41:33.350 に答える