2012-03-30 9 views
12

Ich verwende Approval Tests. Auf meiner dev Maschine bin ich mit DiffReporter glücklich, dass TortoiseDiff beginnt wenn meine Testergebnisse aus dem genehmigten unterscheiden:Wie funktioniert ApprovalTests bei Teamcity?

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

jedoch, wenn die gleichen Tests auf Teamcity und Ergebnisse ausgeführt sind verschiedene Tests fehlschlagen mit dem folgenden Fehler:

Offensichtlich kann es tortoisemerge.exe nicht finden und das ist in Ordnung, weil es nicht auf Build Agent installiert ist. Aber was ist, wenn es installiert wird? Dann wird für jeden Fehler eine weitere Instanz von tortoisemerge.exe gestartet und niemand schließt sie. Schließlich werden Tonnen von tortoisemerge.exe Instanzen unsere Server töten :)

So ist die Frage - wie sollten Tests eingerichtet werden, um Tortoise Diff auf lokaler Maschine laufen zu lassen und nur Fehler auf Build-Server zu melden? Ich kenne #IF DEBUG [UseReporter(typeof (DiffReporter))], würde aber eine andere Lösung bevorzugen, wenn möglich.

+0

Können Sie uns wissen lassen, welche Version von ApprovalTests Sie verwenden? –

+0

Version ist 1.0.4381.19674 –

+1

Ok. Ich war neugierig, denn in Version 1.17 wurde DiffReporter verstärkt, um verschiedene Reporter zu testen, bevor er schließlich aufgab und nur Assert oder QuietReporter anrief. In der neuesten Version sollten Sie diese Ausnahme also nicht sehen, obwohl dies Ihre Frage zu dem, was passiert, wenn jemand TortiseSVN installiert, nicht wirklich beantwortet. Ich kann Ihnen sagen, dass auf CC.NET nichts passiert ... TortiseMerge startet nicht auf dem Server. –

Antwort

9

Es gibt ein paar Lösungen für die Frage von Reportern und CI. Ich werde sie alle auflisten, und dann auf eine bessere Lösung zeigen, die nicht ganz aktiviert ist.

  1. Verwenden Sie den AppConfigReporter. Auf diese Weise können Sie den Reporter in Ihrer AppConfig festlegen, und Sie können den QuietReporter für CI verwenden. Es gibt ein Video hier, zusammen mit vielen anderen Reportern. Der AppConfigReporter wird um 6:00 angezeigt. Dies hat den Vorteil separater Konfigurationen, die Sie auf Assembly-Ebene dekorieren können, hat aber den Nachteil, dass Sie das Problem immer noch haben, wenn Sie auf Klassen-/Methodenebene überschreiben.

  2. Erstellen Sie Ihre eigenen (2) Reporter. Es ist erwähnenswert, dass wenn Sie einen Reporter verwenden, es aufgerufen wird, unabhängig davon, ob es in der Umgebung funktioniert.IEnvironmentAwareReporter ermöglicht Composite-Reporter, verhindert jedoch nicht einen direkten Anruf an den Reporter. Höchstwahrscheinlich benötigen Sie zwei Reporter, einen, der nichts tut (wie ein stiller Reporter), aber nur auf Ihrem CI-Server funktioniert, oder wenn er von TeamCity aufgerufen wird. Will es den TeamCity Reporter nennen. Und Eins, das ist ein MultiReporter, der teamCity aufruft, wenn es funktioniert, ansonsten wird darauf verwiesen.

  3. Verwenden Sie einen FrontLoadedReporter (nicht ganz fertig). So verwendet ApprovalTests derzeit NCrunch. Es führt die obige Methode vor allem aus, was in Ihrem UseReporter-Attribut geladen wird. Ich wollte hinzufügen, ein Assembly-Level-Attribut für die Konfiguration dieser, aber noch nicht (Entschuldigung) Ich werde versuchen, dies sehr bald hinzuzufügen.

Hoffe, das hilft. Llewellyn

+0

Danke, scheint, wie ich den Punkt bekam –

+0

In Zulassungen 1.8 Sie jetzt hinzufügen können [assembly: FrontLoadedReporter (typeof (NCrunchReporter))] Dies ist nur auf Assembly-Ebene zulässig und muss ein IEnvironmentAwareReporter sein. Wenn der Reporter in der aktuellen Umgebung erlaubt ist, wird es alle anderen Reporter umgehen. Dies ist sehr nützlich für Build-Systeme, in denen Sie das Verhalten der Reporter überschreiben möchten. Es gibt noch keinen TeamCityReporter, aber wenn Sie möchten, würde ich mich freuen, Sie zu paaren. (benutze TeamCity nicht selbst ...) –

2

Ich bin gerade auf eine kleine Idee gekommen.

Sie können Ihre eigenen Reporter implementieren, machen wir es

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 
    } 
} 

Beispiel für die Verwendung,

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

Wenn Test faling

DebugReporter nennen ist, wäre es immer noch rot sein - aber Reporter würde kam nicht nach oben .

Die IEnvironmentAwareReporter ist speziell dafür definiert, aber leider, was auch immer ich dort zurückgebe, es ruft immer noch Report() -Methode. Also setze ich den IsWorkingInThisEnvironment() Aufruf hinein, der ein wenig hackisch ist, aber funktioniert :)

Hoffe das Llywelyn erklären kann warum es so handelt. (Bug?)

+0

Sieht aus wie IsWorkingInThisEnvironment() von zusammengesetzten Reportern wie 'FirstWorkingReporter' verwendet wird und nicht unbedingt jedes Mal aufgerufen wird, wenn der Reporter direkt aufgerufen wird, wie Sie in dem Beispiel getan haben. –

1

Ich benutze CC.NET und ich habe TortoiseSVN auf dem Server installiert.

Ich habe meinen Build-Server neu konfiguriert, damit der CC.NET-Dienst mit dem Desktop interagieren kann. Als ich das tat, startete TortiseMerge. Ich denke also, dass Approvals versucht, das Tool zu starten, aber das kann nicht passieren, weil CC.NET als Dienst ausgeführt wird und das Betriebssystem dieses Verhalten standardmäßig verhindert. Wenn TeamCity als Dienst ausgeführt wird, sollte es Ihnen gut gehen, aber Sie möchten vielleicht testen.

+0

Ich habe auf die neueste Version von ApprovalTests aktualisiert und versuche nun, 'XUnitReporter' zu starten, wenn der Start der Schildkröte fehlschlägt. Leider scheint es, einen Fehler zu haben, die Llewellyn hoffentlich bald beheben :) –

4

Ich kam vor kurzem selbst in dieses Problem.

Entnommen von xunit und wie sie mit TeamCity Logging umgehen, habe ich einen TeamCity Reporter basierend auf dem NCrunch Reporter entwickelt.

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; 
    } 
} 

Und so konnte ich es mit dem NCrunch Reporter kombinieren:

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

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

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

Liebe das! Fügen Sie es jetzt zu ApprovalTests (v.21) hinzu. –

+1

@llewellynfalco Beachten Sie, dass ich Probleme hatte, meine Tests im Freigabemodus auszuführen, da die CLR die Testmethode inline darstellte, sodass sie nicht im Stacktrace angezeigt wurde und somit nicht von den Genehmigungstests gefunden werden konnte. Ich musste '[MethodImpl (MethodImplOptions.NoInlining)]' zu der Testmethode hinzufügen, bevor es funktionieren würde. Das war in xUnit. Etwas, dessen man sich bewusst sein muss. –