Menguji Kode Node.js dengan Mocha dan Chai

Pengantar

Menulis pengujian unit adalah sesuatu yang biasanya ditunda oleh pemula dan insinyur berpengalaman untuk fase pengembangan berikutnya, namun โ€“ pengujian ini merupakan kunci pengembangan perangkat lunak yang stabil dan tangguh.

Premis dasar dari pengembangan berbasis tes (TDD) sedang menulis tes Anda bahkan sebelum Anda mulai membuat kode. Itu adalah tujuan yang bagus untuk diperjuangkan, namun dibutuhkan banyak disiplin dan perencanaan ketika Anda mencoba mengikuti prinsip-prinsipnya! Untuk membuat seluruh proses ini lebih mudah, Anda dapat menggunakan kerangka pengujian dan pernyataan yang mudah digunakan dan kuat, seperti Moka dan Chai.

Dalam artikel ini, kami akan memulai dengan memperkenalkan Anda ke dua perpustakaan ini dan kemudian menunjukkan cara menggunakannya bersama-sama untuk membuat pengujian unit yang mudah dibaca dan fungsional dengan cepat.

Chai

Chai adalah perpustakaan pernyataan yang menyediakan keduanya BDD (pengembangan berbasis perilaku) dan TDD (pengembangan berbasis pengujian) gaya pemrograman untuk kode pengujian, dan dimaksudkan untuk dipasangkan dengan perpustakaan pengujian yang memungkinkan Anda mengatur pengujian. Ini sangat umum dipasangkan dengan Mocha.

Ini memiliki tiga API utama:

  • should
  • expect
  • assert

var.should.equal(var2)


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


assert.equal(var1, var2)

Sepanjang artikel ini, kita akan fokus pada gaya BDD menggunakan Chai expect antarmuka, meskipun menggunakan antarmuka/gaya lain sesuai intuisi Anda tidak masalah. Itu assert antarmuka adalah kerangka pernyataan TDD yang paling umum.

expect menggunakan API bahasa yang sangat alami untuk menulis pernyataan Anda, yang akan membuat pengujian Anda lebih mudah untuk ditulis dan diperbaiki di kemudian hari. Hal ini dilakukan dengan menyatukan pengambil untuk membuat dan mengeksekusi pernyataan, sehingga memudahkan untuk menerjemahkan persyaratan ke dalam kode:

let user = {name: 'Scott'};


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

Catatan: Lihat bagaimana Anda bisa membaca pernyataan tersebut dalam bahasa alami dan memahami apa yang terjadi? Itulah salah satu keuntungan utama menggunakan perpustakaan pernyataan seperti Chai!

Beberapa contoh lagi dari pengambil ini adalah:

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

Beberapa dari pengambil ini dapat dirangkai bersama dan digunakan dengan metode pernyataan seperti true, ok, exist, dan empty untuk membuat beberapa pernyataan kompleks hanya dalam satu baris:

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

Catatan: Daftar lengkap metode yang tersedia dapat ditemukan di sini.

Anda mungkin juga ingin memeriksa daftar yang tersedia plugin untuk Chai. Ini mempermudah pengujian fitur yang lebih kompleks.

Mengambil chai-http misalnya, plugin yang membantu Anda menguji rute server:

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

Mengorganisir Kasus Uji dengan Mocha โ€“ deskripsikan() dan it()

Mocha adalah kerangka pengujian untuk Node yang memberi Anda fleksibilitas untuk menjalankan kode asinkron (atau sinkron) secara serial. Pengecualian apa pun yang tidak tertangkap akan ditampilkan di samping kasus uji di mana pengecualian tersebut dilemparkan, sehingga memudahkan untuk mengidentifikasi dengan tepat apa yang gagal dan alasannya.

Disarankan untuk menginstal Mocha secara global:

$ npm install mocha -g

Anda pasti menginginkannya menjadi instalasi global sejak mocha perintah digunakan untuk menjalankan tes untuk proyek di direktori lokal Anda.

Apa fungsi potongan kode ini?

it() harus mengembalikan X. it() mendefinisikan kasus uji, dan Mocha akan menjalankan masing-masing kasus uji it() sebagai tes unit. Untuk mengatur beberapa pengujian unit, kita bisa describe() fungsi umum, dan dengan demikian menyusun tes Mocha.

Ini mungkin paling baik dijelaskan dengan contoh nyata:

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

Dalam majalah describe() metode, kami mendefinisikan a nama tes, Yang disebut #abs(). Anda juga dapat menjalankan pengujian satu per satu berdasarkan namanya โ€“ ini akan dibahas nanti.

Catatan: Dengan tes Mocha, Anda tidak perlu melakukannya require() salah satu metode Mocha. Metode-metode ini disediakan secara global ketika dijalankan dengan mocha perintah.

Untuk menjalankan tes ini, simpan file Anda dan gunakan mocha perintah:

$ mocha .

  Math
    #abs()
      โœ“ should return positive value of given number 


  1 passing (9ms)

Outputnya adalah rincian pengujian yang dijalankan dan hasilnya. Perhatikan bagaimana bersarangnya describe() panggilan dibawa ke output hasil. Akan berguna jika semua pengujian untuk metode atau fitur tertentu disarangkan bersama-sama.

Metode-metode ini adalah dasar kerangka pengujian Mocha. Gunakan mereka untuk menyusun dan mengatur tes Anda sesuka Anda. Kita akan melihat salah satu contohnya di bagian selanjutnya.

Tes Menulis Dengan Mocha dan Chai

Cara yang disarankan untuk mengatur pengujian Anda dalam proyek Anda adalah dengan memasukkan semuanya ke dalam proyeknya sendiri /test direktori. Secara default, Mocha memeriksa pengujian unit menggunakan gumpalan ./test/*.js dan ./test/*.coffee. Dari sana, ia akan memuat dan mengeksekusi file apa pun yang memanggil describe() Metode.

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Merupakan hal yang umum untuk menambahkan akhiran pada file pengujian .test.js untuk file sumber yang berisi tes Mocha:

โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ lib
โ”‚   โ”œโ”€โ”€ db.js
โ”‚   โ”œโ”€โ”€ models.js
โ”‚   โ””โ”€โ”€ util.js
โ””โ”€โ”€ test
    โ”œโ”€โ”€ db.test.js
    โ”œโ”€โ”€ models.test.js
    โ”œโ”€โ”€ util.test.js
    โ””โ”€โ”€ util.js

util.js dalam test direktori tidak akan berisi pengujian unit apa pun, hanya fungsi utilitas untuk membantu pengujian.

Note: Anda dapat menggunakan struktur apa pun yang masuk akal bagi Anda, pengujian unit diambil secara otomatis.

Ketika benar-benar menulis tes, ada baiknya mengaturnya menggunakan describe() metode. Anda dapat mengaturnya berdasarkan fitur, fungsi, file, atau tingkat sewenang-wenang lainnya. Misalnya, file pengujian yang disusun untuk menjelaskan cara kerja pada tingkat fungsi terlihat seperti:

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

Menjalankan tes akan memberi Anda output:

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

Memperluas lebih jauh lagi, Anda bahkan mungkin melakukan pengujian untuk beberapa metode dalam satu file. Dalam hal ini, metode dikelompokkan berdasarkan Math obyek:

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

Yang mengakibatkan:

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

Kait Mocha โ€“ sebelum(), setelah(), sebelumEach() dan setelahEach()

Memang benar, sebagian besar pengujian unit tidak sesederhana itu. Seringkali Anda mungkin memerlukan sumber daya lain untuk melakukan pengujian, seperti database, atau sumber daya eksternal lainnya (atau tiruan/rintisan sumber daya tersebut). Untuk mengaturnya, kita dapat menggunakan satu atau lebih cara berikut kait mocha metode:

  • before(): Berjalan sebelum semua pengujian di blok tertentu
  • beforeEach(): Berjalan sebelum setiap pengujian di blok tertentu
  • after(): Berjalan setelah semua pengujian di blok tertentu
  • afterEach(): Berjalan setelah setiap pengujian di blok tertentu

Kait ini adalah tempat sempurna untuk melakukan pekerjaan penyetelan dan pembongkaran yang diperlukan untuk pengujian Anda. Salah satu kasus penggunaan yang umum adalah membuat koneksi ke database Anda sebelum menjalankan pengujian:

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

Sebelum Apa pun tes dijalankan, fungsi dikirim ke kami before() metode dijalankan (dan hanya dijalankan sekali selama pengujian), yang membuat koneksi ke database. Setelah ini selesai, rangkaian pengujian kami kemudian dijalankan.

Karena kita tidak ingin data dari satu rangkaian pengujian memengaruhi pengujian kita yang lain, kita perlu menghapus data dari database setelah setiap rangkaian pengujian dijalankan. Ini adalah apa afterEach() adalah untuk. Kami menggunakan kait ini untuk menghapus semua data database setelahnya setiap kasus uji dijalankan, sehingga kita dapat memulai dari awal untuk pengujian berikutnya.

Menjalankan Tes Mocha

Untuk sebagian besar kasus, bagian ini cukup sederhana. Dengan asumsi Anda telah menginstal Mocha dan menavigasi ke direktori proyek, sebagian besar proyek hanya perlu menggunakan mocha perintah tanpa argumen untuk menjalankan pengujiannya:

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

Ini sedikit berbeda dari contoh kami sebelumnya karena kami tidak perlu memberi tahu Mocha di mana lokasi pengujian kami. Dalam contoh ini, kode pengujian berada di lokasi yang diharapkan /test.

Namun, ada beberapa opsi bermanfaat yang mungkin ingin Anda gunakan saat menjalankan pengujian. Jika beberapa pengujian Anda gagal, misalnya, Anda mungkin tidak ingin menjalankan keseluruhan rangkaian setiap kali Anda melakukan perubahan. Untuk beberapa proyek, rangkaian pengujian lengkap mungkin memerlukan waktu beberapa menit untuk diselesaikan. Banyak sekali waktu yang terbuang jika Anda benar-benar hanya perlu menjalankan satu pengujian.

Untuk kasus seperti ini, Anda harus melakukannya beri tahu Mocha tes mana yang harus dijalankan. Ini dapat dilakukan dengan menggunakan -g or -f Pilihan.

Untuk menjalankan pengujian individual, Anda dapat menyediakan -g tandai dan tambahkan pola umum di antara pengujian yang ingin Anda jalankan. Misalnya, jika Anda ingin menjalankan #sqrt() tes:

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

Perhatikan bahwa #abs() tes tidak disertakan dalam proses ini. Jika Anda merencanakan sesuai dengan nama pengujian Anda, opsi ini dapat digunakan untuk hanya menjalankan bagian tertentu dari pengujian Anda.

Namun, ini bukan satu-satunya pilihan yang berguna. Berikut beberapa opsi Mocha lainnya yang mungkin ingin Anda periksa:

  • --invert: Membalikkan -g dan -f korek api
  • --recursive: Sertakan sub-direktori
  • --harmony: Mengaktifkan semua fitur harmoni di Node.js

Note: Anda dapat melihat daftar lengkap opsi dengan menggunakan mocha -h perintah, atau aktif halaman ini.

Di mana untuk mempelajari lebih lanjut? Ada jauh lebih banyak topik ini daripada yang bisa kita bahas dalam artikel singkat, jadi jika Anda ingin mempelajari lebih lanjut maka kami sarankan untuk memeriksa situs resminya. Moka dan Chai dokumentasi.

Kesimpulan

Perlu diingat bahwa Mocha dan Chai dapat digunakan untuk menguji hampir semua jenis proyek Node, baik itu perpustakaan, alat baris perintah, atau bahkan situs web. Memanfaatkan berbagai opsi dan plugin yang tersedia untuk Anda, Anda seharusnya dapat memenuhi kebutuhan pengujian Anda dengan mudah. Masing-masing perpustakaan ini sangat berguna untuk memvalidasi kode Anda dan harus digunakan di hampir semua proyek Node Anda.

Semoga ini bisa menjadi pengenalan yang bermanfaat tentang Mocha dan Chai. Masih banyak lagi yang perlu dipelajari selain apa yang telah saya sajikan di sini, jadi pastikan untuk membaca dokumen untuk informasi lebih lanjut.

Stempel Waktu:

Lebih dari penyalahgunaan