Pengujian otomatis pada dasarnya hanyalah kode yang
akan menampilkan atau menyebabkan kesalahan jika
ada yang salah.
Seperti disebutkan di bagian sebelumnya,
Halaman ini membahas pendekatan umum untuk primitif tersebut.
Contoh:
import { fibonacci, catalan } from '.. / src/ math. js';
import { assert, test, suite } from 'a-made-up-testing-library';
suite('math tests', () => {
test('fibonacci function', () => {
// check expected fibonacci numbers against our known actual values
// with an explanation if the values don't match
assert. equal(fibonacci(0), 0, 'Invalid 0th fibonacci result');
assert. equal(fibonacci(13), 233, 'Invalid 13th fibonacci result');
});
test('relationship between sequences', () => {
// catalan numbers are greater than fibonacci numbers (but not equal)
assert. isAbove(catalan(4), fibonacci(4));
});
test('bugfix: check bug #4141', () => {
assert. isFinite(fibonacci(0)); // fibonacci(0) was returning NaN
})
});
Contoh ini membuat grup pengujian (terkadang disebut suite) yang disebut "matematika
pengujian",
Penunjang pernyataan sebagai primitif
Sebagian besar framework pengujian,assert
yang memungkinkan Anda dengan cepat memeriksa nilai yang ditampilkan atau
status lain terhadap beberapa ekspektasi.assert.
.
Anda mungkin juga memiliki ekspektasi bahwa
suatu nilai memiliki bentuk tertentu,
'truthy' {i>check<i},
yang sering kali digambarkan sebagai 'ok' memeriksa, memeriksa apakah suatu kondisi sudah benar, cocok dengan cara Anda menulis if
yang memeriksa apakah sesuatu berhasil atau benar.Info ini cenderung disediakan sebagai assert(
atau. . .) assert.
,ok( . . .) dan mengambil satu nilai ditambah komentar opsional. Pemeriksaan kesetaraan,
seperti dalam contoh ujian matematika, di mana Anda mengharapkan nilai yang ditampilkan atau keadaan objek untuk menyamakan nilai baik yang diketahui. Pertanyaan ini untuk persamaan primitif (seperti untuk angka dan string) atau persamaan referensial (keduanya adalah objek yang sama). Di balik layar, semua ini hanyalah 'truthy' centang dengan perbandingan ==
atau===
.- JavaScript membedakan antara persamaan longgar (
==
) dan ketat (===
).Sebagian besar library pengujian menyediakan metode assert.
danequal assert.
.strictEqual
- JavaScript membedakan antara persamaan longgar (
Pemeriksaan kesetaraan mendalam,
yang memperluas pemeriksaan kesetaraan untuk mencakup isi objek, larik, dan tipe data lainnya yang lebih kompleks, serta logika internal untuk melintasi objek untuk membandingkannya. Ini penting karena JavaScript tidak memiliki cara bawaan untuk membandingkan isi dua objek atau array. Misalnya, [1,
selalu salah (false).2, 3] == [1, 2, 3] Uji coba framework sering kali menyertakan helper deepEqual
ataudeepStrictEqual
.
Encoder pernyataan yang membandingkan dua nilai (bukan hanya pemeriksaan 'truthy') biasanya membutuhkan dua atau tiga argumen:
- Nilai sebenarnya,
seperti yang dihasilkan dari kode yang diuji atau mendeskripsikan status untuk divalidasi. - Nilai yang diharapkan,
biasanya {i>hard-code<i} (misalnya, angka literal atau {i>string<i}). - Komentar opsional yang menjelaskan apa yang
diharapkan atau apa yang mungkin gagal,
yang akan disertakan jika baris ini gagal.
Menggabungkan pernyataan
untuk menyusun berbagai macam pernyataan
pemeriksaan,
test('JWT parse', () => {
const json = decodeJwt('eyJieSI6InNhbXRob3Ii…');
assert. ok(json. payload. admin, 'user should be admin');
assert. deepEqual(json. payload. groups, ['role:Admin', 'role:Submitter']);
assert. equal(json. header. alg, 'RS265')
assert. isAbove(json. payload. exp, +new Date(), 'expiry must be in future')
});
Vitest menggunakan library pernyataan Cha
secara internal untuk menyediakan helper penegasannya,
Pernyataan lancar dan BDD
Beberapa developer lebih memilih gaya pernyataan yang bisa dipanggil berdasarkan perilaku
pengembangan (BDD),expect()
.
Diperkirakan helper berperilaku dengan cara yang sama seperti pernyataan yang ditulis sebagai metode sederhana
panggilan seperti assert.
atau assert.
,
// A failure here would generate "Expect result to be an array that does include 42 "
const result = await possibleMeaningsOfLife();
expect(result). to. be. an('array'). that. does. include(42);
// or a simpler form
expect(result). toBe('array'). toContainEqual(42);
// the same in assert might be
assert. typeOf(result, 'array', 'Expected the result to be an array');
assert. include(result, 42, 'Expected the result to include 42');
Gaya pernyataan ini berfungsi karena teknik
yang disebut perantaian metode,expect
dapat terus dirantai bersama dengan
panggilan metode lebih lanjut.to.
dan that.
pada contoh sebelumnya,expect
biasanya tidak mendukung komentar opsional,
Banyak framework pengujian mendukung pernyataan Fluent/
Mengelompokkan pengujian di berbagai file
Saat menulis pengujian,
Pengujian komponen cenderung ditempatkan dalam
file {i>peer-<i} ke komponen yang sedang diuji,
Demikian pula,
Mengelompokkan pengujian dalam file
Seperti yang digunakan dalam contoh sebelumnya,suite()
yang mengelompokkan pengujian yang Anda siapkan dengan test()
.test()
,
Seperti pernyataan,
// traditional/TDD
suite('math tests', () => {
test('handle zero values', () => {
assert. equal(fibonacci(0), 0);
});
});
// Fluent/BDD
describe('math tests', () => {
it('should handle zero values', () => {
expect(fibonacci(0)). toBe(0);
});
})
Di sebagian besar framework,suite
dan describe
berperilaku serupa,test
dan
it
,expect
dan assert
untuk menulis pernyataan.
Alat lainnya memiliki pendekatan yang sedikit berbeda untuk mengatur suite dan pengujian.test()
untuk
secara implisit membuat
hierarki pengujian.suite()
dan tidak akan menjalankan test()
yang ditentukan di dalam test()
lain.
Sama seperti pernyataan,
Metode siklus proses
Salah satu alasan untuk mengelompokkan pengujian Anda,
Untuk setiap 'test()' atau 'it()', |
Sekali untuk suite | |
---|---|---|
Sebelum pengujian dijalankan | `beforeSetiap()` | `beforeAll()` |
Setelah pengujian dijalankan | `afterSetiap()` | 'afterAll()' |
Misalnya,
suite('user test', () => {
beforeEach(() => {
insertFakeUser('bob@example. com', 'hunter2');
});
afterEach(() => {
clearAllUsers();
});
test('bob can login', async () => { … });
test('alice can message bob', async () => { … });
});
Hal ini dapat bermanfaat untuk menyederhanakan pengujian Anda.
Saran umum
Berikut beberapa kiat yang perlu diingat ketika memikirkan tentang dasar-dasar ini.
Model primitif adalah panduan
Ingatlah bahwa alat dan primitif di sini,
Mengombinasikan pernyataan sesuai kebutuhan
Pengujian pada dasarnya adalah kode yang dapat menampilkan error.test()
,
Namun,assert()
,expect()
,if
kuno yang baik.
Penyiapan IDE dapat sangat membantu
Memastikan bahwa IDE Anda,assert
dalam pernyataan Chai
library,
Hal ini bisa menjadi sangat penting untuk beberapa framework pengujian yang mengisi
namespace global dengan metode pengujiannya.
// some.test.js
test('using test as a global', () => { … });
Sebaiknya impor helper meskipun didukung secara otomatis,React
global,
// some.test.js
import { test } from 'vitest';
test('using test as an import', () => { … });