Mocha और Chai के साथ Node.js कोड का परीक्षण

परिचय

यूनिट परीक्षण लिखना एक ऐसी चीज़ है जिसे शुरुआती और अनुभवी इंजीनियर समान रूप से विकास के बाद के चरणों के लिए टाल देते हैं, फिर भी - वे स्थिर और मजबूत सॉफ़्टवेयर विकास की कुंजी हैं।

का बुनियादी आधार परीक्षण संचालित विकास (टीडीडी) आपके कोडिंग शुरू करने से पहले ही आपके परीक्षण लिख रहा है। यह प्रयास करने के लिए एक महान लक्ष्य है, लेकिन जब आप इसके सिद्धांतों का पालन करने का प्रयास कर रहे हों तो इसमें बहुत अधिक अनुशासन और योजना की आवश्यकता होती है! इस पूरी प्रक्रिया को बहुत आसान बनाने के लिए, आप उपयोग में आसान और शक्तिशाली परीक्षण और अभिकथन ढाँचे का सहारा ले सकते हैं, जैसे कि कहवा और चाय.

इस लेख में, हम आपको इन दो पुस्तकालयों से परिचित कराकर शुरुआत करेंगे और फिर आपको दिखाएंगे कि पठनीय और कार्यात्मक इकाई परीक्षण बनाने के लिए उन्हें एक साथ कैसे उपयोग किया जाए।

चाय

चाय एक अभिकथन पुस्तकालय है जो दोनों प्रदान करता है बीडीडी (व्यवहार संचालित विकास) और टीडीडी (परीक्षण-संचालित विकास) परीक्षण कोड के लिए प्रोग्रामिंग की शैलियाँ, और इसे एक परीक्षण लाइब्रेरी के साथ जोड़ा जाना है जो आपको परीक्षण व्यवस्थित करने देती है। इसे आमतौर पर मोचा के साथ जोड़ा जाता है।

इसके तीन मुख्य एपीआई हैं:

  • should
  • expect
  • assert

var.should.equal(var2)


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


assert.equal(var1, var2)

इस पूरे लेख में, हम चाय का उपयोग करने वाली बीडीडी शैली पर ध्यान केंद्रित करेंगे expect इंटरफ़ेस, हालाँकि अपने अंतर्ज्ञान के अनुसार अन्य इंटरफ़ेस/शैलियों का उपयोग करना बिल्कुल ठीक है। assert इंटरफ़ेस सबसे समान सामान्य TDD अभिकथन ढाँचा है।

expect आपके दावों को लिखने के लिए एक बहुत ही प्राकृतिक भाषा एपीआई का उपयोग करता है, जिससे आपके परीक्षणों को लिखना आसान हो जाएगा और बाद में उनमें सुधार होगा। यह अभिकथन बनाने और निष्पादित करने के लिए गेटर्स को एक साथ जोड़कर किया जाता है, जिससे आवश्यकताओं को कोड में अनुवाद करना आसान हो जाता है:

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

नोट: उपलब्ध विधियों की पूरी सूची पाई जा सकती है यहाँ उत्पन्न करें.

हो सकता है कि आप उपलब्ध की सूची भी देखना चाहें plugins चाय के लिए. इनसे अधिक जटिल सुविधाओं का परीक्षण करना बहुत आसान हो जाता है।

लेना चाय-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() परीक्षण मामलों को परिभाषित करता है, और मोचा प्रत्येक को चलाएगा it() एक इकाई परीक्षण के रूप में. एकाधिक इकाई परीक्षण व्यवस्थित करने के लिए, हम कर सकते हैं 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);
        });
    });
});

में describe() विधि, हमने एक परिभाषित किया परीक्षण का नामकहा जाता है, #abs(). आप व्यक्तिगत रूप से उनके नाम से भी परीक्षण चला सकते हैं - इस पर बाद में चर्चा की जाएगी।

नोट: मोचा परीक्षणों के साथ, आपको इसकी आवश्यकता नहीं है require() मोचा विधियों में से कोई भी। के साथ चलने पर ये विधियाँ विश्व स्तर पर प्रदान की जाती हैं mocha आदेश।

इन परीक्षणों को चलाने के लिए, अपनी फ़ाइल सहेजें और इसका उपयोग करें mocha आदेश:

$ mocha .

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


  1 passing (9ms)

आउटपुट चलाए गए परीक्षणों और उनके परिणामों का विवरण है। ध्यान दें कि नेस्टेड कैसे है describe() कॉल परिणाम आउटपुट तक ले जाती हैं। किसी दिए गए तरीके या सुविधा के लिए सभी परीक्षणों को एक साथ रखना उपयोगी होता है।

ये विधियाँ मोचा परीक्षण ढांचे का आधार हैं। अपने परीक्षणों को अपनी इच्छानुसार लिखने और व्यवस्थित करने के लिए उनका उपयोग करें। इसका एक उदाहरण हम अगले भाग में देखेंगे।

मोचा और चाय के साथ लेखन परीक्षण

अपने परीक्षणों को अपने प्रोजेक्ट के भीतर व्यवस्थित करने का अनुशंसित तरीका उन सभी को अपने आप में रखना है /test निर्देशिका। डिफ़ॉल्ट रूप से, मोचा ग्लब्स का उपयोग करके यूनिट परीक्षणों की जाँच करता है ./test/*.js और ./test/*.coffee. वहां से, यह कॉल करने वाली किसी भी फ़ाइल को लोड और निष्पादित करेगा describe() विधि.

सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!

परीक्षण फ़ाइलों के साथ प्रत्यय लगाना आम बात है .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)

मोचा हुक - पहले(), बाद(), beforeEach() और AfterEach()

बेशक, अधिकांश इकाई परीक्षण इतने सरल नहीं हैं। कई बार आपको अपने परीक्षण करने के लिए संभवतः अन्य संसाधनों की आवश्यकता होगी, जैसे डेटाबेस, या कोई अन्य बाहरी संसाधन (या उनका नकली/आधार)। इसे स्थापित करने के लिए, हम निम्नलिखित में से एक या अधिक का उपयोग कर सकते हैं मोचा हुक विधि:

  • 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.

हालाँकि, कुछ उपयोगी विकल्प हैं जिनका उपयोग आप परीक्षण चलाते समय करना चाह सकते हैं। उदाहरण के लिए, यदि आपके कुछ परीक्षण विफल हो रहे हैं, तो संभवतः आप हर बार परिवर्तन करते समय संपूर्ण सुइट नहीं चलाना चाहेंगे। कुछ परियोजनाओं के लिए, पूर्ण परीक्षण सूट को पूरा होने में कुछ मिनट लग सकते हैं। यदि आपको वास्तव में केवल एक परीक्षण चलाने की आवश्यकता है तो यह बहुत सारा समय बर्बाद होगा।

इस तरह के मामलों के लिए, आपको ऐसा करना चाहिए मोचा को बताएं कि कौन से परीक्षण चलाने हैं. इसका उपयोग करके किया जा सकता है -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() इस रन में परीक्षण शामिल नहीं थे। यदि आप अपने परीक्षण नामों के अनुसार योजना बनाते हैं, तो इस विकल्प का उपयोग केवल आपके परीक्षणों के विशिष्ट अनुभागों को चलाने के लिए किया जा सकता है।

हालाँकि, ये एकमात्र उपयोगी विकल्प नहीं हैं। यहां मोचा के लिए कुछ और विकल्प दिए गए हैं जिन्हें आप शायद देखना चाहेंगे:

  • --invert: उलटा -g और -f मैच
  • --recursive: उप-निर्देशिकाएं शामिल करें
  • --harmony: नोड में सभी सद्भाव सुविधाओं को सक्षम करें

नोट: आप इसका उपयोग करके विकल्पों की पूरी सूची देख सकते हैं mocha -h आदेश, या चालू इस पृष्ठ.

अधिक कहां जानें? इस विषय में जितना हम एक छोटे से लेख में शामिल कर सकते हैं, उससे कहीं अधिक है, इसलिए यदि आप अधिक जानना चाहते हैं तो हम आपको आधिकारिक जांच करने की सलाह देंगे कहवा और चाय प्रलेखन।

निष्कर्ष

ध्यान रखें कि मोचा और चाय दोनों का उपयोग किसी भी प्रकार के नोड प्रोजेक्ट के परीक्षण के लिए किया जा सकता है, चाहे वह लाइब्रेरी हो, कमांड-लाइन टूल हो, या यहां तक ​​कि एक वेबसाइट भी हो। आपके लिए उपलब्ध विभिन्न विकल्पों और प्लगइन्स का उपयोग करके, आप अपनी परीक्षण आवश्यकताओं को आसानी से पूरा करने में सक्षम होंगे। इनमें से प्रत्येक लाइब्रेरी आपके कोड को सत्यापित करने के लिए बहुत उपयोगी है और इसका उपयोग आपके सभी नोड प्रोजेक्ट्स में किया जाना चाहिए।

उम्मीद है, यह मोचा और चाय के लिए एक उपयोगी परिचय के रूप में काम करेगा। मैंने यहां जो प्रस्तुत किया है, उसके अलावा सीखने के लिए बहुत कुछ है, इसलिए अधिक जानकारी के लिए दस्तावेज़ों को अवश्य देखें।

समय टिकट:

से अधिक स्टैकब्यूज