Test Yapmak

Test, yazılım geliştirmenin önemli bir parçasıdır. Bu derste ExUnit ile Elixir kodumuzu nasıl test edeceğimize bakacağız ve bu konuda bazı ipuçları vereceğiz.

Table of Contents

ExUnit

Elixir’in yerleşik olarak gelen test framework’u ExUnit’tir ve kodumuzu iyice test etmek için ihtiyacımız olan her şeyi içerir. Devam etmeden önce testlerin Elixir betikleri üzerinde çalıştığını unutmamak gerekiyor. .exs dosya uzantısını kullanmaya özen gösterelim. Testlerimizi yapabilmemiz için önce ExUnit’i ExUnit.start() ile başlatmamız gerekiyor, bu genellikle test / test_helper.exsde yapılır. Örnek projemizi önceki derste oluşturduğumuz zaman, mix bizim için basit bir test oluşturacak kadar yardımcı olmuştu,test/example_test.exsbakacak olursak: ```elixir defmodule ExampleTest do use ExUnit.Case doctest Example test "greets the world" do assert Example.hello() == :world end end ``` Projemizin testlerinimix testile çalıştırabiliriz. Bunu şimdi yaparsak şuna benzer bir çıktı görmeliyiz: ```shell .. Finished in 0.03 seconds 2 tests, 0 failures ``` Çıktıda neden iki test sonucu var? Şimdilib/example.ex'e bakalım. Mix bizim için başka bir test oluşturdu, bazı doctest'ler vs. ```elixir defmodule Example do @moduledoc """ Documentation for Example. """ @doc """ Hello world. ## Examples iex> Example.hello :world """ def hello do :world end end ``` ### assert Daha önce testler yazdıysanız,assertile tanışıyorsunuz demektir; bazı frameworklerdeassertyerineshouldyadaexpectkullanıyor. İfadenin doğru olduğunu test etmek içinassertkullanıyoruz. Kullanmadığımız takdirde, bir hata ortaya çıkacağından dolayı testlerimiz başarısız olur. Bir hatayı test etmek için, örneğimizi değiştirelim ve ardından tekrarmix test'i çalıştıralım: ```elixir defmodule ExampleTest do use ExUnit.Case doctest Example test "greets the world" do assert Example.hello() == :word end end ``` Şimdi çıktının farklı bir çeşidini görmeliyiz: ```shell 1) test greets the world (ExampleTest) test/example_test.exs:5 Assertion with == failed code: assert Example.hello() == :word left: :world right: :word stacktrace: test/example_test.exs:6 (test) . Finished in 0.03 seconds 2 tests, 1 failures ``` ExUnit bize, başarısız olduğumuz olayın tam olarak nerede olduğunu, beklenen değerin tam olarak ne olduğunu ve gerçek değerin ne olduğunu söyleyecektir. ### refuterefute,assertyapmak “değilse” ifadesi ise “iddi” anlamına gelir. Bir ifadenin her zaman yanlış olmasını sağlamak istediğinizderefuteü kullanın.refuteis toassertasunlessis toif. ### assert_raise Bazen bir hata oluşturmamız gerekebilir. Bunuassert_raiseile yapabiliriz. Bir sonraki dersteassert_raiseörneğini göreceğiz. ### assert_receive Elixir'de, uygulamalar birbirlerine mesaj gönderen aktörlerden/süreçlerden oluşur, bu yüzden genellikle gönderilen mesajları test etmek istersiniz. ExUnit kendi işleminde çalıştığı için, herhangi bir başka süreç gibi mesaj/mesajlar alabilir veassert_receivedile bunu yapabilirsiniz: ```elixir defmodule SendingProcess do def run(pid) do send(pid, :ping) end end defmodule TestReceive do use ExUnit.Case test "receives ping" do SendingProcess.run(self()) assert_received :ping end end ```assert_received, mesajları beklemez,assert_receivedile bir zaman aşımı belirtebilirsiniz. ### capture_io and capture_log Bir uygulamanın çıktısını almak, orijinal uygulamayı değiştirmedenExUnit.CaptureIOile mümkündür. Sadece çıktıyı üretecek olan işlevi iletin: ```elixir defmodule OutputTest do use ExUnit.Case import ExUnit.CaptureIO test "outputs Hello World" do assert capture_io(fn -> IO.puts("Hello World") end) == "Hello World\n" end end ```ExUnit.CaptureLog, Loggeriçin çıktı yakalama eşdeğeridir. ## Test Kurulumu Bazı durumlarda, testlerimizden önce kurulum yapmamız gerekebilir. Bunu başarmak içinsetupvesetup_allkullanabiliriz.setupilesetup_allkomutlarının arasında ki fark: setup_all sadece 1 kez çalışır, setup ise her testten önce çalışır.demetini döndürmesi bekleniyor. Örneğin,setup_all` işlevini kullanmak için kodumuzu değiştireceğiz: elixir defmodule ExampleTest do use ExUnit.Case doctest Example setup_all do {:ok, recipient: :world} end test "greets", state do assert Example.hello() == state[:recipient] end end ## Mocking Elixir’de Mocking yapmanın en basit hali Mocking yapmamaktır. İç güdüsel olarak Mocking yapmak isteyebilirsiniz ancak Elixir topluluğu makul sebepler ile kullanılmasını önermiyor. Daha uzun bir tartışma için şu şekilde mükemmel bir makale var, test için bağımlılıkları Mock etmek yerine (bir fiil ile Mock etmek), Uygulamanız dışındaki kodlar için açık bir şekilde arayüzleri tanımlamanın avantajını göreceksiniz. Uygulama kodunu, uygulama kodunuzda değiştirmek için tercih edilen yol, modülü argüman olarak iletmek ve bir varsayılan değer kullanmaktır. Bu işe yaramazsa, yerleşik yapılandırma mekanizmasını kullanın. Bu kısmi uygulamaları oluşturmak için özel bir mocking kütüphanesine, sadece davranışlara ve geri çağrılara(callbacks) ihtiyacınız yoktur.

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