TestPilot هي أداة لإنشاء اختبارات الوحدة تلقائيًا لحزم NPM المكتوبة في JavaScript/TypeScript باستخدام نموذج لغة كبير (LLM).
لاحظ أن TestPilot يمثل استكشافًا مبكرًا في استخدام LLMs لتوليد الاختبار ، وقد تم توفيره في المصدر المفتوح كأساس للبحث والاستكشاف. لاستخدام ميزات توليد الاختبار اليومية في دردشة Copilot من المحتمل أن تحقق نتائج أفضل.
يقوم TestPilot بإنشاء اختبارات لوظيفة معينة f عن طريق المطالبة بـ LLM مع هيكل عظمي لاختبار f ، بما في ذلك معلومات حول f المضمنة في تعليقات التعليمات البرمجية ، مثل توقيعها ، وجسم f ، وأمثلة من استخدامات f المائية تلقائيًا من وثائق المشروع. ثم يتم تحليل استجابة النموذج وترجمته إلى اختبار وحدة يمكن تشغيله. اختياريا ، يتم إجراء الاختبار وإذا فشل ، يتم مطالب النموذج مرة أخرى بمعلومات إضافية حول الاختبار الفاشل ، مما يتيح له فرصة لتحسين الاختبار.
على عكس الأنظمة الأخرى لتوليد الاختبار المستندة إلى LLM ، لا يتطلب TestPilot أي تدريب إضافي أو تعلم تعزيز ، ولا توجد أمثلة على الوظائف واختباراتها المرتبطة بها.
تتوفر ورقة بحثية تصف TestPilot بالتفصيل على Arxiv و IEEExplore.
بشكل عام ، لكي تكون قادرًا على تشغيل TestPilot ، تحتاج إلى الوصول إلى LLM على غرار المخطوطة مع API الانتهاء. قم بتعيين متغير بيئة TESTPILOT_LLM_API_ENDPOINT على عنوان URL لنقطة نهاية API LLM التي تريد استخدامها ، و TESTPILOT_LLM_AUTH_HEADERS إلى كائن JSON يحتوي على الرؤوس التي تحتاجها للمصادقة مع واجهة برمجة التطبيقات.
قد تكون القيم النموذجية لهذه المتغيرات:
TESTPILOT_LLM_API_ENDPOINT='https://api.openai.com/v1/engines/code-cushman-001/completions'TESTPILOT_LLM_AUTH_HEADERS='{"Authorization": "Bearer <your API key>", "OpenAI-Organization": "<your organization ID>"}'ومع ذلك ، لاحظ أنه يمكنك تشغيل TestPilot في وضع التكاثر دون الوصول إلى واجهة برمجة تطبيقات LLM حيث يتم أخذ استجابات النماذج من إخراج التشغيل السابق ؛ انظر أدناه للحصول على التفاصيل.
يمكنك تثبيت TestPilot من حزمة مصنوعة مسبقًا أو من المصدر.
TestPilot هو متاح كحزمة NPM تم إنشاؤها مسبقًا ، على الرغم من أنها لم يتم نشرها حاليًا في سجل NPM. يمكنك تنزيل Tarball من المستودع وتثبيته بالطريقة المعتادة. لاحظ أن هذا التوزيع يحتوي فقط على الجزء الأساسي من TestPilot ، وليس تسخير القياس.
يحتوي الدليل src/ على رمز المصدر لـ TestPilot ، والذي يتم كتابته في TypeScript ويتم تجميعه في dist/ Directory. الاختبارات في test/ ؛ يحتوي benchmark/ الدليل على تسخير القياس لتشغيل TestPilot على حزم NPM متعددة ؛ و ql/ يحتوي على استعلامات CodeQL المستخدمة لتحليل النتائج.
في الدليل الجذري لفريق الخروج من هذا المستودع ، قم بتشغيل npm build لتثبيت التبعيات وإنشاء الحزمة.
يمكنك أيضًا استخدام npm run build:watch للبناء تلقائيًا في أي وقت تقوم فيه بإجراء تغييرات على الرمز. ومع ذلك ، لاحظ أن هذا لن يقوم تلقائيًا بتثبيت التبعيات ، ولن يقوم أيضًا ببناء تسخير القياس.
استخدم npm run test لتشغيل الاختبارات. للراحة ، سيؤدي ذلك أيضًا إلى تثبيت التبعيات وتشغيل البناء.
إذا قمت بتثبيت TestPilot من المصدر ، فيمكنك استخدام تسخير القياس لتشغيل TestPilot على حزم متعددة وتحليل النتائج. هذا غير متوفر حاليًا إذا قمت بتثبيت TestPilot من حزمة تم تصميمها مسبقًا.
الاستخدام الأساسي على النحو التالي:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > هذا ينشئ اختبارات لجميع الوظائف التي تم تصديرها بواسطة الحزمة في <package_dir> ، والتحقق من صحةها ، ويكتب النتائج إلى <report_dir> .
لاحظ أن هذا يفترض أنه يتم تثبيت تبعيات الحزم وأن أي خطوات بناء قد تم تشغيلها (على سبيل المثال ، باستخدام npm i و npm run build ). يعتمد TestPilot أيضًا على mocha ، لذلك إذا لم تعتمد الحزمة قيد الاختبار بالفعل ، فيجب عليك تثبيتها بشكل منفصل ، على سبيل المثال باستخدام الأمر npm i --no-save mocha .
يقوم سير عمل run-experiment.yml بتجربة تجربة على إجراءات GitHub ، مما ينتج عن التقرير النهائي كقنين يمكنك تنزيله. تحتوي results-all على نتائج جميع الحزم ، بينما تحتوي القطع الأثرية الأخرى على نتائج فردية لكل حزمة.
نتائج TestPilot غير محددة ، لذلك حتى إذا قمت بتشغيلها من نفس الحزمة على نفس الجهاز عدة مرات ، فستحصل على نتائج مختلفة. ومع ذلك ، فإن القياس القياسي تسخير يسجل بيانات كافية لتكون قادرة على إعادة تشغيل المعيار في العديد من الحالات.
للقيام بذلك ، استخدم خيارات --api و --responses لإعادة استخدام قوائم واجهة برمجة التطبيقات والاستجابات من المدى السابق:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > --api < api.json > --responses < prompts.json >لاحظ أنه بشكل افتراضي ، ستفشل إعادة التشغيل إذا لم يتم العثور على أي من المطالبات في ملف الردود. يحدث هذا عادةً إذا كان TestPilot يقوم بتحسين اختبارات الفشل ، لأنه في هذه الحالة يعتمد مطالبة النموذج على رسالة الفشل الدقيقة ، والتي يمكن أن تكون خاصة بالنظام (على سبيل المثال ، تحتوي على مسارات للنظام المحلي) ، أو تعتمد على إصدار Node.js أو عوامل أخرى.
للتغلب على هذه القيود ، يمكنك تمرير مقبض العلم --strictResponses false معاملة المطالبات المفقودة من خلال معاملتها على أنها لا تحصل على أي استجابة من النموذج. لن ينتج هذا بشكل عام نفس النتائج مثل التشغيل الأولي ، ولكنه يكفي في كثير من الحالات.
يمكن استخدام استعلامات CodeQL في ql/queries لتحليل نتائج تشغيل التجربة. راجع ql/CodeQL.md للحصول على إرشادات حول كيفية إعداد CODEQL وتشغيل الاستعلامات.
هذا المشروع مرخص بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا مفتوح المصدر. يرجى الرجوع إلى معهد ماساتشوستس للتكنولوجيا للشروط الكاملة.
TestPilot هو نموذج أولي للبحث وليس مدعومًا رسميًا. ومع ذلك ، إذا كانت لديك أسئلة أو تعليقات ، فيرجى تقديم مشكلة وسنبذل قصارى جهدنا للرد.
نشكر Aryaz Eghbali (@Maraze) على عمله على الإصدار الأولي من TestPilot.