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

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

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

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

  • تحتوي المُشغِّلات Cloud Firestore وRealtime Database على بيانات اعتماد كافية، ولا تتطلبان إعدادًا إضافيًا.
  • تتطلّب جميع واجهات برمجة التطبيقات الأخرى، بما في ذلك واجهات برمجة تطبيقات Firebase، مثل Authentication وFCM أو واجهات برمجة تطبيقات Google، مثل Cloud Translation أو Cloud Speech، خطوات الإعداد الموضّحة في هذا القسم. ينطبق ذلك سواء كنت تستخدم Cloud Functions shell أو 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
    

    Windows

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

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

عرض الدوالّ باستخدام بيئة Cloud Shell

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

myFunctionName(data, options)

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

يمكنك اختياريًا تحميل بيانات اختبار من ملف متوفر على الجهاز من خلال حفظ الملف كمتغيّر واستخدامه مع دالة:

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

تثبيت Shell في Cloud Functions وضبطه

لاستخدام هذه الميزة، يجب أن يكون الإصدار firebase-tools على الأقل 3.11.0، ويجب أن يكون الإصدار firebase-functions SDK على الأقل 0.6.2. لتعديل كليهما، نفِّذ الطلبات التالية في دليل 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 في واجهة الأوامر، يكون الاستخدام مماثلاً لوحدة NPM request، ولكن استبدِل 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);

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

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

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