![](/mirshaf/Web-Workshop/raw/master/Jasmine/images/Jasmine-Testing.webp)
در اوایل سال 2000، فریم ورکی برای آزمایش برنامه های کاربردی جاوا اسکریپت به نام JsUnit وجود داشت. بعداً این فریم ورک ارتقا یافت و اکنون با نام Jasmine شناخته می شود. Jasmine برپایه ی رفتار توسعه محور (Behavior Driven Development) برای JavaScript است و به واحد آزمایش (Unit Testing) خودکار کمک می کند ؛ چیزی که هنگام توسعه و بکارگیری برنامه های وب امروزی (و به طور کلی تمام برنامه ها) یک امر کاملاً کلیدی و اجتناب ناپذیر تلقی می شود.
• به هیچ چارچوب جاوا اسکریپتی دیگری وابسته نیست و میتواند در تمام محیط ها مورد استفاده قرار بگیرد.
• به هیچ گونه DOM نیاز ندارد.
• دستورات آن تمیز و واضح است.
• یک فریمورک متن باز است و به راحتی در نسخه های مختلف مانند stand-alone, ruby gem, Node.js در دسترس است.
• سریع است و سربار کمی دارد و وابستگی خارجی ندارد.
- ابتدا از اینجا به وب سایت رسمی رفته و یکی از ورژن های آن را انتخاب کنید تا به صفحه آن منتقل شوید.
- در قسمت downloads روی standalone release کلیک کنید.
- حال به صفحه گیتهاب مربوط به ورژن انتخابی هدایت میشوید. از آن جا فایل زیپ jasmine را دانلود کنید.
- فایل unzip شده را به پروژه خودتان اضافه کنید. مانند زیر:
![](/mirshaf/Web-Workshop/raw/master/Jasmine/images/2023-01-14_22-40-49.png)
فایل های زیر spec و src ، دمو های یاسمین هستند؛ آن ها را پاک کنید. (همچنین لازم است رفرنس های آن ها را از specrunner.html پاک کنید)
![](/mirshaf/Web-Workshop/raw/master/Jasmine/images/2023-01-14_22-54-48.png)
داخل فولدر spec ، یک فایل جاوااسکریپت برای نوشتن تست کیس ها بسازید.
در انتها آدرس هر دو فایل تست و کد جاوااسکریپت را به صورت زیر به SpecRunner.html اضافه کنید:
برای مشاهده نتیجه اجرای تست ها ، کافی است فایل SpecRunner.html را اجرا کنید. در این صورت با چنین صفحه ای مواجه خواهید شد:
![](/mirshaf/Web-Workshop/raw/master/Jasmine/images/2023-01-15_21-00-42.png)
هر واحد تست در jasmine که شامل تست های مشابه است و برای یک فایل خاص نوشته شده باشند را Suite مینامند. هر Suite از دو جزء describe() و it() تشکیل میشود. هر Suite دو پارامتر دارد؛ پارامتر اول نام آن و پارامتر دوم مجموعه توابع تست آن میباشد که به صورت زیر با describe و it ها تعریف میشوند:
describe("Adding single number ",function () {
it("should add numbers",function() {
expect(add(5,5)).toEqual(5);
expect(add(5,5)).toEqual(10);
});
}
- تابع ()toEqual.not : بررسی مساوی نبودن
- تابع ()toBe : تقریبا مشابه ()toEqual است با این تفاوت که تایپ دیتا نیز باید برابر باشد. یعنی ‘10 ‘برابر با 10 int نیست ) در واقع برابر با عملگر مقایسه ای === است.(
- تابع ()ToBeTruthy و ()toBeFalsy : برای چک کردن مقادیر Boolean استفاه میشود:
- تابع ()toContain : بررسی وجود یا عدم وجود یک عضو در آرایه
- تابع ()toBeCloseTo : برای سنجش وجود مقدار تست در یک بازه یا به عبارتی نزدیک بودن آن با مقدار مورد انتظار با یک میزان خطای قابل قبول است. نمونه زیر نزدیک بودن عدد به ۱۲ را با خطای ۱ چک میکند:
- تابع ()ToMatch : برای چک کردن تساوی رشته های کاراکتری )String )ها بکار میرود. دقت کنید حتما باید مقدار مورد انتظار بین دو / قرار بگیرد:
- تابع ()toBeDefined و ()toBeUndefined : چک میکند که آیا متغیر قبال در این کد تعریف شده است یا نه:
- تابع ()toBeNull : برای بررسی تهی بودن یک متغیر:
- تابع ()toBeGreaterThan و ()toBeLessThan : بررسی نامساوی ها:
describe("Different Methods of Expect Block",function () {
it("The Example of not.toEqual() method",function () {
expect(expectexam.currentVal).not.toEqual(5);
});
});
describe("Different Methods of Expect Block",function () {
it("The Example of toBe() method",function () {
expect(cal.numbr).toBe(10);
});
});
describe("Different Methods of Expect Block",function () {
it("The Example of toBeTruthy() method",function () {
expect(expectexam(5)).toBeTruthy();
});
});
describe("Different Methods of Expect Block",function () {
it("The Example of toContain() method",function () {
expect([1,2, 3, 4]).toContain(3);
});
});
describe("Different Methods of Expect Block", function () {
it("Example of toBeCloseTo()", function () {
expect(12.34).toBeCloseTo(12 , 1);
});
});
describe("Different Methods of Expect Block",function () {
it("Example of toMatch()", function () {
expect("Jasmine tutorial in tutorials.com").toMatch(/com/);
});
});
currentVal = 0;
describe("Different Methods of Expect Block",function () {
it("Example of toBeDefined", function () {
expect(currentVal).toBeDefined();
});
});
describe("Different Methods of Expect Block",function () {
var value = null;
it("Example of toBeNull()", function () {
expect(value).toBeNull();
});
});
describe("Different Methods of Expect Block",function () {
var exp = 8;
it("Example of toBeGreaterThan()", function () {
expect(exp).toBeGreaterThan(5);
});
});
شما همچنین میتوانید matcher دلخواه خودتان را بسازید و به یاسمین خود اضافه کنید:
jasmine.addMatchers ({
validateAge: function() {
Return {
compare: function(actual,expected) {
var result = {};
result.pass = (actual > = 13 && actual < = 19);
result.message = 'sorry u are not a teen ';
return result;
}
};
}
});
این توابع با اضافه شدن به بلاک describe قبل از اجرای هر بلاک it یکبار اجرا میشوند. به مال زیر دقت کنید:
let year = 2023
describe("get year",function () {
beforeEach(()=> {
year += 1;
})
it("should be next year", function () {
expect(year).toBe(2024);
});
it("should be next year", function () {
expect(year).toBe(2024);
});
});
در اینجا تست اول پاس و تست دوم فیل میشود چون قبل از اجرای تست دوم مقدار year برای بار دوم یک واحد زیاد شده و حالا برابر با 2025 است.
میتوان بلاک های Describe را به شکل زیر تو در تو تعریف کرد:
describe("nested",function() {
// Starting of first suite block
// First block
describe("Retaining values ",function () {
//test case:1
it ("Should retain the current value of all time", function () {
expect(nested.currentVal).toBeDefined();
expect(nested.currentVal).toEqual(0);
});
}); //end of the suite block
//second suite block
describe("Adding single number ",function () {
//test case:2
it("should add numbers",function() {
expect(nested.add(5)).toEqual(5);
expect(nested.add(5)).toEqual(10);
});
}); //end of the suite block
//third suite block
describe("Adding Different Numbers",function () {
//test case:3
it("Should add any number of numbers",function() {
expect(nested.addAny(1,2,3)).toEqual(6);
});
}); //end of the suite block
});
-
حسین صبحی،
دانیال براری،
سید رضا قمقام