היום אנחנו הולכים לדבר על Assertions, כי בסופו של דבר אנחנו אנשי בדיקות ועיקר עבודתינו היא: לבדוק.

ה-Asserts הן אוסף של פונקציונליות אשר מאפשרות לנו לבצע וולידציות באותם טסטים אוטומטיים שאנו כותבים. ספרדיות קוד אלו שייכות לאותו Framework ממנו אנו מרצים, בין אם זה TestNG, Junit, Nunit, MSTest, xUnit או Whatever…

שימו לב כי הן אינן שייכות אפילו לא חלקית לספריות הקוד של Selenium / Appium , לכן כשאנשים אומרים שסלניום למשל זהו כלי לבדיקות אוטומטיות – זו טעות ! סלניום הוא כלי לפעולות אוטומטיות, זהו בסה"כ דרייבר לדפדפן.

אם אינכם חדשים בבדיקות אוטומטיות, סביר להניח שכבר יצר לכם לעבוד אם איזושהיא פעולת Assert בחייכם, אהמר ואגיד שזוהי פעולת ה-assertEquals, שמטרתה להשוות בין 2 וטיפוסים. הרעיון שעומד מאחורי assert זה הוא שבמידה ושני הטיפוס שווים התוכנית תמשיך לרוץ, אך אם הם אינם שווים, התוכנית תיכשל, תיעצר ולא תמשיך לרוץ (תחת אותו Test@) וכמו כן יזרק לנו AssertionError.

 

 

לדוגמא, מקרה בדיקה שיעבור :

@Test
public void test01()
{
	driver.get("http://yoniflenner.net");
	assertEquals(driver.getTitle(), "יוני פלנר - עתיד האוטומציה");
	System.out.println("Test Passed");
}

במקרה הזה אנחנו ננווט לאתר שלנו – עתיד האוטומציה ונשווה את ה-title של העמוד אל מול Expected Output שבמקרה הזה הוא נכון ולכן הבדיקה תעבור והדפסה ל-console תתבצע.

לעומת מקרה בדיקה שיכשל:

@Test
public void test01()
{
	driver.get("http://yoniflenner.net");
	assertEquals(driver.getTitle(), "Google");
	System.out.println("Test Passed");
}

במקרה הזה, ייזרק לנו AssertionError בפקודת ה-Assert מכיוון שה-title אינו שווה ל-Google , הטסט יכשל ויעצר באותה שורת פקודה, שזה אומר שההדפסה ל-console לא תתבצע !

 

אם לדוגמא נרצה לבדוק כבדיקה מאוד בסיסית על האתר (שיהיה חלק מה-Sanity שלנו) כי כל התפריטים קיימים ומוצגים, איך נבדוק זאת ? נגיד שיש לנו 40 תפריטים שונים.

האם נכתוב 40 טסטים שונים שכל טסט בודק תפריט מסויים ? וואו, זה מאוד יכול להעמיס לנו על הלוגים שגם ככה אנחנו רוצים לצמצם אותם בכדיי שיהיו כמה שיותר ברורים וקצרים, בטח ברמת ה-Sanity.

האם נכתוב את כל הבדיקות בטסט אחד ארוך ? ואם כן, מה יקרה ברגע שהתפריט השלישי יזרוק לנו שגיאה, הוא לא ימשיך ויבדוק את שאר 37 התפריטים הבאים…. מממ….

הכירו חברים את Soft Assertions !

ה-Soft Assertions מתנהגים כמו ה-Assertions (או יש כאלו שקוראים להם Hard Assertions) רק שאם הם נכשלים, הם לא מפילים את הטסט על ההתחלה, אלא ממשיכים הלאה כשברקע הם מדווחים לאובייקט ממחלקת ה-SoftAssert (שנדאג כמובן ליצור מבעוד מועד, ראו דוגמא בהמשך).

לאחר שביצענו את כל הבדיקות שלנו, למשל שכל התפריטים מוצגים על המסך, נרצה לדווח למנוע ההרצה, במקרה שלנו – TestNG בין אם אובייקט ה-SoftAssert מכיל בתוכו שגיאה או לא, זה יתבצע על ידי פעולת ה-assertAll.

אז אופן הפעולה יהיה כך למשל:

@Test
public void SomeTest()
{
    driver.get("http://yoniflenner.net");
	SoftAssert softAssertion = new SoftAssert();
	softAssertion.assertEquals(driver.getTitle(), "Google");
	softAssertion.assertEquals(driver.getTitle(), "יוני פלנר - עתיד האוטומציה");
	softAssertion.assertAll();
}

 

בדוגמא זו  אנו רואים כי לאחר שנכנסנו לאתר של עתיד האוטומציה אנו מנסים להשוות את כותרת העמוד לגוגל, במצב זה ה-SoftAssert יכשל אך הוא ימשיך להריץ את התוכנית לפקודה הבאה שגם היא תבדוק את כותרת העמוד רק שהפעם ההשוואה תהיה נכונה . רק בפקודת ה-assertAll אנו נדווח ל-TestNG האם הטסט עבר (זה שומא שכל ה-SoftAssertions עברו) או נכשל (שמספיק SoftAssertion אחד שנכשל)

בוא נראה כעת כיצד ניתן לוודא את תצוגת התפריט העליון של האתר (כפי שדיברנו עליו מקודם), זהו התפריט אותו נרצה לוודא:

וזו תהיה התוכנית:

public class asserting
{
	static WebDriver driver;
	static SoftAssert softAssertion;
	
	@BeforeClass 
	public static void start()
	{   
		System.setProperty("webdriver.chrome.driver", "C:/chromedriver.exe");
		driver = new ChromeDriver();		
		driver.manage().window().maximize();		
		driver.get("http://yoniflenner.net");
		softAssertion = new SoftAssert();
	}
	
	@Test
	public void test01()
	{
		WebElement courses = driver.findElement(By.cssSelector("a[href='courses.html']"));
		WebElement infra = driver.findElement(By.cssSelector("a[href='infra.html']"));
		WebElement video = driver.findElement(By.cssSelector("a[href='video.html']"));
		WebElement about = driver.findElement(By.cssSelector("a[href='about.html']"));
		WebElement blog = driver.findElement(By.cssSelector("a[href='http://blog.yoniflenner.net']"));
		WebElement contacts = driver.findElement(By.cssSelector("a[href='contacts.html']"));
			
		softAssertion.assertTrue(courses.isDisplayed(), "Oh No, courses is not Displayed");
		softAssertion.assertTrue(infra.isDisplayed(), "Oh No, infra is not Displayed");
		softAssertion.assertTrue(video.isDisplayed(), "Oh No, video is not Displayed");
		softAssertion.assertTrue(about.isDisplayed(), "Oh No, about is not Displayed");
		softAssertion.assertTrue(blog.isDisplayed(), "Oh No, blog is not Displayed");
		softAssertion.assertTrue(contacts.isDisplayed(), "Oh No, contacts is not Displayed");
		
		softAssertion.assertAll();	
	}
	
	@AfterClass
	public static void close()
	{
		driver.quit();
	}
}

 

שימו לב כי הבדיקה כאן מוודאת שהתפריטים מוצגים באתר, אין היא מוודאת כי האלמנטים של התפריטים קיימים בדף, במקרה של אי קיום תפריט ה-SoftAssertion לא יעזור לנו (בדיוק כפי שה-Hard Assertion לא יעזור), במקרה כזה, יזרק לנו No Such Element Exception ואז נצטרך לטפל בזה בדרכים אחרות (כמו Listeners או try/catch)

בשביל לבדוק שזה אכן עובד וממשיך להריץ את הבדיקות, נכניס assertFlase לבדחיקת ה-courses ולבדיקת ה-blog למשל, על שני אלו היא אמורה ליפול, ואם התוכנית נפלה על ה-blog זה אומר שהיא המשיכה לרוץ אחרי הנפילה של courses, כך:

 

public class asserting
{
	static WebDriver driver;
	static SoftAssert softAssertion;
	
	@BeforeClass 
	public static void start()
	{   
		System.setProperty("webdriver.chrome.driver", "C:/chromedriver.exe");
		driver = new ChromeDriver();		
		driver.manage().window().maximize();		
		driver.get("http://yoniflenner.net");
		softAssertion = new SoftAssert();
	}
	
	@Test
	public void test01()
	{
		WebElement courses = driver.findElement(By.cssSelector("a[href='courses.html']"));
		WebElement infra = driver.findElement(By.cssSelector("a[href='infra.html']"));
		WebElement video = driver.findElement(By.cssSelector("a[href='video.html']"));
		WebElement about = driver.findElement(By.cssSelector("a[href='about.html']"));
		WebElement blog = driver.findElement(By.cssSelector("a[href='http://blog.yoniflenner.net']"));
		WebElement contacts = driver.findElement(By.cssSelector("a[href='contacts.html']"));
			
		softAssertion.assertFalse(courses.isDisplayed(), "Oh No, courses is not Displayed");     // Changed to assertFalse
		softAssertion.assertTrue(infra.isDisplayed(), "Oh No, infra is not Displayed");
		softAssertion.assertTrue(video.isDisplayed(), "Oh No, video is not Displayed");
		softAssertion.assertTrue(about.isDisplayed(), "Oh No, about is not Displayed");
		softAssertion.assertFalse(blog.isDisplayed(), "Oh No, blog is not Displayed");         // Changed to assertFalse
		softAssertion.assertTrue(contacts.isDisplayed(), "Oh No, contacts is not Displayed");
		
		softAssertion.assertAll();	
	}
	
	@AfterClass
	public static void close()
	{
		driver.quit();
	}
}

 

במקרה זה, ה-output של הריצה יראה כך:

השאר הערה\הודעה