2012-03-30 6 views
12

私はApproval Testsを使用しています。同じテストはチームシティーと結果上で実行されている場合TeamcityでApprovalTestsを使用するには?

[UseReporter(typeof (DiffReporter))] 
    public class MyApprovalTests 
    { ... } 

は、しかし、異なるテストは、次のエラーで失敗しています:

私のdevのマシンでは、私は私のテストの結果が承認された異なる場合TortoiseDiff を開始するDiffReporterと満足しています

明らかに、tortoisemerge.exeが見つからず、ビルドエージェントにインストールされていないため問題ありません。しかし、それがインストールされたらどうなりますか?その後、失敗するたびにtortoisemerge.exeの別のインスタンスが起動し、誰もそれを閉じません。最終的にtortoisemerge.exeのインスタンスがサーバーを停止させます:)

ローカルマシンのTortoise Diffを実行するためのテストをどのように装飾して、ローカルサーバー上のエラーを報告するだけですか?私は#IF DEBUG [UseReporter(typeof (DiffReporter))]を知っていますが、可能であれば別の解決法を好むでしょう。

+0

あなたは、私たちは、あなたが使用しているApprovalTestsのバージョンを知らせることができますか? –

+0

バージョンは1.0.4381.19674 –

+1

です。私は興味がありました。なぜなら、1.17 DiffReporterがいくつかの異なる記者を試みて最終的にあきらめる前にAssertまたはQuietReporterを呼び出すことができたからです。したがって、最新のバージョンでは例外は見られませんが、誰かがTortiseSVNをインストールした場合に起こることについてのあなたの質問に実際には答えません。私はCC.NETで何も起こらないと言うことができます... TortiseMergeはサーバー上で起動しません。 –

答えて

9

ReportersとCIの問題にはいくつかの解決策があります。私はそれらをすべてリストアップし、より良い解決策を指します。まだありませんがまだ有効になっています。

  1. AppConfigReporterを使用してください。これにより、AppConfigにレポーターを設定することができ、CI用にQuietReporterを使用することができます。 多くの他の記者と共にビデオがここにあります。 AppConfigReporterは6:00に表示されます。 これには別々のコンフィグレーションの利点があり、アセンブリレベルでデコレートすることもできますが、クラス/メソッドレベルでオーバーライドすると問題が残るという欠点があります。

  2. 独自の(2)記者を作成します。レポーターを使用すると、それが環境内で働いているかどうかに関係なく、呼び出されます。IEnvironmentAwareReporterは複合レポーターを許可しますが、レポーターへの直接呼び出しを防ぎません。 ほとんどの場合、静かなレポーターのように何もしませんが、CIサーバーでのみ、またはTeamCityから呼び出されたときにのみ、2人の記者が必要になります。それをTeamCity Reporterと呼びます。そしてOneは、それが動作している場合にteamCityを呼び出すmultiReporterです。

  3. FrontLoadedReporterを使用します(まだ準備はできていません)。これは、現在、ApprovalTestsがNCrunchを使用している方法です。上記のメソッドは、UseReporter属性にロードされているものの前にあります。私はこれを設定するためのアセンブリレベルの属性を追加することを意味していますが、まだ(申し訳ありませんが)私はすぐにこれを追加しようとしていません。

希望します。 Llewellyn

+0

おかげで、私は承認1.8でポイント –

+0

を得たように、あなたが今 を追加することができますようだ[アセンブリ:FrontLoadedReporter(typeof演算(NCrunchReporter))] これが唯一でありますアセンブリレベルで許可され、IEnvironmentAwareReporterでなければなりません。レポーターが現在の環境で許可されている場合、それは他のすべての記者を迂回するでしょう。これは、リポジトリの動作を無効にしたいビルドシステムにとって非常に便利です。 まだTeamCityReporterはありませんが、必要な場合は、あなたと一緒にペアを作成してください。 (自分でTeamCityを使用しないでください...) –

2

ちょっとしたアイデアが出てきました。

あなたは、あなた自身の記者を実装するのはDebugReporter利用

public class DebugReporter<T> : IEnvironmentAwareReporter where T : IApprovalFailureReporter, new() 
{ 
    private readonly T _reporter; 

    public static readonly DebugReporter<T> INSTANCE = new DebugReporter<T>(); 

    public DebugReporter() 
    { 
     _reporter = new T(); 
    } 

    public void Report(string approved, string received) 
    { 
     if (IsWorkingInThisEnvironment()) 
     { 
      _reporter.Report(approved, received); 
     } 
    } 

    public bool IsWorkingInThisEnvironment() 
    { 
#if DEBUG 
     return true; 
#else 
     return false; 
#endif 
    } 
} 

例を、それを呼びましょう、

[UseReporter(typeof(DebugReporter<FileLauncherReporter>))] 
public class SomeTests 
{ 
    [Test] 
    public void test() 
    { 
     Approvals.Verify("Hello"); 
    } 
} 

テストがfalingであれば、それはまだ赤いだろうことができます - しかし、記者が来ないだろう。

IEnvironmentAwareReporterは特に定義されていますが、残念ながらReport()メソッドが呼び出されます。だから、私は、少しハックアップですIsWorkingInThisEnvironment()コールを入れますが、動作します:)

Llywelynはそれがそのように動作する理由を説明できることを願っています。 (バグ?)

+0

IsWorkingInThisEnvironment()は 'FirstWorkingReporter'のようなコンポジットレポーターによって使用されているようで、レポーターが例のように直接呼び出されるたびに呼び出されるとは限りません。 –

1

私はCC.NETを使用しており、TortoiseSVNをサーバーにインストールしています。

ビルドサーバーを再構成して、CC.NETサービスがデスクトップとやりとりできるようにしました。私がそれをしたとき、TortiseMergeが立ち上げられました。だから私は、Approvalsがこのツールを起動しようとしているのだが、CC.NETがサービスとして実行されており、オペレーティングシステムがデフォルトでその動作を妨害しているからだ。 TeamCityがサービスとして実行される場合は、正常に動作するはずですが、テストすることをお勧めします。

+0

私はApprovalTestsの最新バージョンに更新しました。そして今は、亀の始まりが失敗したときに 'XUnitReporter'を実行しようとしています。生憎ルウェリンがうまくいけばすぐに修正するバグを持っているようだ:) –

4

最近この問題が発生しました。

xunitからの借用とTeamCityログの処理方法NCrunch Reporterに基づくTeamCity Reporterを思いついた。

public class TeamCityReporter : IEnvironmentAwareReporter, IApprovalFailureReporter 
{ 
    public static readonly TeamCityReporter INSTANCE = new TeamCityReporter(); 

    public void Report(string approved, string received) { } 

    public bool IsWorkingInThisEnvironment(string forFile) 
    { 
     return Environment.GetEnvironmentVariable("TEAMCITY_PROJECT_NAME") != null; 
    } 
} 

そして私はNCrunchレポーターとそれを組み合わせることができます:

public class TeamCityOrNCrunchReporter : FirstWorkingReporter 
{ 
    public static readonly TeamCityOrNCrunchReporter INSTANCE = 
     new TeamCityOrNCrunchReporter(); 

    public TeamCityOrNCrunchReporter() 
     : base(NCrunchReporter.INSTANCE, 
     TeamCityReporter.INSTANCE) { } 
} 

[assembly: FrontLoadedReporter(typeof(TeamCityOrNCrunchReporter))] 
+0

これを愛する!今すぐApprovalTests(v.21)に追加してください。 –

+1

@llewellynfalco CLRがテストメソッドをインライン展開しているため、スタックトレースに表示されないため、承認テストで見つからなかったため、リリースモードでテストを実行する際に問題が発生しました。テストメソッドに '[MethodImpl(MethodImplOptions.NoInlining)]'を追加する必要がありました。これはxUnitにありました。知っておくべきこと。 –

関連する問題