Skip to content

Latest commit

 

History

History
 
 

Jasmine

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

یاسمین چیست؟


در اوایل سال 2000، فریم ورکی برای آزمایش برنامه های کاربردی جاوا اسکریپت به نام JsUnit وجود داشت. بعداً این فریم ورک ارتقا یافت و اکنون با نام Jasmine شناخته می شود. Jasmine برپایه ی رفتار توسعه محور (Behavior Driven Development) برای JavaScript است و به واحد آزمایش (Unit Testing) خودکار کمک می کند ؛ چیزی که هنگام توسعه و بکارگیری برنامه های وب امروزی (و به طور کلی تمام برنامه ها) یک امر کاملاً کلیدی و اجتناب ناپذیر تلقی می شود.


چرا Jasmine؟

    • به هیچ چارچوب جاوا اسکریپتی دیگری وابسته نیست و میتواند در تمام محیط ها مورد استفاده قرار بگیرد.

    • به هیچ گونه DOM نیاز ندارد.

    • دستورات آن تمیز و واضح است.

    • یک فریمورک متن باز است و به راحتی در نسخه های مختلف مانند stand-alone, ruby gem, Node.js در دسترس است.

    • سریع است و سربار کمی دارد و وابستگی خارجی ندارد.


مراحل نصب:


  1. ابتدا از اینجا به وب سایت رسمی رفته و یکی از ورژن های آن را انتخاب کنید تا به صفحه آن منتقل شوید.

  2. در قسمت downloads روی standalone release کلیک کنید.

  3. حال به صفحه گیتهاب مربوط به ورژن انتخابی هدایت میشوید. از آن جا فایل زیپ jasmine را دانلود کنید.

  4. فایل unzip شده را به پروژه خودتان اضافه کنید. مانند زیر:


اماده سازی jasmine:


فایل های زیر spec و src ، دمو های یاسمین هستند؛ آن ها را پاک کنید. (همچنین لازم است رفرنس های آن ها را از specrunner.html پاک کنید)





داخل فولدر spec ، یک فایل جاوااسکریپت برای نوشتن تست کیس ها بسازید.
در انتها آدرس هر دو فایل تست و کد جاوااسکریپت را به صورت زیر به SpecRunner.html اضافه کنید:

برای مشاهده نتیجه اجرای تست ها ، کافی است فایل SpecRunner.html را اجرا کنید. در این صورت با چنین صفحه ای مواجه خواهید شد:




ایجاد تست کیس


هر واحد تست در 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); 
   });     
}
که در مثال بالا انتظار داریم مقدار تابع (5,5(add در فایل جاوااسکریپت مورد نظر میباشد، برابر با 10 شود؛ پس تست اول فیل و تست دوم پاس میشود.

دیگر توابع (matchers) expect:

  • تابع ()toEqual.not : بررسی مساوی نبودن

  • describe("Different Methods of Expect Block",function () { 
     it("The Example of not.toEqual() method",function () { 
     expect(expectexam.currentVal).not.toEqual(5); 
     });
    });

  • تابع ()toBe : تقریبا مشابه ()toEqual است با این تفاوت که تایپ دیتا نیز باید برابر باشد. یعنی ‘10 ‘برابر با 10 int نیست ) در واقع برابر با عملگر مقایسه ای === است.(

  • describe("Different Methods of Expect Block",function () {  
    
       it("The Example of toBe() method",function () { 
          expect(cal.numbr).toBe(10);     
       });
    });

  • تابع ()ToBeTruthy و ()toBeFalsy : برای چک کردن مقادیر Boolean استفاه میشود:

  • describe("Different Methods of Expect Block",function () {
     it("The Example of toBeTruthy() method",function () { 
     expect(expectexam(5)).toBeTruthy(); 
     });
    });

  • تابع ()toContain : بررسی وجود یا عدم وجود یک عضو در آرایه

  • describe("Different Methods of Expect Block",function () { 
     it("The Example of toContain() method",function () {
     expect([1,2, 3, 4]).toContain(3);
     });
    });

  • تابع ()toBeCloseTo : برای سنجش وجود مقدار تست در یک بازه یا به عبارتی نزدیک بودن آن با مقدار مورد انتظار با یک میزان خطای قابل قبول است. نمونه زیر نزدیک بودن عدد به ۱۲ را با خطای ۱ چک میکند:

  • describe("Different Methods of Expect Block", function () { 
     it("Example of toBeCloseTo()", function () {
     expect(12.34).toBeCloseTo(12 , 1); 
     });
    });

  • تابع ()ToMatch : برای چک کردن تساوی رشته های کاراکتری )String )ها بکار میرود. دقت کنید حتما باید مقدار مورد انتظار بین دو / قرار بگیرد:

  • describe("Different Methods of Expect Block",function () {
     it("Example of toMatch()", function () {
     expect("Jasmine tutorial in tutorials.com").toMatch(/com/); 
     });
    });

  • تابع ()toBeDefined و ()toBeUndefined : چک میکند که آیا متغیر قبال در این کد تعریف شده است یا نه:

  • currentVal = 0; 
    describe("Different Methods of Expect Block",function () { 
     it("Example of toBeDefined", function () {
     expect(currentVal).toBeDefined();
     });
    });

  • تابع ()toBeNull : برای بررسی تهی بودن یک متغیر:

  • describe("Different Methods of Expect Block",function () { 
     var value = null; 
     it("Example of toBeNull()", function () { 
     expect(value).toBeNull();
     });
    });

  • تابع ()toBeGreaterThan و ()toBeLessThan : بررسی نامساوی ها:

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

توابع beforeEach() و afterEach()

این توابع با اضافه شدن به بلاک 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 است.

بلاک های Suite تو در تو (Nested Suits)

میتوان بلاک های 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 
});






گردآورندگان:

    حسین صبحی، دانیال براری، سید رضا قمقام

منابع: