تعلّم كيفية اختبار تمارين 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
توفّر 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 - أو برقم آخر، يشغّل في تمارين التعلّم فقط الاختبارات المرتبطة بالمهمة المحددةالتوثيق:
تتضمن تمارين 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()
يعني التحذير الأول أن الدالة لا تُرجع النوع الصحيح. ويشير الأخير إلى أن تعريف الدالة الثاني لا يمكن الوصول إليه أبدًا لأن تعريف الدالة الأول يطابق دائمًا.