12

承認テストを使用しています。私の開発マシンでは、テスト結果が承認済みと異なる場合にTortoiseDiffDiffReporterが起動することに満足しています。

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

ただし、Teamcity で同じテストが実行されていて、結果が異なる場合、テストは次のエラーで失敗します。

System.Exception : Unable to launch: tortoisemerge.exe with arguments ...
Error Message: The system cannot find the file specified
---- System.ComponentModel.Win32Exception : The system cannot find the file 
                                                                 specified

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

問題は、ローカル マシンで Tortoise Diff を実行し、ビルド サーバーでエラーを報告するだけのテストをどのように装飾する必要があるかということです。私は知って #IF DEBUG [UseReporter(typeof (DiffReporter))]いますが、可能であれば別の解決策を希望します。

4

4 に答える 4

9

レポーターとCIの質問にはいくつかの解決策があります。それらすべてをリストしてから、まだ完全には有効になっていない、より良いソリューションを示します。

  1. AppConfigReporterを使用します。これにより、AppConfigでレポーターを設定でき、CI用のQuietReporterを使用できます。他の多くの記者と一緒に、ここにビデオがあります。AppConfigReporterは6:00に表示されます。これには、個別の構成の利点があり、アセンブリレベルで装飾できますが、クラス/メソッドレベルでオーバーライドすると、問題が発生するという欠点があります。

  2. 独自の(2)レポーターを作成します。レポーターを使用すると、環境で機能しているかどうかに関係なく、レポーターが呼び出されることに注意してください。IEnvironmentAwareReporterは、複合レポーターを許可しますが、レポーターへの直接呼び出しを妨げることはありません。ほとんどの場合、2つのレポーターが必要になります。1つは何もしない(静かなレポーターのように)が、CIサーバー上でのみ機能するか、TeamCityによって呼び出された場合にのみ機能します。それをTeamCityReporterと呼びます。そして、Oneは、動作している場合はteamCityを呼び出し、それ以外の場合はに延期するmultiReporterです。

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

お役に立てれば。ルウェリン

于 2012-03-30T15:19:16.187 に答える
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))]
于 2012-08-12T14:23:01.010 に答える
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");
    }
}

テストが失敗した場合、それはまだ赤ですが、レポーターは表示されません。

はそのIEnvironmentAwareReporterために特別に定義されていますが、残念ながら私がそこに返すものは何でも Report() メソッドを呼び出します。だから、私は IsWorkingInThisEnvironment() 呼び出しを内部に入れました。これは少しハックですが、動作します:)

Llywelyn がなぜそのように振る舞うかを説明できることを願っています。(バグ?)

于 2012-03-30T09:35:23.447 に答える
1

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

CC.NET サービスがデスクトップとやり取りできるように、ビルド サーバーを再構成しました。すると、TortiseMerge が起動しました。したがって、Approvals はツールを起動しようとしますが、CC.NET がサービスとして実行されており、オペレーティング システムがデフォルトでその動作を防止しているため、起動できません。TeamCity がサービスとして実行されている場合は問題ありませんが、テストすることをお勧めします。

于 2012-03-30T14:24:22.460 に答える