JavaScript үндэс / Тест бичих үндэс (Jest)

Тест бичих үндэс (Jest)

Код бичээд ажиллаж байвал сайн. Гэхдээ хэдэн сарын дараа өөрчлөлт хийхэд юу нь эвдэрсэнийг яаж мэдэх вэ? Автомат тест нь энэ асуудлыг шийднэ. Тест бол таны функцийг "энэ оролтод энэ гаралт гарах ёстой" гэж автоматаар шалгадаг код юм. Jest нь JavaScript-ийн хамгийн түгээмэл тестийн сан бөгөөд суурилуулж ашиглахад маш хялбар.

Jest суурилуулж эхлэх

bash
npm init -y
npm install --save-dev jest

package.json дотор дараах мөрийг нэмнэ:

json
{
  "scripts": {
    "test": "jest"
  }
}

Тестийг ажиллуулахдаа:

bash
npm test

Анхны тест: expect ба toBe

Jest-ийн үндсэн бүтэц: test() функц тодорхой нэртэй нэг тест тодорхойлно, expect() нь утгыг шалгана.

javascript
// utils.js
function нэмэх(а, б) {
  return а + б;
}

function хасах(а, б) {
  return а - б;
}

module.exports = { нэмэх, хасах };
javascript
// utils.test.js
const { нэмэх, хасах } = require("./utils");

test("нэмэх функц зөв ажиллана", () => {
  expect(нэмэх(2, 3)).toBe(5);
  expect(нэмэх(0, 0)).toBe(0);
  expect(нэмэх(-1, 1)).toBe(0);
});

test("хасах функц зөв ажиллана", () => {
  expect(хасах(10, 3)).toBe(7);
  expect(хасах(0, 5)).toBe(-5);
});

Тест давсан үед:

код
✓ нэмэх функц зөв ажиллана (2ms)
✓ хасах функц зөв ажиллана (1ms)

Tests: 2 passed, 2 total

Нийтлэг matcher-ууд

Jest-д олон төрлийн шалгагч (matcher) байдаг:

javascript
test("matcher-уудын жишээ", () => {
  // Тэнцүү эсэх
  expect(2 + 2).toBe(4);
  expect({ нэр: "Болд" }).toEqual({ нэр: "Болд" }); // объектод toEqual

  // Үнэн/худал
  expect(true).toBeTruthy();
  expect(null).toBeFalsy();
  expect(null).toBeNull();
  expect(undefined).toBeUndefined();

  // Тоон харьцуулалт
  expect(10).toBeGreaterThan(5);
  expect(3).toBeLessThanOrEqual(3);

  // Мөр дотор агуулга
  expect("Сайн уу, дэлхий").toContain("дэлхий");

  // Массив дотор элемент
  expect([1, 2, 3]).toContain(2);
});

Бүлэглэх ба алдаа шалгах

describe() ашиглан холбоотой тестүүдийг бүлэглэнэ. Алдаа гарах ёстой тохиолдлыг ч шалгаж болно:

javascript
// validator.js
function имэйл_шалгах(имэйл) {
  if (typeof имэйл !== "string") throw new Error("Мөр байх ёстой");
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(имэйл);
}

module.exports = { имэйл_шалгах };
javascript
// validator.test.js
const { имэйл_шалгах } = require("./validator");

describe("имэйл_шалгах", () => {
  test("зөв имэйл хаягийг зөв гэж үнэлнэ", () => {
    expect(имэйл_шалгах("bold@example.mn")).toBe(true);
    expect(имэйл_шалгах("user.name@mail.com")).toBe(true);
  });

  test("буруу имэйл хаягийг буруу гэж үнэлнэ", () => {
    expect(имэйл_шалгах("bold@")).toBe(false);
    expect(имэйл_шалгах("@example.com")).toBe(false);
    expect(имэйл_шалгах("буруу")).toBe(false);
  });

  test("мөр биш оролтод алдаа гарна", () => {
    expect(() => имэйл_шалгах(12345)).toThrow("Мөр байх ёстой");
    expect(() => имэйл_шалгах(null)).toThrow();
  });
});

Тест бичих нь нэмэлт ажил мэт санагдаж болно — гэхдээ нэг удаа алдааг тест тандан олсон мөчөөс эхлэн дадал болно. Мэргэшсэн хөгжүүлэгчид шинэ код бичихийн зэрэгцээ тестийг нь бичдэг — энэ нь Test-Driven Development (TDD) гэдэг хандлага бөгөөд томоохон компаниудад өргөн хэрэглэгддэг.

Дараагийн хичээлд:

Эцсийн төсөл — энэ курсын туршид сурсан бүх мэдлэгийг нэгтгэн, жинхэнэ JavaScript апп бүтээнэ. Та бэлэн!