اختبار الدوال بشكل تفاعلي

توفر واجهة أوامر Cloud Functions واجهة برمجة تطبيقات تفاعلية لاستدعاء الدوال مع بيانات الاختبار. تتوافق واجهة الأوامر مع جميع أنواع العوامل المشغِّلة.

إعداد بيانات اعتماد المشرف (اختياري)

إذا كنت تريد أن تتفاعل اختبارات الدوال مع Google APIs أو واجهات برمجة تطبيقات Firebase الأخرى من خلال حزمة تطوير البرامج لمشرفي Firebase، قد تحتاج إلى إعداد بيانات اعتماد المشرف.

  • سبق أن تمت إضافة بيانات اعتماد كافية ولا تتطلب مشغِّلات Cloud Firestore و"قاعدة بيانات الوقت الفعلي" عملية إعداد إضافية.
  • تتطلب جميع واجهات برمجة التطبيقات الأخرى، بما في ذلك واجهات برمجة تطبيقات Firebase، مثل المصادقة و"المراسلة عبر السحابة الإلكترونية من Firebase" أو Google APIs، مثل Cloud Translation أو Cloud Speech، اتّباع خطوات الإعداد الموضَّحة في هذا القسم. ينطبق ذلك سواء كنت تستخدم واجهة الأوامر في Cloud Functions أو firebase emulators:start.

لإعداد بيانات اعتماد المشرف للدوال التي تتم محاكاتها:

  1. افتح جزء حسابات الخدمة في وحدة التحكّم في Google Cloud.
  2. تأكَّد من اختيار حساب خدمة App Engine التلقائي واستخدِم قائمة الخيارات على يسار الشاشة لاختيار إنشاء مفتاح.
  3. اختَر JSON لنوع المفتاح وانقر على إنشاء عندما يُطلب منك ذلك.
  4. اضبط بيانات اعتماد Google التلقائية للتوجيه إلى المفتاح الذي تم تنزيله:

    نظام التشغيل Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    شبابيك

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

بعد إكمال هذه الخطوات، يمكن لاختبارات الوظائف الوصول إلى Firebase وGoogle APIs باستخدام SDK للمشرف. على سبيل المثال، عند اختبار عامل تشغيل مصادقة، قد تستدعي الدالة التي تتم محاكاتها admin.auth().getUserByEmail(email).

عرض الدوال باستخدام واجهة أوامر Cloud Functions

تحاكي هيكل وظائف السحابة الإلكترونية جميع أنواع مشغِّلات الدوال باستخدام واجهة أوامر تفاعلية لاستدعاء الدوال مع بيانات الاختبار. تختلف الخيارات حسب نوع الدالة، لكن تنسيق الاستخدام الأساسي هو:

myFunctionName(data, options)

يجب توفّر المَعلمة data لقاعدة بيانات Realtime Database وCloud Firestore وPubSub، وهي اختيارية لجميع أنواع الدوال الأخرى. بالإضافة إلى ذلك، تكون معلَمة options الاختيارية صالحة فقط لدالتَي Realtime Database وCloud Firestore.

بشكل اختياري، يمكنك تحميل بيانات الاختبار من ملف محلي عن طريق حفظ الملف كمتغير واستدعاء دالة معه:

var data = require('./path/to/testData.json');
myFunction(data);

تثبيت واجهة الأوامر في Cloud Functions وإعدادها

لاستخدام هذه الميزة، يجب أن يتوفر لدى firebase-tools الإصدار 3.11.0 كحد أدنى، ويجب أن يتوفر الإصدار 0.6.2 من حزمة تطوير البرامج (SDK) firebase-functions كحد أدنى. لتعديل كليهما، شغِّل الأمرَين التاليَين في دليل functions/ لمشروعك:

npm install --save firebase-functions@latest
npm install -g firebase-tools

إذا كنت تستخدم متغيّرات ضبط الدوال المخصّصة، عليك أولاً تشغيل الأمر للحصول على الإعدادات المخصّصة (عليك تنفيذ هذا الإجراء في دليل functions) في بيئتك المحلية:

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

أخيرًا، شغّل Shell باستخدام الأمر التالي:

firebase functions:shell

استدعاء دوال HTTPS

لاستدعاء دوال HTTPS في واجهة الأوامر، يكون الاستخدام مماثلاً لوحدة request NPM، لكن استبدِل request باسم الدالة التي تريد محاكاتها. على سبيل المثال:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

استدعاء دوال HTTPS القابلة للاستدعاء

عند استدعاء دوال HTTPS القابلة للاستدعاء محليًا، ستحتاج إلى توفير بيانات اختبار مناسبة.

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

ويمكنك اختياريًا تمرير Firebase-Instance-ID-token كمَعلمة ثانية. ويجب أن تكون سلسلة.

# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

محاكاة context.auth غير متاحة حاليًا.

استدعاء دوال قاعدة بيانات الوقت الفعلي

عند تشغيل دوال قاعدة البيانات في الوقت الفعلي محليًا، ستحتاج إلى توفير بيانات اختبار مناسبة. ويعني ذلك بشكل عام توفير بيانات اختبار جديدة لعمليات onCreate والبيانات القديمة أو التي تمت إزالتها لعمليات onDelete والدالتَين onUpdate أو onWrite:

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

بالإضافة إلى خيارات before/after، توفّر واجهة الأوامر خيار params لاستخدامه في محاكاة أحرف البدل في أحد المسارات:

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

بشكل افتراضي، تقوم واجهة الأوامر بتشغيل دوال قاعدة البيانات في الوقت الفعلي مع امتيازات المشرف (حساب الخدمة). يمكنك استخدام الخيار auth بدلاً من ذلك لتشغيل الدوال كمستخدم نهائي مُعيّن أو كمستخدم لم تتم مصادقته:

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

استدعاء دوال Firestore

عند تشغيل دوال Firestore محليًا، ستحتاج إلى توفير بيانات اختبار مناسبة. ويعني ذلك بشكل عام توفير بيانات اختبار جديدة لعمليات onCreate والبيانات القديمة أو التي تمت إزالتها لعمليات onDelete والدالتَين onUpdate أو onWrite. لاحظ أن بيانات Firestore يجب أن تكون أزواج مفاتيح/قيم؛ راجع أنواع البيانات المتوافقة.

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

بالإضافة إلى الحقول before/after في الكائن data، يمكنك استخدام الحقول params في الكائن options لمحاكاة أحرف البدل في اسم المستند:

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

تشغّل واجهة الأوامر دائمًا وظائف Firestore بامتيازات إدارية، ما يعني أنّها تسخر من حدث إنشاء/تحديث/حذف كما لو أنه قد تم بواسطة مستخدم إداري.

استدعاء دوال PubSub

بالنسبة إلى دوال PubSub، أدخِل حمولة الرسائل في مثيل Buffer وأضِف سمات البيانات اختياريًا على النحو الموضّح:

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

استدعاء وظائف "إحصاءات Google"

يمكنك استدعاء دالة "إحصاءات Google" بدون أي بيانات عن طريق تشغيل myAnalyticsFunction() في واجهة الأوامر. لتشغيل الدالة باستخدام بيانات الاختبار، ننصحك بتحديد متغيّر لحقول بيانات الأحداث المحدّدة التي تحتاج إليها دالتك:

var data = {
  eventDim: [{
    // populates event.data.params
    params: {foo: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

استدعاء وظيفتي التخزين والمصادقة

بالنسبة إلى وظيفتي التخزين والمصادقة، يمكنك استدعاء الدالة المحلية مع بيانات الاختبار التي تريد رؤيتها داخل الدالة. يجب أن تتّبع بيانات الاختبار تنسيقات البيانات المقابلة:

حدد فقط الحقول التي تعتمد عليها التعليمات البرمجية، أو لا تحدد على الإطلاق إذا كنت تريد تشغيل الدالة فقط.