Catch up on everthing we announced at this year's Firebase Summit. Learn more

ক্লাউড ফাংশনগুলির ইউনিট টেস্টিং

এই পৃষ্ঠাটি আপনার ফাংশনগুলির জন্য ইউনিট পরীক্ষা লেখার জন্য সর্বোত্তম অনুশীলন এবং সরঞ্জামগুলি বর্ণনা করে, যেমন পরীক্ষা যা একটি অবিচ্ছিন্ন ইন্টিগ্রেশন (CI) সিস্টেমের একটি অংশ হবে। পরীক্ষা সহজতর করার জন্য, Firebase ক্লাউড ফাংশনের জন্য Firebase টেস্ট SDK প্রদান করে। এটা তোলে যেমন npm উপর বিতরণ করা হয় firebase-functions-test , এবং একটি সহচর পরীক্ষা SDK এর হয় firebase-functions । ক্লাউড ফাংশনের জন্য ফায়ারবেস টেস্ট SDK:

  • যেমন প্রয়োজনীয় সেটিং এবং unsetting এনভায়রনমেন্ট ভেরিয়েবল হিসেবে আপনার পরীক্ষার জন্য এবং উপযুক্ত সেটআপ যত্ন টিয়ারডাউন লাগে firebase-functions
  • নমুনা ডেটা এবং ইভেন্ট প্রসঙ্গ জেনারেট করে, যাতে আপনাকে শুধুমাত্র আপনার পরীক্ষার সাথে প্রাসঙ্গিক ক্ষেত্রগুলি নির্দিষ্ট করতে হবে।

পরীক্ষা সেটআপ

উভয় ইনস্টল করুন firebase-functions-test এবং একজাতীয় উৎকৃষ্ট কফি , একটি পরীক্ষার ফ্রেমওয়ার্ক, ফোল্ডার আপনার ফাংশন নিম্নলিখিত কমান্ড ব্যবহার করে:

npm install --save-dev firebase-functions-test
npm install --save-dev mocha

পাশে একটি তৈরি test ফাংশন ফোল্ডারের ভিতরে ফোল্ডারের আপনার পরীক্ষার কোড এটা ভিতরে একটি নতুন ফাইল তৈরি, এবং এটি ভালো কিছু নাম index.test.js

অবশেষে, সংশোধন functions/package.json নিম্নলিখিত যোগ করার জন্য:

"scripts": {
  "test": "mocha --reporter spec"
}

একবার আপনি পরীক্ষা লিখেছি, আপনি তাদের চলমান দ্বারা চালাতে পারেন npm test আপনার ফাংশন ডিরেক্টরি ভিতরে।

ক্লাউড ফাংশনের জন্য Firebase টেস্ট SDK শুরু করা হচ্ছে

সেখানে ব্যবহার করতে দুটি উপায় আছে firebase-functions-test :

  1. অনলাইন মোড (প্রস্তাবিত): লিখন পরীক্ষা করে একটি Firebase প্রকল্পের সাথে ইন্টারঅ্যাক্ট পরীক্ষা যাতে ডাটাবেসের লিখছেন, ব্যবহারকারী সৃষ্টি নিবেদিত, ইত্যাদি আসলে ঘটতে পারে, এবং আপনার পরীক্ষা কোড ফলাফল পরিদর্শন করতে পারেন। এর মানে হল আপনার ফাংশনে ব্যবহৃত অন্যান্য Google SDK গুলিও কাজ করবে৷
  2. অফলাইন মোড: লিখন siled এবং কোন পার্শ্ব প্রতিক্রিয়া অফলাইনেই ইউনিট পরীক্ষা। এর মানে হল যে কোনও পদ্ধতির কল যা ফায়ারবেস পণ্যের সাথে ইন্টারঅ্যাক্ট করে (যেমন ডাটাবেসে লেখা বা ব্যবহারকারী তৈরি করা) স্টাব করা দরকার। আপনার যদি ক্লাউড ফায়ারস্টোর বা রিয়েলটাইম ডেটাবেস ফাংশন থাকে তবে সাধারণত অফলাইন মোড ব্যবহার করার পরামর্শ দেওয়া হয় না, কারণ এটি আপনার পরীক্ষার কোডের জটিলতাকে ব্যাপকভাবে বাড়িয়ে দেয়।

অনলাইন মোডে SDK শুরু করুন (প্রস্তাবিত)

আপনার কাছে লিখনের পরীক্ষা করতে চান তাহলে যে একটি পরীক্ষা প্রকল্পের সাথে ইন্টারঅ্যাক্ট, আপনি প্রকল্পের কনফিগ মান যে মাধ্যমে অ্যাপ্লিকেশন আরম্ভের জন্য প্রয়োজন হয় সরবরাহ করতে হবে firebase-admin এবং একটি পরিষেবা অ্যাকাউন্ট কী ফাইল পাথ।

আপনার Firebase প্রকল্পের কনফিগার মান পেতে:

  1. আপনার প্রকল্পের সেটিংস খুলুন Firebase কনসোল
  2. তোমার অ্যাপ্লিকেশান মধ্যে অবস্থিত, পছন্দের অ্যাপ্লিকেশন নির্বাচন করুন।
  3. ডান ফলকে, অ্যাপল এবং অ্যান্ড্রয়েড অ্যাপের জন্য একটি কনফিগারেশন ফাইল ডাউনলোড করার বিকল্পটি নির্বাচন করুন।

    ওয়েব অ্যাপসের জন্য, কনফিগারেশন মান প্রদর্শন করে কনফিগ নির্বাচন করুন।

একটি কী ফাইল তৈরি করতে:

  1. খুলুন পরিষেবা অ্যাকাউন্টস ফলকে Google ক্লাউড কনসোলে করুন।
  2. App ইঞ্জিন ডিফল্ট পরিষেবা অ্যাকাউন্ট নির্বাচন করুন, এবং কী তৈরি করুন নির্বাচন করতে ডান দিকে অপশন মেনু ব্যবহার করুন।
  3. যখন বলা হবে, কী ধরনের জন্য তাদেরকে JSON নির্বাচন করুন, এবং তৈরি করুন এ ক্লিক করুন।

কী ফাইলটি সংরক্ষণ করার পরে, SDK শুরু করুন:

// At the top of test/index.test.js
const test = require('firebase-functions-test')({
  databaseURL: 'https://my-project.firebaseio.com',
  storageBucket: 'my-project.appspot.com',
  projectId: 'my-project',
}, 'path/to/serviceAccountKey.json');

অফলাইন মোডে SDK শুরু করুন

আপনি যদি সম্পূর্ণ অফলাইন পরীক্ষা লিখতে চান, আপনি কোনো পরামিতি ছাড়াই SDK শুরু করতে পারেন:

// At the top of test/index.test.js
const test = require('firebase-functions-test')();

কনফিগার মান উপহাস

আপনি ব্যবহার করেন তাহলে functions.config() আপনার ফাংশন কোডে, আপনি কনফিগ মান উপহাস করতে পারেন। উদাহরণস্বরূপ, যদি functions/index.js নিম্নলিখিত কোড রয়েছে:

const functions = require('firebase-functions');
const key = functions.config().stripe.key;

তারপরে আপনি আপনার পরীক্ষার ফাইলের ভিতরে মানটিকে উপহাস করতে পারেন:

// Mock functions config values
test.mockConfig({ stripe: { key: '23wr42ewr34' }});

আপনার ফাংশন আমদানি করা হচ্ছে

আপনার ফাংশন আমদানি করতে, ব্যবহার require একটি মডিউল রূপে আপনার প্রধান ফাংশন ফাইলটি আমদানি করতে। নিশ্চিত করা শুধুমাত্র আরম্ভের পরে এই কাজ firebase-functions-test ও কনফিগ মান উপহাস।

// after firebase-functions-test has been initialized
const myFunctions = require('../index.js'); // relative path to functions code

আপনি সক্রিয়া তাহলে firebase-functions-test মধ্যে অফলাইন মোডে , এবং আপনি admin.initializeApp() আপনার ফাংশন কোডে, তাহলে আপনি আপনার ফাংশন আমদানি করার আগে এটা শহরের উপর অসম্পূর্ণ নিবন্ধ করা প্রয়োজন:

// If index.js calls admin.initializeApp at the top of the file,
// we need to stub it out before requiring index.js. This is because the
// functions will be executed as a part of the require process.
// Here we stub admin.initializeApp to be a dummy function that doesn't do anything.
adminInitStub = sinon.stub(admin, 'initializeApp');
// Now we can require index.js and save the exports inside a namespace called myFunctions.
myFunctions = require('../index');

টেস্টিং ব্যাকগ্রাউন্ড (নন-HTTP) ফাংশন

নন-HTTP ফাংশন পরীক্ষা করার প্রক্রিয়াতে নিম্নলিখিত পদক্ষেপগুলি জড়িত:

  1. ফাংশন মোড়ানো আপনার সাথে পরীক্ষা করতে চান test.wrap পদ্ধতি
  2. পরীক্ষার ডেটা তৈরি করুন
  3. আপনার তৈরি করা পরীক্ষার ডেটা এবং আপনি নির্দিষ্ট করতে চান এমন কোনো ইভেন্ট প্রসঙ্গ ক্ষেত্র দিয়ে মোড়ানো ফাংশনটি চালু করুন।
  4. আচরণ সম্পর্কে দাবী করুন।

প্রথমে আপনি যে ফাংশনটি পরীক্ষা করতে চান তা মোড়ানো। আসুন বলে একটি ফাংশন আছে functions/index.js নামক makeUppercase , যা আপনি পরীক্ষা করতে চাই। নিম্নোক্ত লিখুন functions/test/index.test.js

// "Wrap" the makeUpperCase function from index.js
const myFunctions = require('../index.js');
const wrapped = test.wrap(myFunctions.makeUppercase);

wrapped একটি ফাংশন যা পূজা হয় makeUppercase যখন এটি বলা হয়। wrapped 2 পরামিতি নেয়:

  1. তথ্য (প্রয়োজন): ডাটা পাঠাতে makeUppercase । এটি সরাসরি আপনার লেখা ফাংশন হ্যান্ডলারে পাঠানো প্রথম প্যারামিটারের সাথে মিলে যায়। firebase-functions-test কাস্টম ডেটা বা উদাহরণস্বরূপ ডাটা নির্মাণের জন্য পদ্ধতি প্রদান করে।
  2. eventContextOptions (ঐচ্ছিক): ঘটনা প্রসঙ্গের ক্ষেত্র আপনি উল্লেখ করতে চাই। ইভেন্ট প্রসঙ্গ হল আপনার লেখা ফাংশন হ্যান্ডলারে পাঠানো দ্বিতীয় প্যারামিটার। আপনি একটি অন্তর্ভুক্ত করবেন না তাহলে eventContextOptions যখন কলিং প্যারামিটার wrapped একটি ঘটনা প্রসঙ্গ এখনো যুক্তিসম্মত ক্ষেত্রের সাথে উৎপন্ন হয়। আপনি এখানে নির্দিষ্ট করে উত্পন্ন কিছু ক্ষেত্র ওভাররাইড করতে পারেন। মনে রাখবেন যে আপনি যে ক্ষেত্রগুলিকে ওভাররাইড করতে চান তা অন্তর্ভুক্ত করতে হবে৷ আপনি ওভাররাইড করেননি এমন কোনো ক্ষেত্র তৈরি হয়।
const data = … // See next section for constructing test data

// Invoke the wrapped function without specifying the event context.
wrapped(data);

// Invoke the function, and specify params
wrapped(data, {
  params: {
    pushId: '234234'
  }
});

// Invoke the function, and specify auth and auth Type (for real time database functions only)
wrapped(data, {
  auth: {
    uid: 'jckS2Q0'
  },
  authType: 'USER'
});

// Invoke the function, and specify all the fields that can be specified
wrapped(data, {
  eventId: 'abc',
  timestamp: '2018-03-23T17:27:17.099Z',
  params: {
    pushId: '234234'
  },
  auth: {
    uid: 'jckS2Q0' // only for real time database functions
  },
  authType: 'USER' // only for real time database functions
});

পরীক্ষার তথ্য নির্মাণ

একটি মোড়ানো ফাংশনের প্রথম প্যারামিটার হল অন্তর্নিহিত ফাংশনটি চালু করার জন্য পরীক্ষার ডেটা। পরীক্ষার ডেটা তৈরি করার বিভিন্ন উপায় রয়েছে।

কাস্টম ডেটা ব্যবহার করে

firebase-functions-test আপনার ফাংশন পরীক্ষা করা প্রয়োজন ডেটা নির্মাণের জন্য ফাংশন একটি নম্বর আছে। উদাহরণ হিসেবে বলা যায়, ব্যবহার test.firestore.makeDocumentSnapshot একটি Firestore তৈরি করতে DocumentSnapshot । প্রথম আর্গুমেন্ট তথ্য, এবং দ্বিতীয় যুক্তি পূর্ণ রেফারেন্স পথ, এবং সেখানে একটি হল ঐচ্ছিক তৃতীয় যুক্তি স্ন্যাপশট আপনি নির্দিষ্ট করতে পারেন অন্যান্য বৈশিষ্ট্যের জন্য।

// Make snapshot
const snap = test.firestore.makeDocumentSnapshot({foo: 'bar'}, 'document/path');
// Call wrapped function with the snapshot
const wrapped = test.wrap(myFunctions.myFirestoreDeleteFunction);
wrapped(snap);

আপনি একটি পরীক্ষা হয় onUpdate বা onWrite ফাংশন, আপনি দুই স্ন্যাপশট তৈরি করতে হবে: রাজ্য পরে রাষ্ট্র সামনে এবং অন্যটি। তারপর, আপনি ব্যবহার করতে পারেন makeChange একটি তৈরি করতে পদ্ধতি Change এই স্ন্যাপশট সঙ্গে অবজেক্ট।

// Make snapshot for state of database beforehand
const beforeSnap = test.firestore.makeDocumentSnapshot({foo: 'bar'}, 'document/path');
// Make snapshot for state of database after the change
const afterSnap = test.firestore.makeDocumentSnapshot({foo: 'faz'}, 'document/path');
const change = test.makeChange(beforeSnap, afterSnap);
// Call wrapped function with the Change object
const wrapped = test.wrap(myFunctions.myFirestoreUpdateFunction);
wrapped(change);

দেখুন এপিআই রেফারেন্স সব অন্যান্য ধরনের তথ্য জন্য অনুরূপ কাজগুলির জন্য।

উদাহরণ ডেটা ব্যবহার করে

আপনি আপনার পরীক্ষা ব্যবহৃত তথ্য, তারপর কাস্টমাইজ করতে প্রয়োজন হবে না যদি firebase-functions-test প্রতিটি ফাংশন টাইপ জন্য উদাহরণ ডেটা জেনারেট করার জন্য অফার পদ্ধতি।

// For Firestore onCreate or onDelete functions
const snap = test.firestore.exampleDocumentSnapshot();
// For Firestore onUpdate or onWrite functions
const change = test.firestore.exampleDocumentSnapshotChange();

দেখুন এপিআই রেফারেন্স প্রতি ফাংশন টাইপ জন্য উদাহরণ ডেটা পাওয়ার জন্য পদ্ধতিগুলির জন্য।

স্টাবড ডেটা ব্যবহার করা (অফলাইন মোডের জন্য)

আপনি অফলাইন মোডে SDK এর সক্রিয়া, এবং একটি মেঘ Firestore বা রিয়েলটাইম ডাটাবেস ফাংশন পরীক্ষা হয়, আপনি পরিবর্তে একটি প্রকৃত তৈরি করার নিবন্ধসমূহ সঙ্গে একটি প্লেইন বস্তুর ব্যবহার করা উচিত DocumentSnapshot বা DataSnapshot

ধরা যাক আপনি নিম্নলিখিত ফাংশনের জন্য একটি ইউনিট পরীক্ষা লিখছেন:

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = snapshot.val();
      functions.logger.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return snapshot.ref.parent.child('uppercase').set(uppercase);
    });

ফাংশনের ভিতর, snap দুইবার ব্যবহার করা হয়:

  • snap.val()
  • snap.ref.parent.child('uppercase').set(uppercase)

পরীক্ষা কোড, একটি প্লেইন বস্তুর যেখানে এই কোড পাথ উভয় কাজ করবে তৈরি করেন, এবং ব্যবহার Sinon পদ্ধতি শহরের উপর অসম্পূর্ণ নিবন্ধ করতে।

// The following lines creates a fake snapshot, 'snap', which returns 'input' when snap.val() is called,
// and returns true when snap.ref.parent.child('uppercase').set('INPUT') is called.
const snap = {
  val: () => 'input',
  ref: {
    parent: {
      child: childStub,
    }
  }
};
childStub.withArgs(childParam).returns({ set: setStub });
setStub.withArgs(setParam).returns(true);

দাবী করা

SDK শুরু করার পরে, ফাংশনগুলি মোড়ানো এবং ডেটা তৈরি করার পরে, আপনি তৈরি করা ডেটা দিয়ে মোড়ানো ফাংশনগুলিকে আহ্বান করতে পারেন এবং আচরণ সম্পর্কে দাবি করতে পারেন। আপনি যত একটি লাইব্রেরি যেমন ব্যবহার করতে পারেন চাই এই গবেষকেরা তৈরীর জন্য।

অনলাইন মোডে দাবী করা

আপনি ক্লাউড কাজকর্মের জন্য Firebase টেস্ট SDK এর সক্রিয়া তাহলে অনলাইন মোডে , আপনি জাহির করতে পারে (যেমন একটি ডাটাবেস লেখার হিসাবে) পছন্দসই কর্ম ব্যবহার করে হয়ে গেছে firebase-admin SDK এর।

নীচের উদাহরণটি দাবি করে যে 'INPUT' পরীক্ষা প্রকল্পের ডাটাবেসে লেখা হয়েছে।

// Create a DataSnapshot with the value 'input' and the reference path 'messages/11111/original'.
const snap = test.database.makeDataSnapshot('input', 'messages/11111/original');

// Wrap the makeUppercase function
const wrapped = test.wrap(myFunctions.makeUppercase);
// Call the wrapped function with the snapshot you constructed.
return wrapped(snap).then(() => {
  // Read the value of the data at messages/11111/uppercase. Because `admin.initializeApp()` is
  // called in functions/index.js, there's already a Firebase app initialized. Otherwise, add
  // `admin.initializeApp()` before this line.
  return admin.database().ref('messages/11111/uppercase').once('value').then((createdSnap) => {
    // Assert that the value is the uppercased version of our input.
    assert.equal(createdSnap.val(), 'INPUT');
  });
});

অফলাইন মোডে দাবী করা

আপনি ফাংশনের প্রত্যাশিত রিটার্ন মান সম্পর্কে দাবি করতে পারেন:

const childParam = 'uppercase';
const setParam = 'INPUT';
// Stubs are objects that fake and/or record function calls.
// These are excellent for verifying that functions have been called and to validate the
// parameters passed to those functions.
const childStub = sinon.stub();
const setStub = sinon.stub();
// The following lines creates a fake snapshot, 'snap', which returns 'input' when snap.val() is called,
// and returns true when snap.ref.parent.child('uppercase').set('INPUT') is called.
const snap = {
  val: () => 'input',
  ref: {
    parent: {
      child: childStub,
    }
  }
};
childStub.withArgs(childParam).returns({ set: setStub });
setStub.withArgs(setParam).returns(true);
// Wrap the makeUppercase function.
const wrapped = test.wrap(myFunctions.makeUppercase);
// Since we've stubbed snap.ref.parent.child(childParam).set(setParam) to return true if it was
// called with the parameters we expect, we assert that it indeed returned true.
return assert.equal(wrapped(snap), true);

এছাড়াও আপনি ব্যবহার করতে পারেন Sinon চর জাহির করা যে নির্দিষ্ট পদ্ধতি বলা হয়েছে, এবং পরামিতি সঙ্গে আপনি আশা।

HTTP ফাংশন পরীক্ষা করা হচ্ছে

HTTP- র onCall ফাংশন পরীক্ষা করার জন্য, হিসাবে একই পদ্ধতির ব্যবহার পটভূমি ফাংশন পরীক্ষা

আপনি HTTP- র onRequest ফাংশন পরীক্ষা হয়, আপনি ব্যবহার করা উচিত firebase-functions-test যদি:

  • আপনি এই ব্যবহার functions.config()
  • আপনার ফাংশন একটি Firebase প্রকল্প বা অন্যান্য Google API-এর সাথে ইন্টারঅ্যাক্ট করে এবং আপনি আপনার পরীক্ষার জন্য একটি বাস্তব Firebase প্রকল্প এবং এর প্রমাণপত্র ব্যবহার করতে চান।

একটি HTTP onRequest ফাংশন দুটি প্যারামিটার নেয়: একটি অনুরোধ বস্তু এবং একটি প্রতিক্রিয়া বস্তু। এখানে কিভাবে আপনি পরীক্ষা পারে addMessage() উদাহরণ ফাংশন :

  • প্রতিক্রিয়া বস্তু পুনর্নির্দেশ ফাংশন ওভাররাইড, যেহেতু sendMessage() এটা কল।
  • পুনর্নির্দেশ ফাংশন মধ্যে, ব্যবহারের chai.assert পুনর্নির্দেশ function প্যারামিটারের কী হেল্প করতে গবেষকেরা সঙ্গে বলে অভিহিত হই
// A fake request object, with req.query.text set to 'input'
const req = { query: {text: 'input'} };
// A fake response object, with a stubbed redirect function which asserts that it is called
// with parameters 303, 'new_ref'.
const res = {
  redirect: (code, url) => {
    assert.equal(code, 303);
    assert.equal(url, 'new_ref');
    done();
  }
};

// Invoke addMessage with our fake request and response objects. This will cause the
// assertions in the response object to be evaluated.
myFunctions.addMessage(req, res);

পরিচ্ছন্নতার পরীক্ষা

আপনার পরীক্ষার কোডের একেবারে শেষে, ক্লিনআপ ফাংশনটি কল করুন। এই unsets এনভায়রনমেন্ট ভেরিয়েবল যে SDK এর সেট যখন এটি সক্রিয়া করা হয় এবং আপনি একটি বাস্তব সময়ে ডাটাবেস তৈরি করতে SDK এর ব্যবহৃত তৈরি করা হয়েছে পারে যে Firebase অ্যাপ্লিকেশান মুছে ফেলে DataSnapshot বা Firestore DocumentSnapshot

test.cleanup();

সম্পূর্ণ উদাহরণ পর্যালোচনা করুন এবং আরও জানুন

আপনি Firebase GitHub সংগ্রহস্থলে সম্পূর্ণ উদাহরণ পর্যালোচনা করতে পারেন।

আরো জানতে, পড়ুন এপিআই রেফারেন্স জন্য firebase-functions-test