फ़ंक्शन को इंटरैक्टिव तरीके से टेस्ट करें

Cloud Functions शेल, टेस्ट डेटा के साथ फ़ंक्शन को चालू करने के लिए एक इंटरैक्टिव शेल उपलब्ध कराता है. शेल, सभी ट्रिगर टाइप के साथ काम करता है.

एडमिन क्रेडेंशियल सेट अप करना (ज़रूरी नहीं)

अगर आपको अपने फ़ंक्शन टेस्ट को Firebase Admin SDK के ज़रिए Google API या अन्य Firebase API के साथ इंटरैक्ट करना है, तो आपको एडमिन क्रेडेंशियल सेट अप करने पड़ सकते हैं.

  • Cloud Firestore और Realtime Database ट्रिगर के पास पहले से ही ज़रूरी क्रेडेंशियल होते हैं. इसलिए, इन्हें अलग से सेट अप करने की ज़रूरत नहीं होती.
  • अन्य सभी एपीआई के लिए, इस सेक्शन में बताए गए सेटअप के चरण पूरे करने होंगे. इनमें Firebase के एपीआई, जैसे कि Authentication और FCM या Google के एपीआई, जैसे कि 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
    

इन चरणों को पूरा करने के बाद, आपके फ़ंक्शन टेस्ट, Admin SDK का इस्तेमाल करके Firebase और Google API को ऐक्सेस कर सकते हैं. उदाहरण के लिए, Authentication ट्रिगर की जांच करते समय, एम्युलेट किया गया फ़ंक्शन admin.auth().getUserByEmail(email) को कॉल कर सकता है.

Cloud Functions शेल का इस्तेमाल करके फ़ंक्शन को चालू करना

Cloud Functions शेल, सभी तरह के फ़ंक्शन ट्रिगर का इम्यूलेशन करता है. साथ ही, इसमें टेस्ट डेटा के साथ फ़ंक्शन को चालू करने के लिए इंटरैक्टिव शेल होता है. फ़ंक्शन टाइप के हिसाब से विकल्प अलग-अलग होते हैं. हालांकि, इस्तेमाल करने का बुनियादी फ़ॉर्मैट यह है:

myFunctionName(data, options)

रीयलटाइम डेटाबेस, Cloud Firestore, और PubSub ट्रिगर के लिए data पैरामीटर ज़रूरी है. हालांकि, अन्य सभी फ़ंक्शन टाइप के लिए यह पैरामीटर ज़रूरी नहीं है. साथ ही, options पैरामीटर सिर्फ़ Realtime Database और Cloud Firestore फ़ंक्शन के लिए मान्य है.

विकल्प के तौर पर, किसी लोकल फ़ाइल से टेस्ट डेटा लोड किया जा सकता है. इसके लिए, फ़ाइल को वैरिएबल के तौर पर सेव करें और उसके साथ किसी फ़ंक्शन को शुरू करें:

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

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

आखिर में, इस कमांड का इस्तेमाल करके शेल चलाएं:

firebase functions:shell

एचटीटीपीएस फ़ंक्शन को चालू करना

शेल में एचटीटीपीएस फ़ंक्शन को चालू करने के लिए, 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' })

एचटीटीपीएस कॉलबल फ़ंक्शन शुरू करना

एचटीटीपीएस कॉलबल फ़ंक्शन को स्थानीय तौर पर शुरू करते समय, आपको टेस्ट का सही डेटा देना होगा.

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

अगर चाहें, तो दूसरे पैरामीटर के तौर पर Firebase-Instance-ID-token पास किया जा सकता है. यह एक स्ट्रिंग होनी चाहिए.

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

फ़िलहाल, context.auth के इम्यूलेशन की सुविधा उपलब्ध नहीं है.

Realtime Database फ़ंक्शन को कॉल करना

Realtime Database के फ़ंक्शन को स्थानीय तौर पर चलाने के लिए, आपको टेस्ट डेटा देना होगा. इसका आम तौर पर मतलब है कि 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}})

शेल, डिफ़ॉल्ट रूप से एडमिन (सेवा खाता) के अधिकारों के साथ Realtime Database फ़ंक्शन चलाता है. किसी खास उपयोगकर्ता या बिना पुष्टि किए उपयोगकर्ता के तौर पर फ़ंक्शन चलाने के लिए, 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’} })

data ऑब्जेक्ट के before/after फ़ील्ड के अलावा, दस्तावेज़ के नाम में वाइल्डकार्ड का मज़ाक उड़ाने के लिए, options ऑब्जेक्ट के params फ़ील्ड का इस्तेमाल किया जा सकता है:

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

शेल हमेशा एडमिन के अधिकारों के साथ Firestore फ़ंक्शन चलाता है. इसका मतलब है कि यह create/update/delete इवेंट का मज़ाक उड़ाता है, जैसे कि इसे एडमिन ने किया हो.

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'}})

Analytics फ़ंक्शन को लागू करना

शेल में myAnalyticsFunction() चलाकर, बिना किसी डेटा के Analytics फ़ंक्शन को शुरू किया जा सकता है. टेस्ट डेटा के साथ फ़ंक्शन चलाने के लिए, यह सुझाव दिया जाता है कि उन इवेंट डेटा फ़ील्ड के लिए एक वैरिएबल तय करें जिनकी आपके फ़ंक्शन को ज़रूरत है:

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);

स्टोरेज और पुष्टि करने की सुविधाओं को चालू करना

स्टोरेज और पुष्टि करने वाले फ़ंक्शन के लिए, स्थानीय फ़ंक्शन को उस टेस्ट डेटा के साथ शुरू करें जिसे आपको फ़ंक्शन में देखना है. आपके टेस्ट डेटा का फ़ॉर्मैट, यहां दिए गए डेटा फ़ॉर्मैट के मुताबिक होना चाहिए:

सिर्फ़ उन फ़ील्ड के बारे में बताएं जिन पर आपका कोड निर्भर करता है. अगर आपको सिर्फ़ फ़ंक्शन चलाना है, तो किसी भी फ़ील्ड के बारे में न बताएं.