اختبار TypeScript: الأطر والأدوات وأفضل الممارسات
TypeScript هي طبقة كتابة ثابتة فوق JavaScript، تُستخدم بنشاط في مشاريع الويب الحديثة. ومع ذلك، فإن الكتابة وحدها لا تضمن عدم وجود أخطاء منطقية أو أخطاء في وقت التشغيل أو عمل غير صحيح للمكونات. لذلك، فإن اختبار تطبيقات TypeScript هو مرحلة إلزامية في التطوير. في هذه المقالة، سنستعرض بالتفصيل الأطر والأدوات الرئيسية لاختبار TypeScript، وميزاتها، وأمثلة على الاستخدام، وتوصيات للاختيار.
1. لماذا يختلف اختبار TypeScript عن JavaScript؟
يضيف TypeScript فحصًا ثابتًا للأنواع، لكن هذا لا يغني عن اختبارات الوحدة أو اختبارات التكامل أو اختبارات E2E. ومع ذلك، يوفر TypeScript مزايا:
- أمان الأنواع — يكتشف المترجم العديد من الأخطاء في مرحلة التطوير.
- دعم أفضل لبيئة التطوير المتكاملة (IDE) — الإكمال التلقائي، إعادة الهيكلة، التنقل.
- نقاء كود الاختبارات — تساعد الأنواع في تجنب الأخطاء في الاختبارات نفسها.
في الوقت نفسه، تعمل أطر اختبار TypeScript عادةً من خلال الترجمة (ts-jest, esbuild, swc) أو تستخدم الدعم المدمج لـ TypeScript.
2. الأطر الرئيسية لاختبارات الوحدة
Jest
الإطار الأكثر شيوعًا لاختبار JavaScript و TypeScript. مدعوم من Facebook، ويحتوي على مكتبة تأكيدات مدمجة، و mock، و spy، وتغطية الكود.
التثبيت والإعداد:
npm install --save-dev jest @types/jest ts-jest typescriptالتكوين في jest.config.ts:
export default { preset: 'ts-jest', testEnvironment: 'node', roots: ['<rootDir>/src']};مثال على اختبار:
// sum.tsexport function sum(a: number, b: number): number { return a + b;}
// sum.test.tsimport { sum } from './sum';
describe('sum function', () => { it('should add two numbers correctly', () => { expect(sum(2, 3)).toBe(5); });
it('should handle negative numbers', () => { expect(sum(-1, -2)).toBe(-3); });});Vitest
بديل حديث لـ Jest، محسّن لمشاريع Vite. يتميز بسرعة عالية بفضل استخدام esbuild/swc داخليًا. متوافق تمامًا مع TypeScript بشكل افتراضي.
التثبيت:
npm install --save-dev vitestمثال على اختبار (بدون تكوين إضافي):
// utils.tsexport const capitalize = (str: string): string => { return str.charAt(0).toUpperCase() + str.slice(1);};
// utils.test.tsimport { describe, it, expect } from 'vitest';import { capitalize } from './utils';
describe('capitalize', () => { it('should capitalize first letter', () => { expect(capitalize('hello')).toBe('Hello'); });
it('should handle empty string', () => { expect(capitalize('')).toBe(''); });});Mocha + Chai
ثنائي كلاسيكي للاختبار المرن. Mocha هو مشغل اختبارات، و Chai هي مكتبة للتأكيدات. يتطلب إعدادًا إضافيًا لـ TypeScript.
التثبيت:
npm install --save-dev mocha chai @types/mocha @types/chai ts-node typescriptمثال:
import { expect } from 'chai';import { describe, it } from 'mocha';
function multiply(a: number, b: number): number { return a * b;}
describe('multiply', () => { it('should multiply two numbers', () => { expect(multiply(3, 4)).to.equal(12); });
it('should handle zero', () => { expect(multiply(5, 0)).to.equal(0); });});3. أدوات اختبار التكامل واختبار E2E
Cypress
إطار لاختبار end-to-end لتطبيقات الويب. يعمل في المتصفح، وله لوحة تحكم مريحة، وانتظارات تلقائية