Java >> Java Tutorial >  >> Java

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.

Java-Tag