Ausgabe des gegebenen, when, then, Extending Spock
Spock ist ein Java-Testframework, das 2008 von Peter Niederwieser, einem Softwareentwickler bei GradleWare, erstellt wurde und unter anderem BDD ermöglicht. Anhand dieses
Beispiels kann eine Geschichte wie folgt definiert werden:
Story: Returns go to stock As a store owner In order to keep track of stock I want to add items back to stock when they're returned. Scenario 1: Refunded items should be returned to stock Given that a customer previously bought a black sweater from me And I have three black sweaters in stock. When he returns the black sweater for a refund Then I should have four black sweaters in stock. Scenario 2: Replaced items should be returned to stock Given that a customer previously bought a blue garment from me And I have two blue garments in stock And three black garments in stock. When he returns the blue garment for a replacement in black Then I should have three blue garments in stock And three black garments in stock.
Spock ermöglicht es, Tests sehr genau auf Szenariospezifikationen abzubilden, indem dasselbe gegeben, wann, dann verwendet wird Format. In Spock könnten wir das erste Szenario wie folgt implementieren:
class SampleSpec extends Specification{ def "Scenario 1: Refunded items should be returned to stock"() { given: "that a customer previously bought a black sweater from me" // ... code and: "I have three black sweaters in stock." // ... code when: "he returns the black sweater for a refund" // ... code then: "I should have four black sweaters in stock." // ... code } }
Schön wäre es, eine genaue Abbildung der Testszenario-Anforderungen auf die Testszenario-Implementierung sicherzustellen. Wir könnten diesen Weg weitergehen, wenn wir die Syntax von
gegeben, wann, dann ausgeben könnten aus unserem Test. Spock ermöglicht es uns, diese Funktionalität über sein Erweiterungsframework hinzuzufügen.
Nehmen wir also an, unser BA ist wirklich neugierig und möchte mehr Vertrauen vom Entwickler, dass er sich an dasselbe gegeben, wann, dann gehalten hat Format und ihr Code ist synchron. Sie möchten diese Informationen einfach erhalten. Der Entwickler könnte diese Informationen bereitstellen, indem er zuerst diese Anmerkung definiert
import java.lang.annotation.* import org.spockframework.runtime.extension.ExtensionAnnotation @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @ExtensionAnnotation(ReportExtension) @interface LogScenarioDescription {}
Gefolgt von dieser Implementierung:
import org.apache.log4j.Logger import org.spockframework.runtime.AbstractRunListener import org.spockframework.runtime.extension.AbstractAnnotationDrivenExtension import org.spockframework.runtime.model.FeatureInfo import org.spockframework.runtime.model.SpecInfo class LogScenarioDescriptionExtension extends AbstractAnnotationDrivenExtension; { final static Logger logger = Logger.getLogger("scenarioLog." + ReportExtension.class); @Override void visitSpecAnnotation(Report annotation, SpecInfo spec) { spec.addListener(new AbstractRunListener() { @Override void afterFeature(FeatureInfo feature) { if (System.getEnv("logScenarios")) { logger.info("***SCENARIO TEST:*** " + feature.name) for (block in feature.blocks) { logger.info(block.kind); for (text in block.texts) { logger.info(text) } } } } }) } }
Dies wird dann auf den Test
@LogScenarioDescription class SampleSpec extends Specification{ //...angewendet
Wenn der Test ausgeführt wird, gibt er die folgende Ausgabe aus:
***SCENARIO TEST:*** Scenario 1: Refunded items should be returned to stock GIVEN that a customer previously bought a black sweater from me AND I have three black sweaters in stock. WHEN he returns the black sweater for a refund THEN I should have four black sweaters in stock.
Ausgabe in eine bestimmte Protokolldatei für die Szenarioprotokollierung mithilfe des folgenden log4j:
log4j.rootLogger=INFO, stdout log4j.logger.scenarioLog.extension.custom=INFO, scenarioLog log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%m%n log4j.appender.scenarioLog=org.apache.log4j.FileAppender log4j.appender.scenarioLog.File=logs/scenario.log log4j.appender.scenarioLog.layout=org.apache.log4j.PatternLayout log4j.appender.scenarioLog.layout.ConversionPattern=%m%n
und jetzt haben Sie eine Protokolldatei, die Ihr BA, QA lesen kann! Dies hilft, eine agile Kultur der Zusammenarbeit und ATDD zu fördern, wo es möglich ist, zu überprüfen, ob die Testszenarien mit den vereinbarten implementiert wurden.