اختبارات واجهة برمجة التطبيقات (API) الخاصة بك تعمل بنجاح على حاسوبك المحمول. السؤال الحقيقي هو ما إذا كانت تعمل على كل طلب سحب، وكل دمج، وكل بناء ليلي، دون تدخل بشري. هذه المهمة تقع على عاتق أداة تشغيل سطر الأوامر. إنها تأخذ الاختبارات التي قمت بإنشائها بالفعل وتنفذها بدون واجهة رسومية داخل مسار عملك، وتخرج برمز حالة نظيف، وتكتب تقريرًا يمكن لوحة تحكم التكامل المستمر (CI) الخاصة بك قراءته.
تظهر أداتا تشغيل باستمرار عندما تقوم الفرق بإعداد هذا: واجهة سطر الأوامر Bruno CLI وواجهة سطر الأوامر Apidog CLI. إنهما تحلان نفس المشكلة من نقاط انطلاق مختلفة. Bruno هو عميل API أصلي لـ Git، يعمل بدون اتصال بالإنترنت أولاً، ومفتوح المصدر، وواجهة سطر الأوامر الخاصة به تشغل ملفات .bru التي توجد في مستودعك. Apidog هي منصة API شاملة، وواجهة سطر الأوامر الخاصة بها تشغل سيناريوهات الاختبار المرئية التي تبنيها في التطبيق. كلاهما يتكامل مع GitHub Actions وGitLab CI وJenkins وأي شيء آخر يستخدم Node.js. وكلاهما يفشل عملية البناء عندما يفشل اختبار. تظهر الاختلافات في كيفية إنشاء الاختبارات، وكيفية المصادقة، وكيف تنتقل تعريفات الاختبار إلى التكامل المستمر (CI).
هذه مقارنة صريحة ومفصلة بين الاثنين على مستوى الأوامر. لا توجد مغالطات. يقوم Bruno بالعديد من الأشياء بشكل جيد حقًا، وسترى بالضبط أين تتناسب كل أداة تشغيل قبل ربط إحداها بمسار عملك.
خلاصة القول
- Bruno CLI (
@usebruno/cli، الثنائيbru) يشغل ملفات.bruمباشرة من مجلد في مستودع Git الخاص بك. إنه مفتوح المصدر، يعمل بدون اتصال، ولا يحتاج إلى حساب أو رمز مميز. توجهه إلى دليل فيقوم بتشغيل كل طلب وتأكيد يجده. - Apidog CLI (
apidog-cli، الثنائيapidog) يشغل سيناريوهات الاختبار التي تصممها في تطبيق Apidog، يتم جلبها بواسطة المعرف باستخدام رمز وصول. لا تعيد كتابة الاختبارات ككود؛ السيناريو المرئي هو الاختبار، وواجهة سطر الأوامر تنفذه بدون واجهة رسومية. - كلاهما يصدر تقارير JUnit وJSON وHTML، وكلاهما يفشل عملية البناء عند فشل اختبار. JUnit XML هو ما يتصل بلوحات تحكم التكامل المستمر (CI) في كلتا الحالتين.
- اختر Bruno عندما تريد كل شيء في المستودع، وبدون حسابات، وتحكم كامل غير متصل بالإنترنت بملفات الاختبار النصية العادية.
- اختر Apidog عندما تريد إنشاء مرئي، وتسلسل السيناريوهات، وإدارة البيئات، وتشغيل الاختبارات المعتمدة على البيانات دون الحاجة إلى صيانة كود الاختبار يدويًا.
المشكلة الحقيقية: الاختبارات الموجودة التي لا يتم تشغيلها أبدًا
الاختبار الذي تقوم بتشغيله يدويًا هو اختبار يتدهور. قام أحدهم ببنائه، واجتاز مرة واحدة، ثم ظل دون تغيير بينما تطورت واجهة برمجة التطبيقات (API) تحته. الحل ليس في المزيد من الاختبارات. بل هو في الاختبارات التي تعمل تلقائيًا عند كل تغيير، مع إشارة نجاح/فشل يمكن لخط الأنابيب أن يتصرف بناءً عليها.
أداة تشغيل سطر الأوامر هي ما يسد هذه الفجوة. تحتاج إلى ثلاثة أشياء لتكون مفيدة في التكامل المستمر (CI): يجب أن تعمل بدون واجهة رسومية، ويجب أن تخرج بقيمة غير صفرية عند فشل شيء ما لتظهر عملية البناء باللون الأحمر، ويجب أن تكتب تقريرًا قابلاً للقراءة آليًا حتى يرى المراجعون ما حدث من عطل. يتجاوز كل من Bruno وApidog هذا المعيار. يكمن اختلافهما قبل أمر التشغيل، في كيفية كتابة الاختبار وأين يقيم.
إذا كنت تقوم بإعداد التكامل المستمر (CI) من الصفر، فإن الأنماط الأوسع في أتمتة اختبارات واجهة برمجة التطبيقات (API) في CI/CD تستحق القراءة جنبًا إلى جنب مع هذه المقارنة. هنا نركز على أداتي التشغيل نفسهما.
ما يميز Bruno CLI
تصميم Bruno بأكمله أصلي لـ Git. كل طلب، وبيئة، وتأكيد هو ملف نصي عادي .bru على القرص، داخل مستودعك، يتم التحكم في إصداراته كأي ملف مصدر آخر. هذا النموذج له مزايا حقيقية، ويستحق ذكرها بوضوح قبل أي مقارنة.
تتواجد اختباراتك مع كودك. طلب السحب الذي يغير نقطة نهاية يمكنه تغيير الاختبار الخاص بنقطة النهاية هذه في نفس الفرق، ويتم مراجعته من قبل نفس الشخص. لا يوجد نظام منفصل للمزامنة، ولا نسخة سحابية يمكن أن تبتعد عما هو موجود في المستودع. الفروقات قابلة للقراءة لأن التنسيق نصي. يمكنك البحث عن اختباراتك، وإعادة هيكلتها بنفس الأدوات التي تستخدمها للكود، وحل تعارضات الدمج في محرر.
إنه أيضًا مفتوح المصدر ويعمل بدون اتصال بالإنترنت. تعمل واجهة سطر الأوامر بالكامل على جهازك أو على عامل تشغيل التكامل المستمر (CI) الخاص بك بدون حساب أو تسجيل دخول أو رمز مميز. بالنسبة للفرق ذات القواعد الصارمة للتعامل مع البيانات أو البيئات المعزولة، هذا أمر مهم. يضيف المستوى المدفوع من Bruno، Bruno Ultimate، ميزات الفريق بما في ذلك SSO وSCIM، وتكاملات مدير الأسرار، وقدرات التدقيق، لذا فإن المشروع ليس مجرد أداة لهواة. ولكن العميل الأساسي وواجهة سطر الأوامر مجانيان ومكتفيان ذاتيًا، وهذه قوة مشروعة.
تثبيته يكون بأمر واحد:
npm install -g @usebruno/cli
الملف التنفيذي هو bru. يمكنك تشغيل مجموعة عن طريق توجيهها إلى المجلد الذي يحتوي على ملفات .bru الخاصة بك:
bru run --env staging
عند التشغيل من داخل دليل المجموعة، ينفذ bru run الطلبات التي يجدها هناك. أضف -r للبحث في المجلدات الفرعية بحيث يلتقط الطلبات المتداخلة:
bru run -r --env staging
هذه هي الحلقة الأساسية. لا توجد معرفات، ولا رمز مميز، ولا جلب عن بعد. الملفات في المجلد هي الاختبارات، وواجهة سطر الأوامر تشغلها.
لقد تناولنا قصة Bruno الأوسع في ما يميز Bruno كعميل API أصلي لـ Git وأين تظهر قيوده للفرق الكبيرة. بالنسبة للتكامل المستمر (CI) على وجه التحديد، فإن نقاط القوة المذكورة أعلاه هي التي تهم.
ما يميز Apidog CLI
Apidog يسلك مسارًا مختلفًا لنفس خط الأنابيب. تقوم ببناء الاختبارات بصريًا في تطبيق Apidog: تسلسل الطلبات في سيناريو، وتضيف تأكيدات، وتستخرج قيمة من استجابة واحدة إلى الطلب التالي، وتكرر العملية بأكملها على ملف بيانات. واجهة سطر الأوامر هي المنفذ بدون واجهة رسومية لهذه السيناريوهات. لا تملك تنسيق ملف خاص بها. إنها تجلب السيناريو الذي تسميه بواسطة المعرف من مشروع Apidog الخاص بك وتشغله تمامًا كما يفعل التطبيق.
الميزة هي أنه لا يوجد من يقوم بصيانة تمثيلين لنفس الاختبار. السيناريو في المشروع هو الاختبار. تقوم بإنشائه في باني مرئي يتعامل مع تسلسل الطلبات، واستخراج المتغيرات، والتأكيدات دون أن تكتب وتصحح ملفات السكريبت. ثم تقوم واجهة سطر الأوامر بتشغيل نفس السيناريو في التكامل المستمر (CI). حلقة الإنشاء السريعة وحلقة الأتمتة تستخدمان مصدرًا واحدًا للحقيقة.
التثبيت هو أمر npm واحد:
npm install -g apidog-cli
الملف التنفيذي هو apidog. عملية تشغيل نموذجية تسمي سيناريو بواسطة المعرف، وتختار بيئة، وتصادق باستخدام رمز وصول:
apidog run --access-token $APIDOG_ACCESS_TOKEN -t 605067 -e 1629989 -n 1 -r html,junit
لا تكتب هذه المعرفات يدويًا. افتح سيناريو الاختبار، انتقل إلى علامة التبويب CI/CD الخاصة به، أنشئ رمز وصول، وسيقوم Apidog ببناء الأمر الكامل لك مع معرف السيناريو ومعرف البيئة مملوءين مسبقًا. تقوم بنسخه مرة واحدة، ثم تنقل الرمز إلى سر CI وتستشير إليه كـ $APIDOG_ACCESS_TOKEN. يوجد المرجع الكامل للأعلام في الدليل الشامل لـ Apidog CLI إذا كنت تريد كل الخيارات في مكان واحد.
النموذج المعتمد على الرموز هو أوضح اختلاف عن Bruno. يقوم Apidog بتشغيل الاختبارات المخزنة في مشروع تصل إليه واجهة سطر الأوامر عبر الشبكة، بعد المصادقة. بينما يقوم Bruno بتشغيل الاختبارات المخزنة كملفات تقرأها واجهة سطر الأوامر من القرص. كلاهما ليس خاطئًا؛ إنهما يناسبان إعدادات فرق مختلفة.
مقارنة جنبًا إلى جنب
| البعد | Bruno CLI (bru) |
Apidog CLI (apidog) |
|---|---|---|
| الحزمة | @usebruno/cli |
apidog-cli |
| أمر التشغيل | bru run |
apidog run |
| مصدر الاختبار | ملفات .bru في مستودع Git الخاص بك |
سيناريوهات الاختبار في مشروع Apidog الخاص بك، يتم جلبها بالمعرف |
| التأليف | تحرير الملفات النصية يدويًا أو استخدام تطبيق Bruno | منشئ السيناريوهات المرئي في تطبيق Apidog |
| المصادقة في CI | لا شيء؛ يعمل بدون اتصال | رمز الوصول (--access-token) |
| تحديد ما يتم تشغيله | مسار المجلد، -r متكرر، --tags |
-t سيناريو، -f مجلد، --test-suite |
| البيئة | --env <name> |
-e <environmentId> |
| مدفوع بالبيانات | --csv-file-path، --json-file-path |
-d <path> (CSV أو JSON) |
| التكرارات | --iteration-count <n> |
-n <n> |
| أدوات إعداد التقارير | JSON، JUnit، HTML | cli، html، json، junit |
| الفشل السريع | --bail |
--on-error end (افتراضيًا يفشل عند الخطأ الأول) |
| مفتوح المصدر | نعم | لا (واجهة سطر أوامر npm مجانية؛ تشغل السيناريوهات من خطتك) |
| الترخيص/الحساب | لا شيء لواجهة سطر الأوامر | حساب Apidog للمشروع |
يبرز شيئان. أولاً، يغطي كلا المحركين نفس أساسيات التكامل المستمر (CI): اختيار البيئة، والتكرار المدفوع بالبيانات، وتنسيقات التقارير الثلاثة المهمة، والخروج بقيمة غير صفرية عند الفشل. ثانيًا، الانقسام يتعلق بمكان وجود الاختبار وكيف كتبته، وليس بالقدرة الخام. يحتفظ Bruno بالاختبار في المستودع كنص. بينما يحتفظ Apidog به في المشروع كسيناريو مرئي ويشغله بالمرجع.
أدوات إعداد التقارير ورموز الخروج: الأجزاء التي يقرأها CI فعليًا
يكسب أداة التشغيل مكانتها في خط الأنابيب من خلال سلوكين: التقرير الذي تكتبه ورمز الخروج الذي تُرجعه. إذا قمت بذلك بشكل صحيح، فالبقية مجرد توصيلات.
يكتب Bruno التقارير باستخدام أعلام خاصة بكل تنسيق. تمرر مسارًا لكل تنسيق تريده:
bru run -r --env staging \
--reporter-junit ./results/junit.xml \
--reporter-html ./results/report.html \
--reporter-json ./results/report.json
ملف JUnit XML هو ما تقوم لوحة تحكم التكامل المستمر (CI) بتحليله إلى شجرة نجاح/فشل. تقرير HTML هو قطعة أثرية قابلة للتصفح. يوقف --bail الخاص بـ Bruno التشغيل بعد أول طلب، اختبار، أو تأكيد فاشل، مما يحافظ على سرعة التغذية الراجعة في اختبار الدخان. بدون --bail، يشغل كل شيء ويبلغ عن جميع الإخفاقات دفعة واحدة.
يستخدم Apidog علامة -r واحدة مع قائمة مفصولة بفواصل، ويكتب كل شيء تحت دليل إخراج واحد:
apidog run --access-token $APIDOG_ACCESS_TOKEN -t 605067 \
-r html,junit --out-dir ./apidog-reports
تحدد علامته --on-error سلوك منتصف السيناريو: end يتوقف عند الفشل الأول (الافتراضي)، continue يشغل كل خطوة بحيث تجمع جميع الإخفاقات في تقرير واحد، و ignore يتجاوز خطوة معروفة بالتقلب. في كلتا الحالتين، ينتهي التشغيل بقيمة غير صفرية إذا فشل أي شيء.
عقد رمز الخروج هو نفسه في كلا الجانبين وهو الجزء الأساسي الذي يتحمل العبء. عندما يفشل تأكيد، تخرج أداة التشغيل برمز غير صفري. يقرأ CI هذا الرمز، ويحدد الخطوة كفاشلة، ويفشل المهمة، ويمنع الدمج أو النشر. لا تحتاج إلى إعداد أي شيء إضافي. المصيدة الوحيدة، المتطابقة لكلا الاثنين، هي ابتلاع رمز الخروج: إذا قمت بتضمين التشغيل في مسار أنابيب Shell أو أضفت || true، يتم ابتلاع الخروج غير الصفري وتتوقف البوابة عن العمل بصمت. لا تفعل ذلك.
Bruno CLI في GitHub Actions
نظرًا لأن ملفات .bru موجودة بالفعل في المستودع، فإن سير العمل قصير. قم بسحب الكود، ثم تثبيت واجهة سطر الأوامر، وتشغيل المجموعة، ورفع التقرير.
name: API tests
on:
pull_request:
branches: [main]
jobs:
api-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Bruno CLI
run: npm install -g @usebruno/cli
- name: Run API tests
working-directory: ./api-tests
run: bru run -r --env staging --reporter-junit ./results/junit.xml
- name: Upload report
if: always()
uses: actions/upload-artifact@v4
with:
name: bruno-report
path: ./api-tests/results
يشير working-directory إلى المجلد الذي يحتوي على مجموعتك. يحافظ if: always() على تشغيل تحميل التقرير حتى عند فشل الاختبارات، وهذا بالضبط هو الوقت الذي تريد قراءته فيه. لا توجد حاجة إلى سر لأنه لا يوجد شيء يصادق على خدمة بعيدة.
Apidog CLI في GitHub Actions
سير عمل Apidog هو نفسه هيكليًا، مع إضافة واحدة: رمز الوصول يأتي من أسرار المستودع، وتختار السيناريو بواسطة المعرف بدلاً من مسار المجلد.
name: API tests
on:
pull_request:
branches: [main]
jobs:
api-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Apidog CLI
run: npm install -g apidog-cli
- name: Run API test scenario
run: |
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t 605067 \
-e 1629989 \
-r html,junit \
--out-dir ./apidog-reports
env:
APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}
- name: Upload report
if: always()
uses: actions/upload-artifact@v4
with:
name: apidog-report
path: ./apidog-reports
لاحظ التماثل. نفس عملية السحب (checkout)، نفس إعداد Node، نفس شكل التثبيت ثم التشغيل، نفس الرفع الدائم. الاختلافات الحقيقية الوحيدة هي الرمز المميز الذي يتم ربطه كسر، والسيناريو الذي يتم تحديده بالمعرف. إذا كنت تريد توسيع هذا ليشمل متغيرات GitLab CI وJenkins أيضًا، فإن الدليل الكامل لـ Apidog CLI يحمل نفس النمط عبر أدوات التشغيل.
كيف تختار
نادرًا ما يتوقف القرار على أي أداة تشغيل هي "الأفضل". بل يعتمد على كيفية رغبة فريقك في إنشاء وتخزين الاختبارات.
اختر Bruno عندما يكون المستودع هو مصدر الحقيقة. إذا كنت تريد أن يكون كل اختبار ملفًا نصيًا عاديًا يعيش بجانب الكود الذي يغطيه، ويتم مراجعته في نفس طلب السحب، بدون حساب وبدون اتصال بالشبكة عند التشغيل، فإن Bruno يتناسب تمامًا مع هذا النموذج. إنه الخيار الطبيعي للفرق التي تتعامل مع الاختبارات ككود، وتقدر الأدوات التي تعمل بدون اتصال ومفتوحة المصدر، وتشعر بالراحة في تحرير ملفات .bru مباشرة. يضيف Bruno Ultimate ميزات SSO وSCIM وتكاملات مدير الأسرار وميزات التدقيق إذا كنت بحاجة لاحقًا إلى طبقة الفريق والحوكمة، لذا فإن التوسع فيه يعد خيارًا وليس حاجزًا.
اختر Apidog عندما تكون سرعة الإنشاء وسير العمل المتكامل أكثر أهمية من التحكم على مستوى الملفات. إذا كنت تفضل بناء سيناريو اختبار بصريًا، وتسلسل الطلبات، واستخراج المتغيرات، وتشغيل نفس السيناريو عبر البيئات دون كتابة وتصحيح كود الاختبار يدويًا، فإن نموذج Apidog يزيل هذا الاحتكاك. يتواجد التصميم والتصحيح والمحاكاة والاختبار في مساحة عمل واحدة، وتشغل واجهة سطر الأوامر السيناريو المحدد الذي بنيته. بالنسبة للفرق القادمة من إعداد Postman، فإن النموذج الذهني يتوافق بسلاسة، ومسار الترحيل هو ما يغطيه Apidog كـ بديل Postman لاختبار API.
يوجد أيضًا إجابة تتضمن كلا الأداتين. تحتفظ بعض الفرق بملفات Bruno الأصلية لـ Git لإجراء فحوصات الطلبات منخفضة المستوى، وتستخدم Apidog للسيناريوهات المتسلسلة الأكبر وتشغيل اختبارات الانحدار المكثفة للبيئة. تتعايش واجهتا سطر الأوامر بشكل جيد في خط أنابيب واحد؛ إنهما خطوتان منفصلتان برموز خروج منفصلة.
إذا كنت تتخذ قرارًا بين المنصتين بشكل أوسع، وليس فقط واجهات سطر الأوامر، فإن مقارنة Apidog مقابل Bruno تغطي التصميم، والمحاكاة، والتعاون بما يتجاوز سطر الأوامر. لإعداد أول سيناريو مؤتمت وتشغيله من الطرفية في نفس اليوم، قم بتنزيل Apidog وانسخ الأمر الذي تم إنشاؤه من علامة تبويب CI/CD لأي سيناريو.
الأسئلة المتكررة
هل Bruno CLI مجاني؟
نعم. Bruno CLI مفتوح المصدر ويتم شحنه كحزمة npm @usebruno/cli. يعمل بالكامل على جهازك أو عامل تشغيل التكامل المستمر (CI) الخاص بك بدون حساب أو رمز مميز. Bruno Ultimate هو مستوى مدفوع منفصل يضيف ميزات الفريق والحوكمة مثل SSO وSCIM وتكاملات مدير الأسرار والتدقيق، لكن واجهة سطر الأوامر نفسها مجانية.
هل Apidog CLI مجاني؟
واجهة سطر الأوامر هي حزمة npm مجانية، apidog-cli. تقوم بتشغيل سيناريوهات الاختبار من مشروع Apidog الخاص بك، لذا فإن ما يمكنك تشغيله يعتمد على خطة Apidog الخاصة بك، لكن أداة تشغيل سطر الأوامر ليست منتجًا مدفوعًا منفصلاً.
هل يجب أن أكتب الاختبارات ككود لأي من أداتي التشغيل؟
بالنسبة لـ Bruno، اختباراتك هي ملفات .bru يمكنك تحريرها يدويًا أو إنشاؤها في تطبيق Bruno، لذا يوجد تنسيق نصي ستتعامل معه مباشرة. أما بالنسبة لـ Apidog، فتقوم ببناء السيناريوهات بصريًا في التطبيق وتشغل واجهة سطر الأوامر هذه السيناريوهات بواسطة المعرف، لذلك لا تحتاج إلى صيانة كود الاختبار يدويًا. هذا هو الاختلاف الأساسي في طريقة الإنشاء بين الاثنين.
هل يفشل كلا المحركين عملية البناء عند فشل الاختبار؟
نعم. كلاهما يخرج برمز غير صفري عندما يفشل تأكيد، وهو ما يقرأه CI لتحديد الخطوة كفاشلة ومنع الدمج أو النشر. يوقف --bail الخاص بـ Bruno عند الفشل الأول؛ ويقوم --on-error end الخاص بـ Apidog بنفس الشيء وهو الافتراضي. تجنب تضمين أي تشغيل في || true، فهذا يبتلع رمز الخروج ويعطل البوابة.
ما هو تنسيق التقرير الذي يجب أن أستخدمه في CI؟
استخدم JUnit XML للنتائج القابلة للقراءة آليًا التي تحللها لوحة تحكم CI الخاصة بك إلى شجرة نجاح/فشل، وأضف HTML إذا كنت تريد قطعة أثرية قابلة للتصفح. يكتبها Bruno باستخدام --reporter-junit و --reporter-html؛ ويستخدم Apidog -r html,junit. كلاهما يدعم أيضًا JSON للمعالجة اللاحقة المخصصة.
هل يحتاج Bruno CLI إلى اتصال بالإنترنت أو حساب للتشغيل؟
لا. يقوم Bruno بتشغيل ملفات .bru في مستودعك محليًا، بدون تسجيل دخول وبدون جلب عن بعد، مما يجعله مناسبًا لـ CI غير المتصل بالإنترنت أو المعزول. واجهة سطر الأوامر الخاصة بـ Apidog تصادق باستخدام رمز وصول وتجلب السيناريو من مشروعك، لذلك تحتاج إلى وصول الشبكة إلى خدمة Apidog وقت التشغيل.
هل يمكنني تشغيل أي من واجهتي سطر الأوامر بدون تثبيت عام؟
نعم لكلا الاثنين. استخدم npx @usebruno/cli run ... أو npx apidog-cli run ... للتنفيذ بدون تثبيت عام دائم، وهو أمر مريح على عوامل تشغيل CI المؤقتة. قم بتشغيل bru run --help أو apidog run --help لتأكيد الخيارات الدقيقة المتاحة في نسختك المثبتة.
