Elixir og Phoenix: Skalerbar backendutvikling · leksjon

Enhetstesting med ExUnit

Skriv raske og pålitelige enhetstester for Elixir-modulene og -funksjonene dine ved hjelp av det innebygde ExUnit-rammeverket.

Leksjon 1 av 410 trinn

Enhetstesting med ExUnit er en gratis leksjon i Elixir og Phoenix: Skalerbar backendutvikling på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Elixir og Phoenix: Skalerbar backendutvikling, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Elixir og Phoenix: Skalerbar backendutvikling inneholder totalt 4 leksjoner.

Introduksjon til ExUnit

Velkommen til enhetstesting med ExUnit! ExUnit er Elixirs innebygde testrammeverk, utviklet for å hjelpe deg med å skrive pålitelig og vedlikeholdbar kode.

Enhetstester fokuserer på små, isolerte deler av koden, for eksempel enkeltfunksjoner eller moduler. De sikrer at hver komponent fungerer som forventet, slik at du kan utvikle applikasjonen med trygghet.

Din første ExUnit-test

Elixir-testfiler slutter vanligvis med _test.exs og plasseres i en test/-katalog. Der bruker du use ExUnit.Case for å hente inn testfunksjonalitet.

En testblokk starter med test "description" do ... end. Her er et enkelt eksempel:

defmodule MyMath do
  def add(a, b), do: a + b
end

defmodule MyMathTest do
  use ExUnit.Case, async: true

  test "adds two numbers correctly" do
    assert MyMath.add(1, 2) == 3
  end
end

Påstander med `assert`

Den vanligste påstanden i ExUnit er assert. Den kontrollerer om et uttrykk evalueres til en sann verdi (alt annet enn false eller nil).

Den brukes ofte til å sammenligne forventede resultater med faktiske resultater.

defmodule Calculator do
  def multiply(a, b), do: a * b
end

defmodule CalculatorTest do
  use ExUnit.Case, async: true

  test "multiplies positive numbers" do
    assert Calculator.multiply(2, 3) == 6
  end

  test "multiplies by zero" do
    assert Calculator.multiply(5, 0) == 0
  end
end

Avkrefting med `refute`

Noen ganger vil du sikre at noe ikke er sant. Da bruker du refute. Det er det motsatte av assert.

refute består hvis argumentet evalueres til en usann verdi (false eller nil).

defmodule Validator do
  def is_negative(num), do: num < 0
end

defmodule ValidatorTest do
  use ExUnit.Case, async: true

  test "refutes positive numbers as negative" do
    refute Validator.is_negative(10)
    refute Validator.is_negative(0)
  end

  test "asserts negative numbers" do
    assert Validator.is_negative(-5)
  end
end

Testing av unntak

Hva om funksjonen skal utløse en feil under bestemte forhold? assert_raise lar deg teste dette!

Du oppgir den forventede unntakstypen og eventuelt en melding, sammen med en funksjon som skal utløse feilen.

defmodule Divider do
  def divide(a, b) do
    if b == 0, do: raise(ArgumentError, "Cannot divide by zero"), else: a / b
  end
end

defmodule DividerTest do
  use ExUnit.Case, async: true

  test "raises ArgumentError for division by zero" do
    assert_raise ArgumentError, "Cannot divide by zero", fn ->
      Divider.divide(10, 0)
    end
  end
end

Oppsett av testkontekst

Mange tester trenger et felles oppsett, for eksempel oppretting av en midlertidig ressurs eller en mock-bruker. ExUnits setup-tilbakekallfunksjon kjøres før hver test i en modul.

Den skal returnere {:ok, assigns}, der assigns er en nøkkelordliste eller et map som blir tilgjengelig i argumentene til testfunksjonen.

defmodule UserProfileTest do
  use ExUnit.Case, async: true

  setup do
    # This runs before each test
    user = %{id: 101, name: "Jane Doe", email: "jane@example.com"}
    {:ok, user: user, admin: true}
  end

  test "user has a name", %{user: user} do
    assert user.name == "Jane Doe"
  end

  test "context includes admin flag", %{admin: admin_status} do
    assert admin_status == true
  end
end

Gruppere tester med `describe`

Etter hvert som testfilene vokser, kan det være ønskelig å gruppere relaterte tester logisk. Makroen describe hjelper med å organisere tester i en modul, slik at testpakken blir mer oversiktlig.

Du kan også legge describe-blokker inni hverandre!

defmodule StringUtils do
  def capitalize(str), do: String.capitalize(str)
  def reverse(str), do: String.reverse(str)
end

defmodule StringUtilsTest do
  use ExUnit.Case, async: true

  describe "capitalize/1" do
    test "capitalizes first letter" do
      assert StringUtils.capitalize("hello") == "Hello"
    end

    test "handles empty string" do
      assert StringUtils.capitalize("") == ""
    end
  end

  describe "reverse/1" do
    test "reverses a string" do
      assert StringUtils.reverse("world") == "dlrow"
    end
  end
end

Kjøre testene

Når testene er skrevet, er det enkelt å kjøre dem ved hjelp av Elixirs byggeverktøy, Mix.

  • Kjøre alle testene i prosjektet: mix test
  • Kjøre tester i en bestemt fil: mix test test/my_module_test.exs
  • Kjøre en bestemt test etter linjenummer: mix test test/my_module_test.exs:10
  • Kjøre tester som samsvarer med en beskrivelse: mix test --only "adds two numbers"

ExUnit-utfordring

Se på følgende Elixir-modul, som er laget for å kontrollere om et tall er oddetall. Hvilken ExUnit-påstand tester riktig om NumberChecker.is_odd(5) returnerer true?

defmodule NumberChecker do
  def is_odd(n) when is_integer(n) do
    rem(n, 2) != 0
  end
end

Oppsummering av enhetstesting

Flott jobbet! Du har gått gjennom det grunnleggende innen enhetstesting med ExUnit.

  • ExUnit er Elixirs innebygde testrammeverk.
  • Tester defineres i _test.exs-filer ved hjelp av use ExUnit.Case.
  • assert kontrollerer sanne verdier, mens refute kontrollerer usanne verdier.
  • assert_raise bekrefter at bestemte unntak utløses.
  • setup-tilbakekallfunksjoner klargjør konteksten for testene.
  • describe-blokker hjelper med å organisere relaterte tester.
  • Tester kjøres med mix test.

Disse ferdighetene er avgjørende for å bygge robuste og pålitelige Elixir-applikasjoner!

Gratis å komme i gang

Lær deg Elixir 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 «Enhetstesting med ExUnit» gratis?

Ja – hele teksten i «Enhetstesting med ExUnit» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Elixir og Phoenix: Skalerbar backendutvikling-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Elixir og Phoenix: Skalerbar backendutvikling inneholder totalt 4 leksjoner.

Hva lærer jeg i «Enhetstesting med ExUnit»?

Skriv raske og pålitelige enhetstester for Elixir-modulene og -funksjonene dine ved hjelp av det innebygde ExUnit-rammeverket. Du øver på Elixir og Phoenix: Skalerbar backendutvikling 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 Elixir og Phoenix: Skalerbar backendutvikling?

Ingen tidligere erfaring er nødvendig. Elixir og Phoenix: Skalerbar backendutvikling 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 1 av 4.

Hvor lang tid tar leksjonen «Enhetstesting med ExUnit»?

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 Elixir og Phoenix: Skalerbar backendutvikling-leksjonen?

Ja. Alle Elixir og Phoenix: Skalerbar backendutvikling-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. Enhetstesting med ExUnit
  2. Integrasjonstesting av Phoenix-applikasjoner
  3. Mocking, stubs og testdata
  4. Property-basert testing med StreamData
← Tilbake til Elixir og Phoenix: Skalerbar backendutvikling