Mocha এবং Chai দিয়ে Node.js কোড পরীক্ষা করা

ভূমিকা

লেখার ইউনিট পরীক্ষা এমন কিছু যা নতুন এবং অভিজ্ঞ প্রকৌশলী একইভাবে বিকাশের পরবর্তী পর্যায়ের জন্য বন্ধ করে দেয়, তবুও - তারা স্থিতিশীল এবং শক্তিশালী সফ্টওয়্যার বিকাশের চাবিকাঠি।

এর প্রাথমিক ভিত্তি পরীক্ষা-চালিত উন্নয়ন (TDD) আপনি কোডিং শুরু করার আগেই আপনার পরীক্ষা লিখছেন। এটির জন্য প্রচেষ্টা করার জন্য এটি একটি দুর্দান্ত লক্ষ্য, তবে আপনি যখন এর নীতিগুলি অনুসরণ করার চেষ্টা করছেন তখন এটির জন্য অনেক শৃঙ্খলা এবং পরিকল্পনা লাগে! এই পুরো প্রক্রিয়াটিকে অনেক সহজ করার জন্য, আপনি সহজেই ব্যবহারযোগ্য এবং শক্তিশালী পরীক্ষা এবং দাবী কাঠামোর আশ্রয় নিতে পারেন, যেমন একজাতীয় উৎকৃষ্ট কফি এবং চাই.

এই নিবন্ধে, আমরা আপনাকে এই দুটি গ্রন্থাগারের সাথে পরিচয় করিয়ে দিয়ে শুরু করব এবং তারপরে দ্রুত পঠনযোগ্য এবং কার্যকরী ইউনিট পরীক্ষা তৈরি করতে কীভাবে সেগুলি একসাথে ব্যবহার করতে হয় তা দেখাব।

চাই

চাই একটি দাবী গ্রন্থাগার যা উভয়ই প্রদান করে বিডিডি (আচরণ-চালিত উন্নয়ন) এবং TDD (পরীক্ষা-চালিত উন্নয়ন) টেস্টিং কোডের জন্য প্রোগ্রামিংয়ের শৈলী, এবং এটি একটি টেস্টিং লাইব্রেরির সাথে যুক্ত করা যা আপনাকে পরীক্ষাগুলি সংগঠিত করতে দেয়। এটি মোচার সাথে খুব সাধারণভাবে যুক্ত।

এটির তিনটি প্রধান API রয়েছে:

  • should
  • expect
  • assert

var.should.equal(var2)


expect.var.to.be.equal(var2)


assert.equal(var1, var2)

এই নিবন্ধটি জুড়ে, আমরা চাই'স ব্যবহার করে বিডিডি শৈলীর উপর ফোকাস করব expect ইন্টারফেস, যদিও আপনার নিজের অন্তর্দৃষ্টি অনুযায়ী অন্যান্য ইন্টারফেস/স্টাইল ব্যবহার করা পুরোপুরি ঠিক আছে। দ্য assert ইন্টারফেস হল সবচেয়ে সমান সাধারণ TDD দাবী কাঠামো।

expect আপনার দাবিগুলি লিখতে একটি খুব স্বাভাবিক ভাষা API ব্যবহার করে, যা আপনার পরীক্ষাগুলিকে লেখার জন্য সহজ করে তুলবে এবং পরে রাস্তায় উন্নতি করবে। দাবী তৈরি এবং কার্যকর করার জন্য গেটারদের একসাথে চেইন করে এটি করা হয়, এটি প্রয়োজনীয়তাগুলিকে কোডে অনুবাদ করা সহজ করে তোলে:

let user = {name: 'Scott'};


expect(user).to.have.property('name');

বিঃদ্রঃ: দেখুন কিভাবে আপনি স্বাভাবিক ভাষায় দাবীটি পড়তে পারেন এবং বুঝতে পারেন কি হচ্ছে? এটি চাই এর মত একটি দাবী গ্রন্থাগার ব্যবহার করার প্রধান সুবিধাগুলির মধ্যে একটি!

এই গেটারের আরও কয়েকটি উদাহরণ হল:

  • to
  • be
  • is
  • and
  • has
  • have

এই গেটারগুলির মধ্যে বেশ কয়েকটিকে একসাথে চেইন করা যেতে পারে এবং দাবি করার পদ্ধতিগুলির সাথে ব্যবহার করা যেতে পারে true, ok, exist, এবং empty শুধুমাত্র একটি লাইনে কিছু জটিল দাবী তৈরি করতে:

"use strict";

const expect = require('chai').expect;


expect({}).to.exist;
expect(26).to.equal(26);
expect(false).to.be.false;
expect('hello').to.be.string;


expect([1, 2, 3]).to.not.be.empty;


expect([1, 2, 3]).to.have.length.of.at.least(3);

বিঃদ্রঃ: উপলব্ধ পদ্ধতির একটি সম্পূর্ণ তালিকা পাওয়া যাবে এখানে.

আপনি উপলব্ধ তালিকা চেক আউট করতে চাইতে পারেন প্লাগ-ইন চাই জন্য এগুলি আরও জটিল বৈশিষ্ট্যগুলি পরীক্ষা করা আরও সহজ করে তোলে।

গ্রহণ করা চাই-http উদাহরণস্বরূপ, যা একটি প্লাগইন যা আপনাকে সার্ভার রুট পরীক্ষা করতে সহায়তা করে:

"use strict";

const chai = require('chai');
const chaiHttp = require('chai-http');

chai.use(chaiHttp);

chai.request(app)
    .put('/api/auth')
    .send({username: '[email protected]', password: 'abc123'})
    .end(function(err, res) {
        expect(err).to.be.null;
        expect(res).to.have.status(200);
    });

মোচা দিয়ে টেস্ট কেস সংগঠিত করা - বর্ণনা() এবং এটি()

মোচা হল নোডের জন্য একটি টেস্টিং ফ্রেমওয়ার্ক যা আপনাকে অ্যাসিঙ্ক্রোনাস (বা সিঙ্ক্রোনাস) কোড সিরিয়ালি চালানোর নমনীয়তা দেয়। যেকোনও ধরা পড়া ব্যতিক্রমগুলি পরীক্ষার ক্ষেত্রে দেখানো হয়েছে যেখানে এটি নিক্ষেপ করা হয়েছিল, যা ঠিক কী ব্যর্থ হয়েছে এবং কেন তা সনাক্ত করা সহজ করে তোলে।

বিশ্বব্যাপী মোচা ইনস্টল করার পরামর্শ দেওয়া হচ্ছে:

$ npm install mocha -g

আপনি এটি একটি বিশ্বব্যাপী ইনস্টল হতে চান mocha কমান্ডটি আপনার স্থানীয় ডিরেক্টরিতে প্রকল্পের জন্য পরীক্ষা চালানোর জন্য ব্যবহৃত হয়।

কোড এই টুকরা কি না?

it() এক্স ফেরত দেওয়া উচিত। it() পরীক্ষার ক্ষেত্রে সংজ্ঞায়িত করে, এবং Mocha প্রতিটি চালাবে it() একটি ইউনিট পরীক্ষা হিসাবে। একাধিক ইউনিট পরীক্ষা সংগঠিত করতে, আমরা করতে পারি describe() একটি সাধারণ কার্যকারিতা, এবং এইভাবে গঠন Mocha পরীক্ষা.

এটি সম্ভবত একটি কংক্রিট উদাহরণ দিয়ে বর্ণনা করা হয়েছে:

"use strict";
const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });
    });
});

মধ্যে describe() পদ্ধতি, আমরা একটি সংজ্ঞায়িত পরীক্ষার নামবলা হয় #abs(). আপনি পৃথকভাবে তাদের নামেও পরীক্ষা চালাতে পারেন - এটি পরে কভার করা হবে।

বিঃদ্রঃ: মোচা পরীক্ষার সাথে, আপনার দরকার নেই require() যে কোনো মোচা পদ্ধতি। এই পদ্ধতিগুলি বিশ্বব্যাপী প্রদান করা হয় যখন এর সাথে চালানো হয় mocha কমান্ড।

এই পরীক্ষা চালানোর জন্য, আপনার ফাইল সংরক্ষণ করুন এবং ব্যবহার করুন mocha কমান্ড প্রয়োগ করুন:

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given number 


  1 passing (9ms)

আউটপুট হল পরীক্ষাগুলি এবং তাদের ফলাফলগুলির একটি ভাঙ্গন। খেয়াল করুন কিভাবে বাসা বাঁধে describe() কল ফলাফল আউটপুট উপর বহন. একটি প্রদত্ত পদ্ধতি বা বৈশিষ্ট্যের জন্য সমস্ত পরীক্ষা একসাথে রাখা দরকারী।

এই পদ্ধতিগুলি মোচা পরীক্ষার কাঠামোর ভিত্তি। আপনার পছন্দ অনুযায়ী আপনার পরীক্ষাগুলি রচনা এবং সংগঠিত করতে সেগুলি ব্যবহার করুন। আমরা পরবর্তী বিভাগে এর একটি উদাহরণ দেখতে পাব।

মোচা এবং চাই দিয়ে পরীক্ষা লেখা

আপনার প্রকল্পের মধ্যে আপনার পরীক্ষাগুলি সংগঠিত করার প্রস্তাবিত উপায় হল সেগুলিকে তাদের নিজের মধ্যে রাখা /test ডিরেক্টরি ডিফল্টরূপে, Mocha গ্লোবগুলি ব্যবহার করে ইউনিট পরীক্ষার জন্য পরীক্ষা করে ./test/*.js এবং ./test/*.coffee. সেখান থেকে, এটি কল করে এমন যেকোনো ফাইল লোড ও এক্সিকিউট করবে describe() পদ্ধতি।

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

এটির সাথে পরীক্ষা ফাইল প্রত্যয় করা সাধারণ .test.js সোর্স ফাইলগুলির জন্য যাতে মোচা পরীক্ষা রয়েছে:

├── package.json
├── lib
│   ├── db.js
│   ├── models.js
│   └── util.js
└── test
    ├── db.test.js
    ├── models.test.js
    ├── util.test.js
    └── util.js

util.js মধ্যে test ডিরেক্টরিতে কোনো ইউনিট পরীক্ষা থাকবে না, পরীক্ষায় সাহায্য করার জন্য শুধুমাত্র ইউটিলিটি ফাংশন।

বিঃদ্রঃ: আপনি যে কাঠামোই ব্যবহার করতে পারেন তা আপনার কাছে বোধগম্য হয়, ইউনিট পরীক্ষা স্বয়ংক্রিয়ভাবে নেওয়া হয়।

এটি আসলে পরীক্ষা লেখার ক্ষেত্রে আসে, এটি ব্যবহার করে তাদের সংগঠিত করতে সাহায্য করে describe() পদ্ধতি আপনি এগুলিকে বৈশিষ্ট্য, ফাংশন, ফাইল বা অন্য কোনো স্বেচ্ছাচারী স্তর দ্বারা সংগঠিত করতে পারেন। উদাহরণস্বরূপ, ফাংশন স্তরে কাজগুলি বর্ণনা করার জন্য সংগঠিত একটি পরীক্ষা ফাইলের মত দেখাচ্ছে:

"use strict";

const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });
});

পরীক্ষা চালানো তখন আপনাকে আউটপুট দেবে:

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 


  3 passing (11ms)

এমনকি আরও প্রসারিত করে, আপনার কাছে একক ফাইলে একাধিক পদ্ধতির পরীক্ষাও থাকতে পারে। এই ক্ষেত্রে, পদ্ধতিগুলি দ্বারা গোষ্ঠীভুক্ত করা হয় Math বস্তু:

"use strict";

const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });

    describe('#sqrt()', function() {
        it('should return the square root of a given positive number', function() {
            expect(Math.sqrt(25)).to.be.equal(5);
        });

        it('should return NaN for a given negative number', function() {
            expect(Math.sqrt(-9)).to.be.NaN;
        });

        it('should return 0 given 0', function() {
            expect(Math.sqrt(0)).to.be.equal(0);
        });
    });
});

যার ফলে:

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

মোচা হুকস - আগে(), পরে(), আগে প্রতিটি() এবং প্রতিটির পরে()

অবশ্যই, বেশিরভাগ ইউনিট পরীক্ষা এত সহজ নয়। অনেক সময় আপনার পরীক্ষাগুলি সম্পাদন করার জন্য সম্ভবত অন্যান্য সংস্থানগুলির প্রয়োজন হবে, যেমন একটি ডাটাবেস, বা অন্য কিছু বাহ্যিক সংস্থান (বা সেগুলির একটি উপহাস/স্টাব)। এটি সেট আপ করার জন্য, আমরা নিম্নলিখিত এক বা একাধিক ব্যবহার করতে পারি মোচা হুক পদ্ধতি:

  • before(): প্রদত্ত ব্লকে সমস্ত পরীক্ষার আগে চলে
  • beforeEach(): প্রদত্ত ব্লকে প্রতিটি পরীক্ষার আগে চলে
  • after(): প্রদত্ত ব্লকে সমস্ত পরীক্ষার পরে চলে
  • afterEach(): প্রদত্ত ব্লকে প্রতিটি পরীক্ষার পরে চলে

এই হুকগুলি আপনার পরীক্ষার জন্য প্রয়োজনীয় সেটআপ এবং টিয়ারডাউন কাজ সম্পাদনের জন্য উপযুক্ত জায়গা। সাধারণ ব্যবহারের ক্ষেত্রে একটি হল পরীক্ষা চালানোর আগে আপনার ডাটাবেসের সাথে একটি সংযোগ স্থাপন করা:

"use strict";

const expect = require('chai').expect;
let User = require('../models').User;

describe('Users', function() {

    let database = null;

    before(function(done) {
        
    });

    afterEach(function(done) {
        
    });

    describe('#save()', function() {
        it('should save User data to database', function(done) {
            
        });
    });

    describe('#load()', function() {
        it('should load User data from database', function(done) {
            
        });
    });
});

সামনে কোন পরীক্ষা চালানো হয়, ফাংশন আমাদের পাঠানো হয় before() পদ্ধতি চালানো হয় (এবং শুধুমাত্র একবার পরীক্ষা জুড়ে চালানো হয়), যা ডাটাবেসের সাথে একটি সংযোগ স্থাপন করে। একবার এটি হয়ে গেলে, আমাদের টেস্ট স্যুটগুলি চালানো হয়৷

যেহেতু আমরা চাই না যে একটি টেস্ট স্যুট থেকে ডেটা আমাদের অন্যান্য পরীক্ষাগুলিকে প্রভাবিত করুক, তাই প্রতিটি স্যুট চালানোর পরে আমাদের ডাটাবেস থেকে ডেটা সাফ করতে হবে। এই কি afterEach() জন্য. আমরা এই হুকটি ব্যবহার করে ডাটাবেসের সমস্ত ডেটা মুছে ফেলি প্রতি টেস্ট কেস চালানো হয়, তাই আমরা পরবর্তী পরীক্ষার জন্য একটি পরিষ্কার স্লেট থেকে শুরু করতে পারি।

মোচা টেস্ট চলছে

বেশিরভাগ ক্ষেত্রে, এই অংশটি বেশ সহজ। ধরে নিচ্ছি যে আপনি ইতিমধ্যে মোচা ইনস্টল করেছেন এবং প্রকল্প ডিরেক্টরিতে নেভিগেট করেছেন, বেশিরভাগ প্রকল্পের কেবল ব্যবহার করতে হবে mocha তাদের পরীক্ষা চালানোর জন্য কোন যুক্তি ছাড়া কমান্ড:

$ mocha


  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

এটি আমাদের পূর্ববর্তী উদাহরণগুলির থেকে কিছুটা আলাদা কারণ আমাদের পরীক্ষাগুলি কোথায় অবস্থিত তা মোচাকে বলার দরকার নেই৷ এই উদাহরণে, পরীক্ষার কোডটি প্রত্যাশিত অবস্থানে রয়েছে /test.

তবে, কিছু সহায়ক বিকল্প রয়েছে যা আপনি পরীক্ষা চালানোর সময় ব্যবহার করতে চাইতে পারেন। যদি আপনার কিছু পরীক্ষা ব্যর্থ হয়, উদাহরণস্বরূপ, আপনি সম্ভবত প্রতিবার পরিবর্তন করার সময় পুরো স্যুটটি চালাতে চান না। কিছু প্রকল্পের জন্য, সম্পূর্ণ পরীক্ষা স্যুট সম্পূর্ণ হতে কয়েক মিনিট সময় লাগতে পারে। আপনার যদি সত্যিই শুধুমাত্র একটি পরীক্ষা চালানোর প্রয়োজন হয় তবে এটি অনেক সময় নষ্ট।

এই ধরনের ক্ষেত্রে, আপনি উচিত Mocha বলুন কোন পরীক্ষা চালানোর জন্য. এটি ব্যবহার করে করা যেতে পারে -g or -f অপশন।

পৃথক পরীক্ষা চালানোর জন্য, আপনি সরবরাহ করতে পারেন -g ফ্ল্যাগ করুন এবং আপনি যে পরীক্ষা চালাতে চান তার মধ্যে একটি সাধারণ প্যাটার্ন যোগ করুন। উদাহরণস্বরূপ, আপনি যদি চালাতে চান #sqrt() পরীক্ষা:

$ mocha -g sqrt

  Math
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  3 passing (10ms)

লক্ষ্য করুন যে #abs() পরীক্ষা এই রান অন্তর্ভুক্ত করা হয়নি. আপনি যদি আপনার পরীক্ষার নামগুলির সাথে সেই অনুযায়ী পরিকল্পনা করেন তবে এই বিকল্পটি শুধুমাত্র আপনার পরীক্ষার নির্দিষ্ট বিভাগগুলি চালানোর জন্য ব্যবহার করা যেতে পারে।

যাইহোক, এইগুলি শুধুমাত্র দরকারী বিকল্প নয়। এখানে Mocha এর জন্য আরও কয়েকটি বিকল্প রয়েছে যা আপনি চেক আউট করতে চাইতে পারেন:

  • --invert: উল্টে যায় -g এবং -f ম্যাচ
  • --recursive: সাব-ডিরেক্টরি অন্তর্ভুক্ত করুন
  • --harmony: নোডের সমস্ত সাদৃশ্য বৈশিষ্ট্য সক্রিয় করুন

বিঃদ্রঃ: আপনি ব্যবহার করে বিকল্পের সম্পূর্ণ তালিকা চেক আউট করতে পারেন mocha -h আদেশ, বা চালু এই পৃষ্ঠা.

কোথায় আরো শিখতে? এই বিষয়ে আমরা একটি সংক্ষিপ্ত নিবন্ধে কভার করতে পারি তার চেয়ে অনেক বেশি কিছু আছে, তাই আপনি যদি আরও জানতে চান তবে আমরা অফিসিয়ালটি চেক আউট করার সুপারিশ করব একজাতীয় উৎকৃষ্ট কফি এবং চাই ডকুমেন্টেশন।

উপসংহার

মনে রাখবেন যে Mocha এবং Chai উভয়ই যেকোন ধরণের নোড প্রকল্পের পরীক্ষা করার জন্য ব্যবহার করা যেতে পারে, তা একটি লাইব্রেরি, কমান্ড-লাইন টুল বা এমনকি একটি ওয়েবসাইট। আপনার কাছে উপলব্ধ বিভিন্ন বিকল্প এবং প্লাগইনগুলি ব্যবহার করে, আপনি আপনার পরীক্ষার প্রয়োজনগুলি খুব সহজেই পূরণ করতে সক্ষম হবেন। এই লাইব্রেরিগুলির প্রতিটি আপনার কোড যাচাই করার জন্য খুব দরকারী এবং আপনার প্রায় সমস্ত নোড প্রকল্পে ব্যবহার করা উচিত।

আশা করি, এটি মোচা এবং চাই-এর একটি দরকারী ভূমিকা হিসাবে কাজ করেছে। আমি এখানে যা উপস্থাপন করেছি তার থেকে শিখতে আরও অনেক কিছু আছে, তাই আরও তথ্যের জন্য ডক্সগুলি পরীক্ষা করতে ভুলবেন না।

সময় স্ট্যাম্প:

থেকে আরো Stackabuse