Testing i praksis: JUnit, Mockito og integrasjonstester · leksjon

Implementering av trinn дефinisjoner

Koble Gherkin-funksjonsfiler til kjørbar kode ved å skrive trinn дефinisjoner med et BDD-rammeverk.

Leksjon 3 av 411 trinn

Implementering av trinn дефinisjoner er en gratis leksjon i Testing i praksis: JUnit, Mockito og integrasjonstester på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Testing i praksis: JUnit, Mockito og integrasjonstester, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Testing i praksis: JUnit, Mockito og integrasjonstester inneholder totalt 4 leksjoner.

Step Definitions: Kodebroen

I Behavior-Driven Development (BDD) beskriver Gherkin-featurefiler atferd i et naturlig språk. Men hvordan forstår applikasjonen instruksjonene?

Det er her Step Definitions kommer inn! De er den avgjørende koblingen som oversetter hvert Gherkin-trinn (Given, When, Then) til kjørbar kode.

  • De er metoder som samsvarer med Gherkin-mønstre.
  • BDD-rammeverk (som Cucumber) finner og kjører disse metodene.

Eksempelet vårt: En enkel kalkulator

La oss bruke en enkel Calculator for å demonstrere hvordan step definitions fungerer. Denne klassen inneholder tilstanden og logikken som trinnene våre skal samhandle med.

Prøv å kjøre denne enkle kalkulatoren:

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());
  }
}

Annotasjonen @Given

Annotasjonen @Given brukes for metoder som etablerer den innledende konteksten eller forhåndsbetingelsene for et scenario. Den setter opp «verdenen» før en handling finner sted.

Vi oppretter en klasse kalt StepDefinitions som skal inneholde trinnmetodene våre. Legg merke til hvordan strengen i @Given samsvarer med et Gherkin-trinn.

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();
  }
}

Annotasjonen @When

Annotasjonen @When markerer metoder som beskriver en handling eller hendelse. Det er vanligvis her systemet som testes, blir samhandlet med eller utløst.

Kalkulatoren vår utfører en «add»-operasjon 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();
  }
}

Annotasjonen @Then

Annotasjonen @Then brukes for metoder som observerer resultatet av handlingen. Her hevder du at systemet oppførte seg som forventet.

Vi kontrollerer om resultatet fra kalkulatoren er riktig.

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();
  }
}

Sende data med argumenter

Hardkodede verdier er ikke fleksible. BDD-rammeverk lar deg hente data fra Gherkin-trinnet og sende dem som argumenter til metoden for step definition.

Vi bruker regulære uttrykk eller Cucumber Expressions (som {int}) til å definere plassholdere.

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 trinnsamsvar med Regex

Selv om {int} og {string} er praktiske, kan du bruke fullstendige regulære uttrykk for mer komplekse samsvarsmønstre.

Hvis Gherkin-trinnet for eksempel var Given I have an (empty|full) wallet, kan mønsteret for step definition være "^I have an (empty|full) wallet$" for å fange opp «empty» eller «full».

  • Bruk \\d+ for ett eller flere sifre.
  • Bruk "(.*)" for å fange opp vilkårlig tekst.

Dette gjør at én step definition kan samsvare med flere litt forskjellige Gherkin-formuleringer.

BDD Hooks: Oppsett og opprydding

Noen ganger må du utføre handlinger før eller etter hvert scenario, eller til og med før eller etter alle funksjoner. BDD-rammeverk tilbyr Hooks for dette.

  • @Before: Kjører før hvert scenario. Nyttig for å tilbakestille tilstanden.
  • @After: Kjører etter hvert scenario. Nyttig for opprydding.
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();
  }
}

Kjøre feature-filene

I et ekte BDD-prosjekt ville du ikke kalt step definition-metoder manuelt slik vi gjorde i main.

I stedet ville du hatt en Test Runner (ofte en JUnit-testklasse) som forteller BDD-rammeverket (for eksempel Cucumber) hvor feature-filene og step definitions finnes.

Runneren analyserer deretter Gherkin, finner samsvarende step definitions og kjører dem i riktig rekkefølge mens resultatene rapporteres.

Hurtigsjekk: Rollene til Step Definitions

Koble BDD-annotasjonen til hovedrollen den har i en step definition.

Oppsummering: Implementere Step Definitions

Du har lært hvordan menneskelesbare Gherkin-trinn kobles til kjørbar kode!

  • Step Definitions er Java-metoder annotert med @Given, @When eller @Then.
  • De bruker regulære uttrykk eller Cucumber Expressions (som {int}) for å samsvare med Gherkin-tekst.
  • Argumenter kan hentes fra Gherkin-trinnet og sendes til metoden.
  • Hooks som @Before og @After bidrar til å håndtere oppsett og opprydding for scenarier.

Denne broen mellom språk og kode er grunnleggende for BDD og sikrer at testene kan forstås av alle som er involvert i prosjektet!

Gratis å komme i gang

Lær deg Testing i praksis: JUnit, Mockito og integrasjonstester med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Implementering av trinn дефinisjoner» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Testing i praksis: JUnit, Mockito og integrasjonstester, inkludert «Implementering av trinn дефinisjoner», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Testing i praksis: JUnit, Mockito og integrasjonstester inneholder totalt 4 leksjoner.

Hva lærer jeg i «Implementering av trinn дефinisjoner»?

Koble Gherkin-funksjonsfiler til kjørbar kode ved å skrive trinn дефinisjoner med et BDD-rammeverk. Du øver på Testing i praksis: JUnit, Mockito og integrasjonstester med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Testing i praksis: JUnit, Mockito og integrasjonstester?

Ingen tidligere erfaring er nødvendig. Testing i praksis: JUnit, Mockito og integrasjonstester på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Implementering av trinn дефinisjoner»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Testing i praksis: JUnit, Mockito og integrasjonstester-leksjonen?

Ja. Alle Testing i praksis: JUnit, Mockito og integrasjonstester-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Introduksjon til BDD
  2. Gherkin-syntaks og funksjoner
  3. Implementering av trinn дефinisjoner
  4. Scenario outlines og datatabeller
← Tilbake til Testing i praksis: JUnit, Mockito og integrasjonstester