2012-06-21 17 views
7

Das Szenario ist dies:Zusätzliche Protokollierung JBehave

Wir verwenden JBehave und Selenium für System-, Integrations- und End-to-End-Tests. Ich überprüfe die Ergebnisse einer Berechnung auf einer Seite mit mehr als 20 zu validierenden Werten. Mit Junit Assert wird der gesamte Test bei der ersten Instanz eines der Werte fehlschlagen. Was ich tun wollte, war, dass, wenn ein Assertionsfehler erfüllt ist, der Test weiterhin ausgeführt wird, so dass ich dann alle Werte, die in einem Testlauf falsch sind, zusammentragen kann, anstatt mehrere Testläufe.

Dazu erfassen ich die Behauptungen und schreibe in eine Protokolldatei alles, was die Validierung nicht besteht. Das hat mich mit ein paar Problemen verlassen:

1) Die Protokolldatei, in der ich die Assertionsfehler schreibe, enthält nicht den Namen der JBehave Story oder des Szenarios, das ausgeführt wurde, als die Ausnahme auftrat.

2) Die JBehave-Story oder das JBehave-Szenario werden als "bestanden" aufgeführt und ich möchte, dass sie als "Fehlgeschlagen" aufgelistet wird.

Gibt es eine Möglichkeit, dass ich den Namen der Story und des Szenarios entweder in der zusätzlichen Protokolldatei protokollieren ODER die zusätzliche Protokollierung in die JBehave-Protokolldatei schreiben kann?

Wie kann ich die Story/das Szenario als fehlgeschlagen markieren?

In der JBehave Konfiguration Ich habe:

public class MyStoryReporter implements org.jbehave.core.reporters.StoryReporter{ 
    private Log log = ... 

    @Override 
    public void successful(String step) { 
     log.info(">>successStep:" + step); 
    } 

    @Override 
    public void failed(String step, Throwable cause) { 
     log.error(">>error:" + step + ", reason:" + cause); 
    } 

    ... 
} 

und registrieren Sie es wie folgt aus::

configuredEmbedder() 
    .embedderControls() 
    .doIgnoreFailureInStories(true) 
    .doIgnoreFailureInView(false) 
    .doVerboseFailures(true) 
    .useStoryTimeoutInSecs(appSet.getMaxRunningTime()); 

und

.useStoryReporterBuilder(
    new StoryReporterBuilder() 
    .withDefaultFormats() 
    .withViewResources(viewResources) 
    .withFormats(Format.HTML, Format.CONSOLE) 
    .withFailureTrace(true) 
    .withFailureTraceCompression(true) 
    .withRelativeDirectory("jbehave/" + appSet.getApplication()) 

Antwort

11

Ja, können Sie Ihre eigene StoryReporter erstellen

.useStoryReporterBuilder(
    new StoryReporterBuilder() 
     .withReporters(new MyStoryReporter()) 
.. 
+0

Vielen Dank. Das war wirklich nützlich. –

+0

Können Sie bitte weitere Informationen darüber, wie wir Logger erstellen. Bitte erläutern Sie: private Log log = ... – farheen

+0

Es hängt davon ab, welche Logging-Framework Sie verwenden. Wenn Sie slf4j verwenden: 'Logger log = LoggerFactory.getLogger (MyStoryReporter.class);'. Der Hauptpunkt ist, dass alles in diesen Callback-Methoden sein könnte - Sie könnten einen Sysout machen, in eine Datenbank schreiben oder irgendetwas anderes. – plasma147