2016-08-02 29 views
2

Ich habe Probleme, nicht eindeutige Testergebnisse im [AfterScenario] -Hook zu erkennen.Specflow-Haken, wie erhalten Sie ein inkonklusives oder ausstehendes Ergebnis?

Ich habe eine große Reihe von Specflow-Tests, die ich die meisten Nächte laufen und in der Haken-Sektion protokolliere ich, ob der Test bestanden oder fehlgeschlagen ist und einige Informationen über die Tags, dann am Ende des Testlaufs ausgegeben dies zu einer Datei. ich entscheiden derzeit, ob ein Test, indem Sie bestanden hat oder nicht:

bool failed = ScenarioContext.Current.TestError != null; 
string result = failed ? "failed" : "passed"; 

Dies funktioniert die meiste Zeit, aber wenn ein Test nicht alle Schritte abgeschlossen hat (Szenario Ergebnis ist nicht überzeugend), dass die Methode Berichte das Szenario als vorübergehen, das ist nicht wirklich was ich will. Ich habe versucht, MissingOrPendingStepsOutcome zu Fehler oder Ignorieren in App.Config, aber keiner von ihnen hat Auswirkungen auf die TestError-Eigenschaft, so wieder wird es als "bestanden" berechnet.

Ich habe ein paar handlich aussehende Eigenschaften (MissingSteps und PendingSteps) in der ScenarioContext.Current bemerkt, leider sind sie privat, so dass ich nicht darauf zugreifen kann.

I C# bin mit .4.5.2 und Specflow 1.9.0.77 mit NUnit 2.6.4.14350 und die Tests in ReSharper 9.2 des Unit Test Sessions Fenster in Visual Studio Enterprise 2015 auf Windows 7 x64

Antwort

2

@Florent B. Lösung ist besser, aber wenn Sie es nicht durch Reflexion tun möchten, können Sie einen Trick verwenden, die i SpecFlow 1,9 gefunden. Der [BeforeStep] Hook wird nie aufgerufen, wenn der Schritt nicht existiert.

[BeforeScenario] 
public void BeforeScenario() 
{ 
    ScenarioContext.Current.Set(false, "HasNotImplementedStep"); 
} 

[BeforeStep] 
public void BeforeStep() 
{ 
    ScenarioContext.Current.Set(true, "IsBeforeStepCalled"); 
} 

[AfterStep] 
public void AfterStep() 
{ 
    var beforeStepCalled = ScenarioContext.Current.Get<bool>("IsBeforeStepCalled"); 
    if (!beforeStepCalled) 
    { 
     ScenarioContext.Current.Set(true, "HasNotImplementedStep"); 
    } 

    ScenarioContext.Current.Set(false, "IsBeforeStepCalled"); 
} 

[AfterScenario] 
public void AfterScenario() 
{ 
    var hasNotImplementedStep = ScenarioContext.Current.Get<bool>("HasNotImplementedStep"); 
    if (hasNotImplementedStep) 
    { 
     // Do your stuff 
    } 
} 
+0

Cool, das ist eine bessere Lösung, die kein Hacken erfordert, um Zugang zu privaten Variablen zu bekommen. – Steve

1

Sie könnten prüfen, ob die TestStatus Eigenschaft nicht OK ist:

bool failed = ScenarioContext.Current.TestStatus != TestStatus.OK; 
+0

Das ist toll, wie hast du das gefunden? Es wird aus irgendeinem Grund nicht in Intellisense oder dem Inspector angezeigt, aber wenn ich es zu einer Uhr hinzufüge oder das unmittelbare Fenster benutze, gibt es mir MissingStepDefinition – Steve

+0

Meine schlechte, die 'TestStatus' -Eigenschaft wird nicht öffentlich zugänglich gemacht: https: // github. com/techtalk/SpecFlow/Blob/Meister/TechTalk.SpecFlow/ScenarioContext.cs. Sie könnten es immer noch durch Reflexion lesen: http://stackoverflow.com/questions/3303126/how-to-get-the-value-of-private-field-in-c –

+0

ah, das wäre warum. Jegliche Antworten, die dies nicht erfordern, wären besser, aber für den Moment denke ich, es wird – Steve