בפוסט הקודם ראינו כיצד ניתן לממש את תהליך ה-Retries – ההרצה החוזרת לטסטים שנכשלו בעקבות False Alarms

המימוש בפוסט הקודם נעשה בעזרת הפריימוורק – Junit

בפוסט זה אנו נראה כיצד לבצע את אותו מנגנון עם הפריימוורק – TestNG

 

 

מקרה הבדיקה שלקחתי כאן הינו בדיוק אותו מקרה כמו בפוסט הקודם: להיכנס לאתר: http://atidcollege.co.il ולוודא כי הלוגו של עתיד האוטומציה מוצג:

 

השתמשתי פה במתודת ה-isDisplayed, זוהי דוגמא למקרה של הרצה מוצלחת של בדיקה:

assertTrue(driver.findElement(By.className("fw-site-logo")).isDisplayed());

 

זה לפי ה-inspect של האתר ממנו לקחתי את המידע:

העבודה עם מנגנון ה-Retry של TestNG יעבוד עם מחלקה אשר מממשת את הממשק של  IAnnotationTransformer והיא תראה כך:

public class AnnotationTransformer implements IAnnotationTransformer
{

    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod)
    {
        annotation.setRetryAnalyzer(Retry.class);
    }
}

 

כאן אנו מאתחלים את מנגנון ה-setRetryAnalyzer עם מחלקת ה-Retry , במחלקה זו אנו מנממש את הלוגיקה של ההרצה החוזרת, כך למשל:

public class Retry implements IRetryAnalyzer
{
    private int count = 1;
    private static int NumOfRetries = 3;

    @Override
    public boolean retry(ITestResult iTestResult)
    {
        if (!iTestResult.isSuccess())
        {                      //Check if test not succeed
            if (count < NumOfRetries)
            {                            //Check if maxtry count is reached
                count++;                                     //Increase the maxTry count by 1
                iTestResult.setStatus(ITestResult.FAILURE);  //Mark test as failed
                return true;                                 //Tells TestNG to re-run the test
            }
            else
            {
                iTestResult.setStatus(ITestResult.FAILURE);  //If maxCount reached,test marked as failed
            }
        }
        else
        {
            iTestResult.setStatus(ITestResult.SUCCESS);      //If test passes, TestNG marks it as passed
        }
        return false;
    }
}

 

במקרה שלי, החלטתי להשתמש ב-Report עם צילומי מסך, והחלטתי לחלק את התוכנית למחלקת ה-base ומחלקת TesCases, כך תראה מחלקת ה-base שלי:

public class base
{
	static WebDriver driver;
	String URL = "http://atidcollege.co.il";
	String driverPath = "D:/Projects/SeleniumDrivers/chromedriver.exe";
	String reportPath = "C:/Test/myReports/ExecutionReport.html";
	String imagePath = "C:/Test/myReports/screenshot.png";
	
	public static ExtentReports extent;
	public static ExtentTest test; 
	
	public String takeSS() throws IOException
	{
		File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);			
		FileUtils.copyFile(scrFile, new File(imagePath));
		return imagePath;	
	}
}

 

וכך תראה מחלקת ה-TestCases שלי:

public class TestCases extends base
{
	@BeforeClass
	public void setupTest()
	{
		System.setProperty("webdriver.chrome.driver", driverPath); 
		driver = new ChromeDriver(); 
		driver.manage().window().maximize();
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
		extent = new ExtentReports(reportPath);
	}

	@Test(retryAnalyzer = Retry.class)
	public void CheckMyLogo() throws IOException
	{
		try
		{	
			driver.get(URL);
			assertTrue(driver.findElement(By.className("fw-site-logoqq")).isDisplayed());
			test.log(LogStatus.PASS, "Test Passed");
		}
		catch (Exception exp)
		{				
			test.log(LogStatus.FAIL, "Test Failed: " + exp.getMessage() + test.addScreenCapture(takeSS()));
			fail("Test Failed, See Error in Report");
		}
		catch (AssertionError asr)
		{
			test.log(LogStatus.FAIL, "Test Assertion Failed: "+ asr.getMessage() + test.addScreenCapture(takeSS()));
			fail("Test Failed, See Error in Report");
		}
	}
	
	@AfterMethod
	public void closeTest()
	{
		extent.endTest(test);
	}
	
	@AfterClass
	public void close() 
	{
		extent.flush();
		extent.close();
		driver.quit();
	}
}

 

זוהי דוגמא לכך שהתוכנית תעבור ללא בעיות.

אך במידה ואשנה את ערך זיהוי התמונה ל-Kuku כך למשל:

assertTrue(driver.findElement(By.className("Kuku")).isDisplayed());

 

מה שיקרה בפועל כשאריץ את התוכנית, זה שהתוכנית תיכנס לאתר, תנסה למצוא את התמונה ותיכשל, היא תבצע את פעולת הכניסה לאתר ווידוא הצגת התמונה 3 פעמים, כי זהו הפרמטר שהגדרתי לו תחת :

int NumOfRetries = 3

ניתן לראות את ההרצות ב-Tab של TestNG:

 

כך אני רואה בוודאות כי הטסט שלי רץ 3 פעמים לפני שהוא הודיע על כישלון כללי ומעבר לטסט הבא.

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