2009-09-11 38 views
35

私たちはCIサーバーとしてTeamCityを使用しており、テストの失敗のウィンドウには"TestFixtureSetUp Failed"が表示され始めました。"TestFixtureSetUp Failed"の診断方法

どのように私はこの問題をデバッグすることができますか?テストは私のワークステーション(VS2008のR#テストランナー)上で正常に動作します。

+0

右!テストが失敗したときと同じように、NUnitがTestFixtureSetUpから例外の詳細とスタックトレースを表示しないのはなぜですか? –

+0

私はこのバグをNUnit –

+0

に報告する必要があります。バグ報告は、http://github.com/nunit/nunit-vs-adapter/issues/99 –

答えて

22

TestFixtureSetUp(およびTestFixtureTearDown)の実装には、例外が十分に報告されていないという欠点が少しあります。私はそれらの最初の実装を書いたので、それが想定されていたように動作することはありませんでした。当時、NUnitコードの概念は、アクションが単一のテストに直接関係していたという考え方と密接に結びついていました。したがって、すべての報告はテスト結果に関連していました。巨大な書き換えなしにスイートレベルで起こったことを報告するためのスペースは実際にはありませんでした(エスカレーターに羊を入れ替えたときはリファクタリングではありません)。

歴史のちょっとしたことから、実際にTestFixtureSetUpで何が起こったのかを知るのは難しいです。エラーを添付するのに適した場所はありません。 TestFixtureSetUp呼び出しは、テストに直接関連するのではなく、テストを実行する副作用です。

@TrueWillは正しいアイデアを持っています。ログを確認し、必要に応じてログを追加するためにテストを変更します。あなたはTestFixtureSetupの中にtry/catchを置いてcatchブロックにたくさん記録したいかもしれません。私はちょうど私はそれにいくつかの背景を追加することができたと思った(言い換えれば、それは私のせいだ)。

+3

@Mike - ありがとう!ところで、NUnitに関する苦情はほとんどありません。私が.NETで働いていれば、それをうれしく使っています。 – TrueWill

+0

Nunitは最近、これらの情報を報告します。だから、NUnit-Consoleの下でテストを実行するだけで、エラーの原因を調べることができます。本当の問題は、VS Test Window IDEが、特定のテストに直接関連していないエラーを報告する場所を提供していないことです。実際には、NUnit自体の初期のことを思い出します。 – Charlie

+1

rep boost "羊をエスカレーターに変更したときにリファクタリングではありません" –

11

まず、ビルドログを確認します。

それから明らかでない場合は、Console.WriteLinesをテストに含めることができます - 私は肯定的ではありませんが、それらはビルドログに書き込まれると思います。あるいは、あなたはファイルにログすることができます(あなたがファンシーになりたい場合はlog4netを使用しても)。

Visual StudioがCIサーバーにインストールされている場合は、そこからビルド/テストを実行できます。それが接続問題の場合は、それが解決する可能性があります。

しかし、ファイルへの相対パスが正しくないか、絶対パスが使用された場合、私はパスの問題を見てきました。これらはデバッグするのが難しく、パスをログに記録し、それらがビルドサーバーに存在するかどうかを確認する必要があります。

0

この問題は、private const stringと同じように、プライベートの読み取り専用Dictionaryをクラスに追加することによって発生しました。

私はDictionaryを定数にしようとしましたが、コンパイル時にはできません。私はDictionaryを返すメソッドに入れて解決しました。

+0

あなたは[ReadOnlyDictionary](https://msdn.microsoft.com/en-us/library/gg712875%28v=)を使うことができます。 vs.110%29.aspx) – RJFalconer

1

Visual Numnitを使用してSpecFlowでテストを実行しているときに同じエラーが発生しました。ユニットテストエクスプローラ(Resharperから提供されたもの)から同じことをしようとしたとき、もう少し役に立つメッセージが表示されました:10個以上のパラメータを持つバインディングメソッドはサポートされていません。私は、10個以上のパラメータを持つSpecFlowメソッドを持つことができないことを知り、テストを削除しなければなりませんでした。

1

VSユニットテストのクイックスイッチを実行して、テストデータベースを正しく作成していないことがわかりました。私のケースでは、それが失敗した理由に対するより良い応答を返すことができました。私は通常NUnitを使用します。 "クラスXのインスタンスを作成できません。エラー:System.Data.SqlClient.SqlException:物理ファイル名 '\ DbTest.mdf'が正しくない可能性があります。追加のエラーを診断して修正し、操作を再試行してください。 。 CREATE DATABASE failed。リストされたファイル名を作成できませんでした。 「

0

私は、フィールドの初期化中にエラーが原因この症状を持っていた。自分の[SetUp]方法であなたのフィールドを初期化する場合は、あなたがより良いエラーメッセージが表示されるはずです。

[TestFixture] 
internal class CommandParserTest 
{ 
    // obscure error message 
    private CommandParser parser = new CommandParser(...); 
    ... 
} 

[TestFixture] 
internal class CommandParserTest 
{ 
    private CommandParser parser; 

    [SetUp] 
    public void BeforeTest() 
    { 
     // better error message 
     parser = new CommandParser(...); 
    } 
    ... 
} 
0

私は今日、この悩まされました。

(1)厄介なテストフィクスチャのインスタンスを初期化し、TestFixtureSetUpやSetUpなどのセットアップメソッドを明示的に呼び出して、それを実行する別のフィクスチャに別のテストを書き込んでください。目標試験方法

(2)上記の新しいコードの例外処理コードを追加し、実際の例外をどこかにログ出力します。

6

今日私は、重複したくないセットアップを実行している統合テストを作成するときにこの問題に遭遇しました。私はすべてのテストフィクスチャセットアップロジックをtry/catchでラップしました。次に、FixUureのセットアップ中に障害が発生したかどうかを確認し、より良いログを提供することを目的とするSetUpメソッドを追加します。

Exception testFixtureSetupException = null; 

[TestFixtureSetUp] 
public void FixtureSetup() 
{ 
    try 
    { 
     // DoTestFixtureSetup 
    } 
    catch (Exception ex) 
    { 
     testFixtureSetupException = ex; 
    } 
} 

[SetUp] 
// NUnit doesn't support very useful logging of failures from a TestFixtureSetUp method. We'll do the logging here. 
public void CheckForTestFixturefailure() 
{   
    if (testFixtureSetupException != null) 
    { 
     string msg = string.Format("There was a failure during test fixture setup, resulting in a {1} exception. You should check the state of the storage accounts in Azure before re-running the RenewStorageAccountE2ETests. {0}Exception Message: {3}{0}Stack Trace:{4}", 
      Environment.NewLine, testFixtureSetupException.GetType(), accountNamePrefix, testFixtureSetupException.Message, testFixtureSetupException.StackTrace); 
     Assert.Fail(msg); 
    } 
} 
1

デバッグモードでユニットテストを実行します。セットアップでランタイムエラーが発生することがあります。

0

それが誰かを助けることができる場合: あなたは例外をキャッチし、ティアダウンのコンソールでそれを書くことができますが

のような何か:

[SetUpFixture] 
public class BaseTest 
{ 
    private Exception caughtException = null; 

    [SetUp] 
    public void RunBeforeAnyTests() 
    { 
     try 
     { 
      throw new Exception("On purpose"); 
     } 
     catch (Exception ex) 
     { 
      caughtException = ex;    
     } 
    } 

    [TearDown] 
    public void RunAfterAnyTests() 
    { 
     if (caughtException != null) 
     { 
      Console.WriteLine(string.Format("TestFixtureSetUp failed in {0} - {1}", this.GetType(), caughtException.Message)); 
     }   
    } 

} 

そして結果は次のようになります。

TestFixtureSetUpがIntegratedTests.Services.BaseTestで失敗しました - 目的で

1

Visual StudioでSpecFlowとC#を使用している場合、テストが失敗した後、自動生成された<whatever>.feature.csファイルに保存されます。 public partial class <whatever>Feature行には、上に乗ったときにNUnitフィクスチャセットアップが失敗した理由が表示されるシンボルが表示されます。私の場合、TestHooksクラスの私のBeforeFeatureメソッドのいくつかは静的ではありませんでした。すべてBeforeTestRun,AfterTestRun,BeforeFeature、およびAfterFeatureのメソッドは静的である必要があります。

関連する問題