Node.js Kodunu Mocha ve Chai ile Test Etme

Giriş

Birim testleri yazmak, hem yeni başlayanların hem de deneyimli mühendislerin genellikle geliştirmenin sonraki aşamalarına ertelediği bir şeydir; ancak bunlar istikrarlı ve sağlam yazılım geliştirmenin anahtarıdır.

Temel öncül test odaklı geliştirme (TDD) kodlamaya başlamadan önce testlerinizi yazmaktır. Bu, uğruna çabalamak için harika bir hedef, ancak ilkelerini takip etmeye çalışırken çok fazla disiplin ve planlama gerekiyor! Tüm bu süreci çok daha kolaylaştırmak için kullanımı kolay ve güçlü test ve iddia çerçevelerine başvurabilirsiniz. koyun derisi ve Chai.

Bu makalede, size bu iki kütüphaneyi tanıtarak başlayacağız ve ardından hızlı bir şekilde okunabilir ve işlevsel birim testleri oluşturmak için bunları birlikte nasıl kullanacağınızı göstereceğiz.

Chai

Chai, her ikisini de sağlayan bir iddia kütüphanesidir. BDD (davranış odaklı geliştirme) ve TDD (test odaklı geliştirme) kodu test etmeye yönelik programlama stilleri ve testleri düzenlemenize olanak tanıyan bir test kitaplığıyla eşleştirilmesi amaçlanmıştır. Çok sık Mocha ile eşleştirilir.

Üç ana API'si vardır:

  • should
  • expect
  • assert

var.should.equal(var2)


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


assert.equal(var1, var2)

Bu makale boyunca Chai'nin stilini kullanarak BDD stiline odaklanacağız. expect arayüz, ancak kendi sezgilerinize göre diğer arayüzleri/stilleri kullanmak tamamen sorun değil. assert arayüz en çok benzeyen yaygın TDD onaylama çerçeveleridir.

expect İddialarınızı yazmak için çok doğal bir dil API'si kullanır; bu, testlerinizin daha sonra yazılmasını ve geliştirilmesini kolaylaştırır. Bu, iddiayı oluşturmak ve yürütmek için alıcıları bir araya getirerek yapılır ve gereksinimlerin koda çevrilmesini kolaylaştırır:

let user = {name: 'Scott'};


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

Not: İddiayı doğal bir dilde nasıl okuyabildiğinizi ve neler olduğunu anlayabildiğinizi gördünüz mü? Chai gibi bir iddia kütüphanesi kullanmanın temel avantajlarından biri de budur!

Bu alıcılara birkaç örnek daha:

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

Bu alıcılardan pek çoğu birbirine zincirlenebilir ve aşağıdaki gibi iddia yöntemleriyle kullanılabilir: true, ok, exist, ve empty tek bir satırda bazı karmaşık iddialar oluşturmak için:

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

Not: Mevcut yöntemlerin tam listesini burada bulabilirsiniz okuyun.

Ayrıca mevcut olanların listesine de göz atmak isteyebilirsiniz. eklentileri Chai için. Bunlar daha karmaşık özelliklerin test edilmesini çok daha kolaylaştırır.

Bizi daha iyi tanımak için chai-http örneğin, sunucu rotalarını test etmenize yardımcı olan bir eklenti:

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

Mocha ile Test Senaryolarının Düzenlenmesi – define() ve it()

Mocha, size asenkron (veya senkronize) kodu seri olarak çalıştırma esnekliği sağlayan, Node için bir test çerçevesidir. Yakalanmayan istisnalar, atıldığı test senaryosunun yanında gösterilir, böylece neyin başarısız olduğunu ve nedenini tam olarak belirlemeyi kolaylaştırır.

Mocha'nın global olarak kurulması tavsiye edilir:

$ npm install mocha -g

O zamandan beri küresel bir kurulum olmasını isteyeceksiniz. mocha komutu, proje testlerini yerel dizininizde çalıştırmak için kullanılır.

Bu kod parçası ne işe yarıyor?

it() X'i döndürmelidir. it() test senaryolarını tanımlar ve Mocha her birini çalıştırır it() Birim testi olarak. Birden fazla birim testi düzenlemek için şunları yapabiliriz: describe() ortak bir işlevsellik ve dolayısıyla Mocha testlerini yapılandırır.

Bu muhtemelen en iyi şekilde somut bir örnekle açıklanabilir:

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

içinde describe() bir yöntem tanımladık deneme adıDenilen #abs(). Testleri adlarına göre ayrı ayrı da çalıştırabilirsiniz; bu konu daha sonra ele alınacaktır.

Not: Mocha testleri ile yapmanıza gerek yok require() Mocha yöntemlerinden herhangi biri. Bu yöntemler, aşağıdaki komutla çalıştırıldığında genel olarak sağlanır: mocha Komut.

Bu testleri çalıştırmak için dosyanızı kaydedin ve mocha komut:

$ mocha .

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


  1 passing (9ms)

Çıktı, yürütülen testlerin ve sonuçlarının bir dökümüdür. Nasıl iç içe geçtiğine dikkat edin describe() çağrılar sonuç çıktısına aktarılır. Belirli bir yöntem veya özelliğe yönelik tüm testlerin bir arada yer alması faydalıdır.

Bu yöntemler Mocha test çerçevesinin temelini oluşturur. Testlerinizi istediğiniz gibi oluşturmak ve düzenlemek için bunları kullanın. Bir sonraki bölümde bunun bir örneğini göreceğiz.

Mocha ve Chai ile Test Yazma

Projeniz dahilinde testlerinizi organize etmenin önerilen yolu, hepsini kendi içine koymaktır. /test dizin. Varsayılan olarak Mocha, globları kullanarak birim testlerini kontrol eder ./test/*.js ve ./test/*.coffee. Buradan, çağrıyı yapan herhangi bir dosyayı yükleyecek ve çalıştıracaktır. describe() yöntemi.

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

Test dosyalarının sonuna şunu eklemek yaygındır: .test.js Mocha testlerini içeren kaynak dosyalar için:

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

util.js içinde test dizin herhangi bir birim testi içermez, yalnızca teste yardımcı olacak yardımcı program işlevlerini içerir.

not: Size hangi yapı mantıklı geliyorsa onu kullanabilirsiniz, birim testleri otomatik olarak alınır.

Testleri gerçekten yazmaya gelince, bunları kullanarak düzenlemenize yardımcı olur. describe() yöntemler. Bunları özelliğe, işleve, dosyaya veya başka herhangi bir düzeye göre düzenleyebilirsiniz. Örneğin, fonksiyon düzeyindeki çalışmaları açıklamak için düzenlenen bir test dosyası şöyle görünür:

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

Testleri çalıştırmak size çıktıyı verecektir:

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

Daha da genişleterek, tek bir dosyada birden fazla yöntem için testleriniz bile olabilir. Bu durumda yöntemler şu şekilde gruplandırılır: Math nesne:

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

Hangi sonuç:

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

Mocha Kancaları – before(), after(), beforeEach() ve afterEach()

Kuşkusuz çoğu birim testi bu kadar basit değildir. Çoğu zaman testlerinizi gerçekleştirmek için muhtemelen bir veritabanı veya başka bir harici kaynak (veya bunların bir kopyası/taslak kısmı) gibi başka kaynaklara ihtiyacınız olacaktır. Bunu ayarlamak için aşağıdakilerden birini veya birkaçını kullanabiliriz Mocha kancası yöntemleri:

  • before(): Verilen bloktaki tüm testlerden önce çalışır
  • beforeEach(): Verilen bloktaki her testten önce çalışır
  • after(): Verilen bloktaki tüm testlerden sonra çalıştırılır
  • afterEach(): Verilen bloktaki her testten sonra çalışır

Bu kancalar, testleriniz için gereken kurulum ve sökme işlerini gerçekleştirmek için mükemmel yerdir. Yaygın kullanım durumlarından biri, testleri çalıştırmadan önce veritabanınıza bağlantı kurmaktır:

"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) {
            
        });
    });
});

önce herhangi Testlerin çalıştırılmasından sonra fonksiyon bize gönderilir. before() yöntemi çalıştırılır (ve testler boyunca yalnızca bir kez çalıştırılır), bu da veritabanına bağlantı kurar. Bu yapıldıktan sonra test paketlerimiz çalıştırılır.

Bir test paketindeki verilerin diğer testlerimizi etkilemesini istemediğimizden, her paket çalıştırıldıktan sonra verileri veritabanımızdan temizlememiz gerekir. Bu nedir afterEach() için. Bu kancayı daha sonra tüm veritabanı verilerini temizlemek için kullanırız. her test senaryosu çalıştırıldı, böylece sonraki testler için temiz bir sayfadan başlayabiliriz.

Mocha Testlerini Çalıştırmak

Çoğu durumda bu kısım oldukça basittir. Mocha'yı zaten yüklediğinizi ve proje dizinine gittiğinizi varsayarsak, çoğu projenin yalnızca Mocha'yı kullanması yeterlidir. mocha testlerini çalıştırmak için hiçbir argüman içermeyen komut:

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

Bu önceki örneklerimizden biraz farklı çünkü Mocha'ya testlerimizin nerede olduğunu söylememize gerek yoktu. Bu örnekte test kodu beklenen konumdadır. /test.

Ancak testleri çalıştırırken kullanmak isteyebileceğiniz bazı yararlı seçenekler vardır. Örneğin testlerinizden bazıları başarısız oluyorsa, muhtemelen her değişiklik yaptığınızda paketin tamamını çalıştırmak istemezsiniz. Bazı projelerde tam test paketinin tamamlanması birkaç dakika sürebilir. Gerçekten yalnızca tek bir test yapmanız gerekiyorsa, bu çok fazla zaman kaybıdır.

Bu gibi durumlarda şunları yapmalısınız: Mocha'ya hangi testleri çalıştıracağını söyle. Bu, kullanılarak yapılabilir -g or -f seçenekleri.

Bireysel testleri çalıştırmak için aşağıdakileri sağlayabilirsiniz: -g Çalıştırmak istediğiniz testler arasında ortak bir model işaretleyin ve ekleyin. Örneğin, çalıştırmak istiyorsanız #sqrt() testler:

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

Dikkat edin #abs() Bu çalışmaya testler dahil edilmedi. Test adlarınıza göre planlama yaparsanız bu seçeneği testlerinizin yalnızca belirli bölümlerini çalıştırmak için kullanabilirsiniz.

Ancak bunlar tek yararlı seçenek değil. Mocha için göz atmak isteyebileceğiniz birkaç seçenek daha var:

  • --invert: Ters çevirir -g ve -f maçlar
  • --recursive: Alt dizinleri dahil et
  • --harmony: Düğümde tüm uyum özelliklerini etkinleştirin

not: Seçeneklerin tam listesini kullanarak kontrol edebilirsiniz. mocha -h komut veya açık bu sayfa.

Daha fazlasını nereden öğrenebilirim? Bu konu hakkında kısa bir makalede ele alabileceğimizden çok daha fazlası var; bu nedenle daha fazlasını öğrenmek istiyorsanız resmi makaleye göz atmanızı öneririz. koyun derisi ve Chai dokümantasyon.

Sonuç

Hem Mocha hem de Chai'nin, ister kitaplık, ister komut satırı aracı, hatta web sitesi olsun, hemen hemen her türlü Node projesini test etmek için kullanılabileceğini unutmayın. Kullanabileceğiniz çeşitli seçenekleri ve eklentileri kullanarak test ihtiyaçlarınızı oldukça kolay bir şekilde karşılayabilmelisiniz. Bu kitaplıkların her biri kodunuzu doğrulamak için çok kullanışlıdır ve hemen hemen tüm Node projelerinizde kullanılmalıdır.

Umarım bu Mocha ve Chai'ye faydalı bir giriş olmuştur. Burada sunduklarımdan daha öğrenecek çok şey var, bu yüzden daha fazla bilgi için dokümanlara göz atmayı unutmayın.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı