Do you want to pick up from where you left of?
Take me there

Tests

Faire des tests est une partie importante du développement informatique. Dans cette leçon, nous allons voir comment tester notre code Elixir avec ExUnit ainsi que les bonnes pratiques pour cela.

ExUnit

L’outil de test intégré dans Elixir est ExUnit et il contient tout ce qu’il faut pour tester rigoureusement le code. Avant de continuer, il est important de noter que les tests sont implémentés comme tout script Elixir donc nous utilisons l’extension .exs. Avant de pouvoir lancer nos tests, il nous faut démarrer ExUnit avec ExUnit.start() que l’on place généralement dans test/test_helper.exs.

Quand nous avons généré notre projet d’exemple dans la leçon précédente, mix nous a aidé en créant un test simple que nous pouvons trouver dans test/example_test.exs:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

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

Nous pouvons alors lancer les tests de notre projet avec mix test. Si nous exécutons cela maintenant, nous devrions voir la sortie suivante:

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

assert

Si vous avez déjà écrit des tests auparavant, vous êtes certainement habitués à assert; dans certains frameworks should ou expect prennent la place de assert.

Nous utilisons assert pour vérifier qu’une expression est correcte. Dans le cas ou cette dernière ne l’est pas, une erreur sera remontée et le test va échouer. Pour tester un échec, modifions l’exemple comme suit et lançons mix test:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

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

Nous devrions alors maintenant voir une autre sortie:

  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 nous dira exactement où nos tests ont échoués, quelle était la valeurs attendue, et celle réellement reçue.

refute

refute est à assert ce que unless est à if. Utilisez refute pour vous assurer qu’une expression est fausse.

assert_raise

Il est parfois nécessaire d’affirmer qu’une erreur est soulevée et nous pouvons le faire avec assert_raise. Nous verrons un exemple d’utilisation de assert_raise dans la prochaine leçon concernant Plug.

Configuration de test

Dans certains cas, il peut être nécessaire de définir la configuration avant de lancer nos tests. Pour cela, nous allons utiliser setup et setup_all. setup sera exécuté avant chaque test et setup_all une fois avant la suite. Ceux-ci doivent retourner un tuple de {:ok, state}, où state sera accessible dans nos tests.

Pour cet exemple, nous allons changer le code pour utiliser 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

Mocking

L’utilisation des mocks avec Elixir est fortement déconseillée. Vous pourriez vouloir les utiliser par instinct mais cela est fortement découragé par la communauté Elixir et pour de bonnes raisons. Si vous suivez les principes d’une bonne architecture, le code résultant sera facile à tester en tant que composant individuel.

Résistez donc à l’envie.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!