انتقل إلى المحتوى

الاختبار

شغّل ملفات node:test المكتوبة بلغتي JavaScript و TypeScript واختبارات JUnit باستخدام elide test: الاكتشاف، واختيار الاختبارات، والخيارات، والتقارير، والتغطية.

في هذه الصفحة

يشغّل الأمر elide test ملفات node:test المكتوبة بلغتي JavaScript و TypeScript واختبارات JUnit.

elide test

يجعل الاختبار الفاشل رمز الخروج غير صفري.

0:13 / 0:13

JavaScript و TypeScript

تستخدم الاختبارات واجهة node:test ولا تحتاج إلى ملف بيان. يُعدّ الملف اختبارًا إذا طابق *.test.* أو *.spec.* أو *_test.* أو *_spec.*، أو كان داخل test أو tests أو __tests__. الامتدادات: .js و .mjs و .cjs و .ts و .mts و .cts.

يتخطى الاكتشاف المجلدات المخفية ومجلدات التبعيات ومخرجات البناء. ويتوقف عند أي مشروع متداخل (مجلد يحتوي على elide.pkl أو package.json أو pom.xml أو requirements.txt)، لذا لا يجد جذر مساحة العمل اختبارات الأعضاء. حدّد مسارًا لتشغيلها.

import test from "node:test";
import assert from "node:assert";

test("adds two values", () => {
  assert.equal(1 + 1, 2);
});

اختبارات JVM

تعمل اختبارات JVM على JUnit Platform وتحتاج إلى elide.pkl. المجلد src/test هو مجموعة مصادر الاختبار الافتراضية؛ وتحلّ محله أي مجموعة مصادر مصرّح بها من النوع test (مجموعات المصادر).

  • تحصل مجموعات الاختبار على testPackages إضافة إلى تبعيات المجموعة الرئيسية.
  • تُضاف مكتبات JUnit المضمّنة افتراضيًا. يزيل jvm.features.testing = false واجهات JUnit البرمجية اللازمة للتصريف وبيئة التشغيل المضمّنة معًا؛ وعندها يحتاج تشغيل اختبارات JVM إلى مشغّل JUnit لسطر الأوامر (junit-platform-console) في testPackages، وإلا فشل بخطأ. ولا تتأثر عمليات التشغيل التي لا تتضمن اختبارات JVM.
  • تعمل processors على مصادر الاختبار.
  • تحصل JVM الاختبار على jvm.flags و jvm.defs (بصيغة -D).
  • توضع تبعيات modules لمجموعتي الاختبار والرئيسية على --module-path مع --add-modules=ALL-MODULE-PATH.
  • تتقدم إعدادات التوازي في ملف junit-platform.properties الموجود على مسار أصناف الاختبار على --concurrency.

اختيار الاختبارات

تحصر المسارات أو المجلدات أو أنماط glob اختبارات JavaScript و ⁦TypeScript:⁩

elide test src/api
elide test src/api/client.test.ts

مع وسائط المسارات تُتخطى اختبارات JVM ويُطبع Path filtering unsupported for JVM tests: <paths>. ويطابق -t أسماء الاختبارات في كلا المشغّلين:

elide test -t 'parses .+ headers'

تقبل اختبارات JVM محدِّدات JUnit وتعبيرات الوسوم:

elide test --select=class:com.example.ParserTest
elide test --select=method:com.example.ParserTest#parsesHeaders
elide test --select=package:com.example.parser   # the package and its subpackages
elide test com.example.parser                     # a dotted bare token is a package selector
elide test --include-tag=fast --include-tag=unit  # fast OR unit
elide test --exclude-tag=slow --exclude-tag=flaky # neither slow nor flaky
elide build test --select=class:com.example.ParserTest
0:15 / 0:15

التعبير --include-tag='slow & !flaky' تعبير واحد. وتُطبَّق مرشحات الوسوم بعد المحدِّدات.

المخرجات والتقارير

يذهب التقدم إلى stderr، والحصيلة النهائية إلى ⁦stdout:⁩

elide test > summary.txt
elide test 2> progress.txt

تُكتب التقارير في .dev/reports/tests/<language>/<source-set>/. ويفعّلها testing.reports في elide.pkl دون خيار:

import "elide:Testing.pkl" as Testing

testing {
  reports { Testing.xmlReport() }
}

مخرجات TAP

يجعل --reporter=tap مخرجات stdout تدفق TAP 13 خالصًا:

TAP version 13
# start 1: suite A > t1
# out 1: printed from inside a test
ok 1 - suite A > t1
# start 2: broken
not ok 2 - broken
  ---
  message: "expected 1 to equal 2"
  severity: "ERR_ASSERTION"
  ...
1..2
  • يفتح # start <id> اختبارًا؛ وأسطر مخرجاته بالصيغة # out <id>: <text>. أما # out: <text> فلا ينتمي إلى أي اختبار.
  • تُرقَّم نقاط الاختبار 1..N بترتيب انتهائها. اربط النقاط بالاختبارات عبر سطر # start، لا عبر الرقم.
  • لا تظهر كتلة YAML إلا مع حالات الفشل التي تحمل تفاصيل؛ و severity هو رمز خطأ المشغّل إن وُجد.
  • لا يُغلَّف ⁦stderr:⁩ الأمر elide test --reporter=tap 2>&1 لا ينتج TAP صالحًا.
  • في ⁦JVM:⁩ لا تُنسب المخرجات إلى اختبارها إلا ما دام اختبار واحد بالضبط قيد التشغيل. ومع --concurrency أكبر من 1 أو ملف junit-platform.properties في المشروع، تبقى غير منسوبة.
  • في ⁦JavaScript:⁩ يُغلَّف console.log داخل اختبار، أو في المستوى الأعلى بعد استيراد node:test. أما المخرجات قبل ذلك الاستيراد فتُطبع كما هي. وتنتمي مخرجات الخطّاف إلى الاختبار الذي يحيط به؛ ويُغلَّف t.diagnostic بصيغة # out.

التغطية

elide test --coverage
elide run --coverage

تذهب تغطية JVM إلى .dev/reports/coverage/jvm/<task>/ بصيغة HTML أو XML أو CSV؛ أما تغطية JavaScript و TypeScript فبصيغة LCOV، في .dev/reports/coverage/js/lcov.info للاختبارات و .dev/reports/coverage/js/run/lcov.info لعمليات التشغيل. وتطبع وحدة التحكم ملخصًا واحدًا مجمّعًا. تجمع الكتلة coverage في المستوى الأعلى التغطية دون الخيار:

import "elide:Coverage.pkl" as Coverage

coverage {
  enabled = true
  scope = "tests"
  jvm {
    excludes { "org.example.generated.*" }
    reports {
      Coverage.xmlReport()
      Coverage.htmlReport()
    }
  }
  js {
    paths { "src" }
  }
}
الخاصيةالمعنىالافتراضي
enabledالجمع دون --coverage.false
scope"tests" أو "runs" أو "all"؛ ويغطي --coverage مهمته دائمًا."tests"
jvm.reportsCoverage.htmlReport()، xmlReport()، csvReport().لا شيء
jvm.excludesأنماط أصناف (*، ?) لا تُرصد، مثل الشيفرة المولَّدة.لا شيء
js.pathsجذور المصادر المشمولة في التقرير؛ الفراغ يعني المشروع كله.لا شيء

مع التغطية، يبدأ elide run عملية JVM منفصلة.

الخيارات

الخيارالتأثير
-t REGEXمطابقة اسم الاختبار أو مجموعة الاختبارات المحيطة به.
--where CEL⁦JavaScript:⁩ تشغيل الاختبارات التي يكون فيها تعبير CEL على name و parents و file صحيحًا.
--select=SELECTOR⁦JVM:⁩ محدِّد class: أو method: أو package:؛ قابل للتكرار.
--include-tag=EXPR⁦JVM:⁩ تشغيل الاختبارات التي تطابق وسومها؛ ويُجمع التكرار بـ OR.
--exclude-tag=EXPR⁦JVM:⁩ تخطي الاختبارات التي تطابق وسومها؛ ويُجمع التكرار بـ AND.
--bail[=N]التوقف بعد N حالة فشل (الافتراضي 1).
--test-timeout=MSالمهلة الافتراضية لكل اختبار.
--timeout DURATIONالمهلة الزمنية للاستدعاء كله (عام).
--onlyتشغيل الاختبارات المعلَّمة بـ .only فقط.
--concurrency=Nتشغيل الملفات أو أصناف JVM بالتوازي. الافتراضي 1؛ و 0 غير صالح.
--coverageجمع التغطية؛ راجع التغطية.
--reporter=junitكتابة تقارير JUnit XML.
--reporter=tapكتابة TAP 13 إلى stdout (وتحت --reporter-outfile).
--reporter-outfile=DIRمجلد التقارير.
--debugger[=MODE|ADDRESS]إرفاق مصحِّح أخطاء؛ راجع ما يلي.
--debugger-host=HOST، --debugger-port=PORTعنوان مصحِّح أخطاء JavaScript (المنفذ 4711 لـ DAP، و 1337 لـ CDP).
صيغة --debuggerما يصحّحه
دون قيمةاختبارات JVM عبر JDWP على 127.0.0.1:5005، واختبارات JavaScript.
=5005، =host:5005اختبارات JVM فقط (JDWP).
=dap، =cdpاختبارات JavaScript فقط.

الصياغة: تصحيح الأخطاء. يفشل الخيار المجهول أو القيمة الناقصة قبل تشغيل أي شيء (مهام البناء).

القيود

  • لا يوجد اكتشاف لاختبارات Python؛ شغّل unittest أو pytest بدلًا من ذلك (اختبارات Python).
  • تحتاج اختبارات JVM إلى ملف بيان.
  • غير مُنفَّذ: لقطات node:test، و mock.module، ووضع المراقبة، و run() البرمجي، و node:test/reporters.

الواجهة المدعومة: واجهة اختبارات Node.

أمثلة

ابدأ من قالب:

elide init --template java        # Java app with a JUnit test
elide init --template ktjvm       # Kotlin app with a test

هل كانت هذه الصفحة مفيدة؟