Mestrer test: JUnit, Mockito og integrationstest · Lektion

Implementering af step definitions

Forbind Gherkin-featurefiler med eksekverbar kode ved at skrive step definitions med et BDD-framework.

Lektion 3 af 411 trin

Implementering af step definitions er en gratis Mestrer test: JUnit, Mockito og integrationstest-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Mestrer test: JUnit, Mockito og integrationstest, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Mestrer test: JUnit, Mockito og integrationstest-kurset indeholder 4 lektioner i alt.

Trindefinitioner: Broen til koden

I Behavior-Driven Development (BDD) beskriver Gherkin-funktionsfiler adfærd i almindeligt sprog. Men hvordan forstår din applikation disse instruktioner?

Det er her, Step Definitions kommer ind i billedet! De er det afgørende bindeled, der oversætter hvert Gherkin-trin (Given, When, Then) til eksekverbar kode.

  • De er metoder, der matcher Gherkin-mønstre.
  • BDD-frameworks (som Cucumber) finder og kører disse metoder.

Vores eksempel: En simpel lommeregner

Lad os bruge en simpel Calculator til at demonstrere, hvordan trindefinitioner fungerer. Denne klasse indeholder den tilstand og logik, som vores trin interagerer med.

Prøv at køre denne simple lommeregner:

public class Calculator {
  private int result;

  public void add(int a, int b) {
    this.result = a + b;
  }

  public int getResult() {
    return result;
  }

  public void clear() {
    this.result = 0;
  }

  public static void main(String[] args) {
    Calculator calc = new Calculator();
    calc.add(10, 5);
    System.out.println("10 + 5 = " + calc.getResult());
  }
}

Annoteringen @Given

Annoteringen @Given bruges til metoder, der opretter den indledende kontekst eller forudsætningerne for et scenario. Den opretter »verdenen«, før en handling finder sted.

Vi opretter en klasse kaldet StepDefinitions, som indeholder vores trindefinitioner. Bemærk, hvordan strengen i @Given matcher et Gherkin-trin.

import io.cucumber.java.en.Given;

public class StepDefinitions {
  private Calculator calculator;

  @Given("I have a calculator")
  public void iHaveACalculator() {
    calculator = new Calculator();
    System.out.println("Given: Calculator initialized.");
  }

  public static void main(String[] args) {
    StepDefinitions steps = new StepDefinitions();
    steps.iHaveACalculator();
  }
}

Annoteringen @When

Annoteringen @When markerer metoder, der beskriver en handling eller hændelse. Det er typisk her, systemet under test påvirkes eller udløses.

Vores lommeregner udfører en »add«-handling her.

import io.cucumber.java.en.Given;
import io.cucumber.java.en.When;

public class StepDefinitions {
  private Calculator calculator;

  @Given("I have a calculator")
  public void iHaveACalculator() {
    calculator = new Calculator();
    System.out.println("Given: Calculator initialized.");
  }

  @When("I add two numbers")
  public void iAddTwoNumbers() {
    // For now, let's hardcode values. We'll make it dynamic soon!
    calculator.add(10, 20);
    System.out.println("When: Added two numbers (10, 20).");
  }

  public static void main(String[] args) {
    StepDefinitions steps = new StepDefinitions();
    steps.iHaveACalculator();
    steps.iAddTwoNumbers();
  }
}

Annoteringen @Then

Annoteringen @Then bruges til metoder, der observerer resultatet af handlingen. Det er her, du kontrollerer, at systemet opførte sig som forventet.

Vi kontrollerer, om lommeregnerens resultat er korrekt.

import io.cucumber.java.en.Given;
import io.cucumber.java.en.When;
import io.cucumber.java.en.Then;

public class StepDefinitions {
  private Calculator calculator;

  @Given("I have a calculator")
  public void iHaveACalculator() {
    calculator = new Calculator();
    System.out.println("Given: Calculator initialized.");
  }

  @When("I add two numbers")
  public void iAddTwoNumbers() {
    calculator.add(10, 20);
    System.out.println("When: Added two numbers (10, 20).");
  }

  @Then("the result should be 30")
  public void theResultShouldBe30() {
    if (calculator.getResult() == 30) {
      System.out.println("Then: Result is 30. Test PASSED!");
    } else {
      System.out.println("Then: Expected 30, got " + calculator.getResult() + ". Test FAILED!");
    }
  }

  public static void main(String[] args) {
    StepDefinitions steps = new StepDefinitions();
    steps.iHaveACalculator();
    steps.iAddTwoNumbers();
    steps.theResultShouldBe30();
  }
}

Send data med argumenter

Fast kodede værdier er ikke fleksible. BDD-frameworks giver dig mulighed for at hente data fra Gherkin-trinnet og sende dem som argumenter til din trindefinitionsmetode.

Vi bruger regulære udtryk eller Cucumber Expressions (som {int}) til at definere pladsholdere.

import io.cucumber.java.en.Given;
import io.cucumber.java.en.When;
import io.cucumber.java.en.Then;

public class StepDefinitions {
  private Calculator calculator;

  @Given("I have a calculator")
  public void iHaveACalculator() {
    calculator = new Calculator();
    System.out.println("Given: Calculator initialized.");
  }

  @When("I add {int} and {int}")
  public void iAddTwoNumbers(int num1, int num2) {
    calculator.add(num1, num2);
    System.out.println("When: Added " + num1 + " and " + num2 + ".");
  }

  @Then("the result should be {int}")
  public void theResultShouldBe(int expectedResult) {
    if (calculator.getResult() == expectedResult) {
      System.out.println("Then: Result is " + expectedResult + ". Test PASSED!");
    } else {
      System.out.println("Then: Expected " + expectedResult + ", got " + calculator.getResult() + ". Test FAILED!");
    }
  }

  public static void main(String[] args) {
    StepDefinitions steps = new StepDefinitions();
    steps.iHaveACalculator();
    steps.iAddTwoNumbers(5, 7); // Simulating Gherkin "When I add 5 and 7"
    steps.theResultShouldBe(12); // Simulating Gherkin "Then the result should be 12"
  }
}

Fleksibel matchning af trin med regulære udtryk

Selvom {int} og {string} er praktiske, kan du bruge fulde regulære udtryk til mere komplekse matchningsmønstre.

Hvis dit Gherkin-trin for eksempel var Given I have an (empty|full) wallet, kunne mønstret for din trindefinition være "^I have an (empty|full) wallet$" for at opfange »empty« eller »full«.

  • Brug \\d+ til et eller flere cifre.
  • Brug "(.*)" til at opfange vilkårlig tekst.

Det gør det muligt for én trindefinition at matche flere næsten ens Gherkin-formuleringer.

BDD-hooks: Opsætning og oprydning

Nogle gange skal du udføre handlinger før eller efter hvert scenario eller endda før eller efter alle funktioner. BDD-frameworks stiller Hooks til rådighed til dette.

  • @Before: Kører før hvert scenario. Nyttigt til at nulstille tilstanden.
  • @After: Kører efter hvert scenario. Godt til oprydning.
import io.cucumber.java.en.Given;
import io.cucumber.java.en.When;
import io.cucumber.java.en.Then;
import io.cucumber.java.Before;
import io.cucumber.java.After;

public class StepDefinitions {
  private Calculator calculator;

  @Before
  public void setupScenario() {
    System.out.println("\n--- Scenario Setup (@Before) ---");
    calculator = new Calculator(); // Ensure a fresh calculator for each scenario
  }

  @After
  public void teardownScenario() {
    System.out.println("--- Scenario Teardown (@After) ---");
    // Optional: add cleanup if needed, e.g., closing resources
  }

  @Given("I have a calculator")
  public void iHaveACalculator() {
    System.out.println("Given: Calculator initialized.");
  }

  @When("I add {int} and {int}")
  public void iAddTwoNumbers(int num1, int num2) {
    calculator.add(num1, num2);
    System.out.println("When: Added " + num1 + " and " + num2 + ".");
  }

  @Then("the result should be {int}")
  public void theResultShouldBe(int expectedResult) {
    if (calculator.getResult() == expectedResult) {
      System.out.println("Then: Result is " + expectedResult + ". Test PASSED!");
    } else {
      System.out.println("Then: Expected " + expectedResult + ", got " + calculator.getResult() + ". Test FAILED!");
    }
  }

  public static void main(String[] args) {
    StepDefinitions steps = new StepDefinitions();
    // Simulate a scenario run
    steps.setupScenario();
    steps.iHaveACalculator();
    steps.iAddTwoNumbers(8, 4); // Simulating Gherkin "When I add 8 and 4"
    steps.theResultShouldBe(12); // Simulating Gherkin "Then the result should be 12"
    steps.teardownScenario();

    // Simulate another scenario run
    steps.setupScenario();
    steps.iHaveACalculator();
    steps.iAddTwoNumbers(10, 0); // Simulating Gherkin "When I add 10 and 0"
    steps.theResultShouldBe(10); // Simulating Gherkin "Then the result should be 10"
    steps.teardownScenario();
  }
}

Kør dine funktionsfiler

I et rigtigt BDD-projekt ville du ikke manuelt kalde trindefinitionsmetoder som i main.

I stedet ville du have en testrunner (ofte en JUnit-testklasse), der fortæller BDD-frameworket (f.eks. Cucumber), hvor det skal finde dine funktionsfiler og trindefinitioner.

Runneren fortolker derefter Gherkin, finder matchende trindefinitioner, kører dem i rækkefølge og rapporterer resultaterne.

Hurtigt tjek: Trindefinitionernes roller

Knyt BDD-annoteringen til dens primære rolle i en trindefinition.

Opsummering: Implementering af trindefinitioner

Du har lært, hvordan menneskelæselige Gherkin-trin forbindes med eksekverbar kode!

  • Step Definitions er Java-metoder, der er annoteret med @Given, @When eller @Then.
  • De bruger regulære udtryk eller Cucumber Expressions (som {int}) til at matche Gherkin-tekst.
  • Argumenter kan hentes fra Gherkin-trinnet og sendes til metoden.
  • Hooks som @Before og @After hjælper med at håndtere opsætning og oprydning for scenarier.

Dette bindeled mellem sprog og kode er grundlæggende for BDD og sikrer, at testene kan forstås af alle, der er involveret i projektet!

Gratis at komme i gang

Lær Mestrer test: JUnit, Mockito og integrationstest med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Implementering af step definitions” gratis?

Ja — alle 3 lektioner i læringssporet Mestrer test: JUnit, Mockito og integrationstest, inklusive “Implementering af step definitions”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Mestrer test: JUnit, Mockito og integrationstest-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Implementering af step definitions”?

Forbind Gherkin-featurefiler med eksekverbar kode ved at skrive step definitions med et BDD-framework. Du øver dig i Mestrer test: JUnit, Mockito og integrationstest med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Mestrer test: JUnit, Mockito og integrationstest?

Der kræves ingen tidligere erfaring. Mestrer test: JUnit, Mockito og integrationstest på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Implementering af step definitions”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Mestrer test: JUnit, Mockito og integrationstest-lektion?

Ja. Alle Mestrer test: JUnit, Mockito og integrationstest-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Introduktion til BDD
  2. Gherkin-syntaks og features
  3. Implementering af step definitions
  4. Scenario Outlines og datatabeller
← Tilbage til Mestrer test: JUnit, Mockito og integrationstest