Fork me on GitHub

Δοκιμές

Οι δοκιμές είναι ένα σημαντικό μέρος της ανάπτυξης λογισμικού. Σε αυτό το μάθημα θα δούμε πως να δοκιμάζουμε των κωδικά μας σε Elixir με το ExUnit και μερικές από τις καλύτερες πρακτικές για να το κάνουμε.

Πίνακας περιεχομένων

ExUnit

Το ενσωματωμένο περιβάλλον δοκιμών της Elixir είναι το ExUnit και περιλαμβάνει ότι χρειαζόμαστε για να δοκιμάσουμε τον κώδικά μας διεξοδικά. Πριν προχωρήσουμε, είναι σημαντικό να σημειώσουμε ότι οι δοκιμές εφαρμόζονται σαν Elixir scripts, έτσι πρέπει να χρησιμοποιήσουμε την επέκταση αρχείου .exs. Πριν μπορέσουμε να τρέξουμε τις δοκιμές μας πρέπει να ξεκινήσουμε το ExUnit με το ExUnit.start(), το οποίο συνήθως γίνεται στο test/test_helper.exs.

Όταν δημιουργήσαμε το δοκιμαστικό project μας στο προηγούμενο μάθημα, το mix ήταν αρκετά βολικό στο να μας δημιουργήσει μία απλή δοκιμή, την οποία βρίσκουμε στο test/example_test.exs:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

  test "the truth" do
    assert 1 + 1 == 2
  end
end

Μπορούμε να τρέξουμε τις δοκιμές του project μας με την εντολή mix test. Αν το κάνουμε τώρα θα πρέπει να δούμε μια παρόμοια έξοδο:

Finished in 0.03 seconds (0.02s on load, 0.01s on tests)
1 tests, 0 failures

assert

Αν έχετε γράψει δοκιμές στο παρελθόν τότε θα είστε εξοικειομένοι με την assert. σε μερικά περιβάλλοντα θα βρείτε τις should ή expect να παίρνουν την θέση της.

Χρησιμοποιούμε την μακροεντολή assert για να δοκιμάσουμε ότι η έκφραση είναι αληθής. Στην περίπτωση που δεν είναι, ένα σφάλμα θα σηκωθεί και οι δοκιμές μας θα αποτύχουν. Για να δοκιμάσουμε μια αποτυχία ας αλλάξουμε το δείγμα μας και τότε να τρέξουμε την mix test:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

  test "the truth" do
    assert 1 + 1 == 3
  end
end

Τώρα θα πρέπει να δούμε μια πολύ διαφορετική έξοδο:

  1) test the truth (ExampleTest)
     test/example_test.exs:5
     Assertion with == failed
     code: 1 + 1 == 3
     lhs:  2
     rhs:  3
     stacktrace:
       test/example_test.exs:6

......

Finished in 0.03 seconds (0.02s on load, 0.01s on tests)
1 tests, 1 failures

Το ExUnit θα μας πει που ακριβώς οι εκτιμήσεις μας αποτυγχάνουν, ποιά ήταν η προσδοκώμενη τιμή και ποιά ήταν στην πραγματικότητα.

refute

Η refute είναι για την assert ότι η unless για την if. Χρησιμοποιήστε την refute όταν θέλετε να βεβαιωθείτε ότι μια έκφραση είναι πάντα ψευδής.

assert_raise

Μερικές φορές μπορεί να είναι απαραίτητο να βεβαιωθούμε ότι σηκώθηκε κάποιο σφάλμα. Μπορούμε να το κάνουμε αυτό με την assert_raise. Θα δούμε ένα παράδειγμα της assert_raise στο επόμενο μάθημα για το Plug.

Ρυθμίσεις Δοκιμών

Σε μερικές περιπτώσεις μπορεί να είναι απαραίτητο να κάνουμε κάποιες ρυθμίσεις πριν τις δοκιμές μας. Για να το πετύχουμε αυτό μπορούμε να χρησιμοποιήσουμε τις μακροεντολές setup και setup_all. Η setup θα τρέξει πριν από κάθε δοκιμή και η setup_all μια φορά πριν από την σουίτα. Αναμένεται να επιστρέψουν μια τούπλα του στυλ {:ok, state}, με την κατάσταση να είναι διαθέσιμη για τις δοκιμές μας.

Για χάρη του παραδείγματος, θα αλλάξουμε τον κώδικά μας να χρησιμοποιεί την setup_all:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

  setup_all do
    {:ok, number: 2}
  end

  test "the truth", state do
    assert 1 + 1 == state[:number]
  end
end

Μίμηση

Η απλή απάντηση για μίμηση στην Elixir: μην το κάνετε. Μπορεί ενστικτωδώς να ψάχνετε για μιμήσεις αλλά η κοινότητα της Elixir τις αποθαρρύνει και για καλό λόγο.

Για μια εκτενέστερη συζήτηση, υπάρχει αυτό το εξαιρετικό άρθρο. Η ουσία είναι ότι αντί να μιμείστε την ύπαρξη εξαρτήσεων για τις δοκιμές σας, υπάρχουν πολλά πλεονεκτήματα στο να ορίσετε διεπαφές (συμπεριφορές) για κώδικα εκτός της εφαρμογής σας και να χρησιμοποιείτε υλοποιήσεις μίμησης στις δοκιμές σας.

Για να αλλάξετε τις υλοποιήσεις στον κώδικα εφαρμογής σας, ο προτιμώμενος τρόπος είναι να περάσετε την ενότητα σαν όρισμα και να χρησιμοποιήσετε μια προκαθορισμένη τιμή. Αν αυτό δεν λειτουργεί, χρησιμοποιήστε τον υπάρχοντα μηχανισμό ρυθμίσεων. Για τη δημιουργία αυτών των υλοποιήσεων μίμησης, δεν χρειάζεστε μια ειδική βιβλιοθήκη μίμησης, μόνο συμπεριφορές και επανακλήσεις.


Share This Page