الاختبار في مسار Elixir

تعلّم كيفية اختبار تمارين Elixir الخاصة بك على Exercism


من الطرفية، انتقل إلى المجلد الأساسي للتمرين ثم نفّذ الاختبارات بالأمر التالي:

$ mix test

سينفّذ هذا ملف الاختبار الموجود في المجلد الفرعي test، وهو ملف ينتهي بـ _test.exs.

الاختبارات المعلّقة

في مجموعات اختبارات تمارين التدريب، وُسمت جميع الاختبارات عدا الأول لتُتخطى.

بمجرد أن ينجح أحد الاختبارات، يمكنك إلغاء تخطي التالي بتعليق الوسم @tag :pending المعني باستخدام الرمز #.

على سبيل المثال:

# @tag :pending
test "shouting" do
  assert Bob.hey("WATCH OUT!") == "Whoa, chill out!"
end

إذا أردت تشغيل جميع الاختبارات دفعة واحدة، يمكنك تضمين كل الاختبارات المتخطاة باستخدام الخيار --include في أمر mix test:

$ mix test --include pending

أو يمكنك تمكين جميع الاختبارات بتعليق سطر ExUnit.configure في مجموعة الاختبارات.

# ExUnit.configure exclude: :pending, trace: true

ميزات إضافية لاختبار Elixir

توفّر ExUnit وmix test عددًا لا بأس به من الأساليب لتجميع الاختبارات ووسمها وتنفيذها، ووسائل متنوعة للتحكم في تنفيذ الاختبارات، وكثير من ذلك مُلخّص أدناه.

أساليب تشغيل اختبارات محددة

التوثيق:

تشغيل اختبارات في ملف محدد

يمكن تنفيذ جميع الاختبارات في ملف واحد عبر mix test بتحديد الملف:

$ mix test test/<FILE>.exs

ملاحظة: قد يؤثر tagging على الاختبارات التي تُنفَّذ فعليًا بهذه الطريقة.

تشغيل اختبارات فردية

يمكن تنفيذ الاختبارات الفردية بالإشارة إلى رقم السطر الذي يوجد فيه الاختبار في الملف:

$ mix test test/<FILE>.exs:LINENUM

يمكن تنفيذ عدة اختبارات بإعطاء عدة أرقام أسطر مفصولة بـ :.

على سبيل المثال، بالنظر إلى ملف بالمحتوى التالي مع أرقام الأسطر:

test "Test 1" do           # 1
  # test implementation    # 2-6
end                        # 7
                           # 8
test "Test 2" do           # 9
  # test implementation    # 10-21
end                        # 22
                           # 23
test "Test 3" do           # 24
  # test implementation    # 25-35
end                        # 36

يمكن تنفيذ الاختبارين الأول والثالث بـ:

$ mix test test/FILE.exs:1:24

ملاحظة: عند تحديد الاختبارات عبر أرقام الأسطر، يُتجاهل tagging.

تشغيل مجموعات من الاختبارات

يمكن تجميع الاختبارات باستخدام describe:

describe "short test group description" do
  test "test description" do
    # test implementation
  end

  test "another test description" do
    # test implementation
  end
end

يمكن تنفيذ جميع اختبارات مجموعة بالإشارة إلى رقم سطرها في الملف، تمامًا كما تُشار إلى الاختبارات الفردية وتُنفَّذ.

التوثيق:

خيارات أخرى مفيدة في mix test

  • --include و--exclude - يشغّلان اختبارات محددة أو لا يشغّلانها بناءً على وسوم @tag الخاصة بها
  • --failed - يشغّل فقط الاختبارات التي فشلت في آخر مرة جرى تشغيلها
  • --max-failures - تتوقف مجموعة الاختبارات عن تقييم الاختبارات عند الوصول إلى هذا العدد من حالات فشل الاختبارات
  • --seed - يهيّئ مولّد الأرقام العشوائية المستخدم في عشوائية ترتيب الاختبارات، ويعطّل --seed 0 العشوائية، فتُشغَّل اختبارات ملف واحد دائمًا بالترتيب نفسه الذي عُرّفت به
  • --stale - يشغّل فقط الاختبارات التي تشير إلى وحدات تغيّرت منذ آخر مرة شُغّلت فيها الاختبارات باستخدام --stale
  • --only task_id:1 - أو برقم آخر، يشغّل في تمارين التعلّم فقط الاختبارات المرتبطة بالمهمة المحددة

التوثيق:

مواصفات الأنواع وDialyzer (DIscrepancy AnalYZer for ERlang programs)

تتضمن تمارين Elixir ملفًا هيكليًا للتنفيذ في المجلد الفرعي lib. يرسم هذا الملف الخطوط العريضة للوحدة والدوال التي يُتوقع منك تنفيذها. في معظم التمارين، ستجد مواصفات الأنواع فوق تعريف الدالة. تبدأ هذه بوسم @spec وتتبع عادةً الصيغة @spec function_name(type1, type2) :: return_type. تُستخدم مواصفات الأنواع في Elixir وErlang كتوثيق، وبالاقتران بأداة تُسمى Dialyzer لاكتشاف حالات عدم الاتساق في الأنواع والأخطاء المحتملة. لمزيد من المعلومات، راجع توثيق مواصفات الأنواع. وللاطلاع على توثيق Dialyzer، راجع Erlang -- dialyzer.

اختياريًا، قد ترغب في التحقق من أنواع تنفيذك باستخدام Dialyzer. وهناك خطوات قليلة ستحتاج إلى اتخاذها. لفعل ذلك، عليك إضافة الاعتماد Dialyxir إلى ملف mix.exs الخاص بتمرينك.

defp deps do
  # Add this:
  [{:dialyxir, "~> 0.4", only: [:dev]}]
end

ثم استخدم مهام mix للجلب والترجمة من سطر الأوامر:

$ mix deps.get
...
$ mix deps.compile
...

إذا كانت هذه أول مرة تشغّل فيها Dialyzer، فمن المرجح ألا يكون لديك ملف plt. يستخدم Dialyzer الجدول الدائم للبحث، أو PLT، لتخزين معلومات حول أنواع Elixir وErlang المدمجة. لإنشاء plt بإعدادات افتراضية معقولة، نفّذ:

$ mix dialyzer --plt

وأخيرًا، يمكن تشغيله بـ:

$ mix dialyzer

احرص على تغيير المسار ليطابق مسار مكتبات Elixir على نظامك. على سبيل المثال، إذا ثبّت Elixir باستخدام homebrew فمن المرجح أن تجده تحت /usr/local/Cellar/elixir/1.3.2.

نُكرّر التنبيه: تشغيل Dialyzer وإزالة جميع التحذيرات خطوة اختيارية عند إكمال تمرين. قد يصعب تفسير تحذيرات Dialyzer. على سبيل المثال، تأمّل التحذيرات الناتجة عن هذا التنفيذ السخيف جدًا لتمرين Bob.

defmodule Bob do
  @spec hey(input :: String.t()) :: String.t()
  def hey(input) do
    1
  end

  def hey(input) do
  end
end

ينتج عن ذلك التحذيرات التالية.

bob.exs:2: Invalid type specification for function 'Elixir.Bob':hey/1. The success typing is (_) -> 1
bob.exs:7: The variable _input@1 can never match since previous clauses completely covered the type any()

يعني التحذير الأول أن الدالة لا تُرجع النوع الصحيح. ويشير الأخير إلى أن تعريف الدالة الثاني لا يمكن الوصول إليه أبدًا لأن تعريف الدالة الأول يطابق دائمًا.