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

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

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

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

  • Cloud Firestore और रीयलटाइम डेटाबेस ट्रिगर के पास पहले से ही ज़रूरत के मुताबिक क्रेडेंशियल हैं. साथ ही, इनके लिए अतिरिक्त सेटअप की ज़रूरत नहीं है.
  • अन्य सभी एपीआई के लिए, इस सेक्शन में बताए गए सेटअप का तरीका अपनाना ज़रूरी है. इनमें पुष्टि करना और FCM जैसे Firebase एपीआई या Cloud Translation या Cloud Speech जैसे Google API शामिल हैं. यह लागू होता है, भले ही आप Cloud Functions शेल का इस्तेमाल कर रहे हों या firebase emulators:start.

एम्युलेट किए गए फ़ंक्शन के लिए, एडमिन क्रेडेंशियल सेट अप करने के लिए:

  1. Google Cloud Console का सेवा खातों वाला पैनल खोलें.
  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
    

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

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

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

myFunctionName(data, options)

रीयलटाइम डेटाबेस, Cloud Firestore, और PubSub ट्रिगर के लिए data पैरामीटर ज़रूरी है. अन्य सभी फ़ंक्शन टाइप के लिए यह पैरामीटर ज़रूरी नहीं है. साथ ही, वैकल्पिक options पैरामीटर सिर्फ़ रीयलटाइम डेटाबेस और 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 एनपीएम मॉड्यूल की तरह होता है. हालांकि, 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 को एम्युलेट करने की सुविधा अभी उपलब्ध नहीं है.

रीयलटाइम डेटाबेस फ़ंक्शन शुरू करना

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

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 फ़ंक्शन चलाता है. इसका मतलब है कि यह बनाने/अपडेट करने/मिटाने वाले इवेंट की नकल करता है, जैसे कि उसे किसी एडमिन के उपयोगकर्ता ने किया हो.

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

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

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

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