Тестирование верстки
В общем то идея далеко не новая,как быстро и автоматизированно следить за тем,чтобы при новом билде не расползлась верстка в разных браузерах.
Браузеров много,проект большой,мануальные тестировщики все не успеют.
Попробуем автоматизировать.
Для этого подойдет Selenium WD(т.к. у него поддержка кучи браузеров и снятие скриншотов,то которое нам нужно) и всего навсего средства Java чтобы следить за соответствием скринов.
Не буду говорить, как именно нужно снимать и проверять скриншоты,но мне кажется удобно или сделать пачку "эталонных скринов" и новые сравнивать с ними,или лезть на боевой сервер,делать скрин оттуда,а после снимать скрин на qa-стенде.
Второй вариант дольше,но надежнее в плане не устаревани "эталонных скриншотов".
В общем хватит об этом,как это сделать?
Примерно так:
Через WD снять скрин можно так:
public void makeScreenshot(String methodName) {
try {
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("target" + File.separator + "failure_screenshots" +
File.separator + methodName+".png"));
} catch (IOException e1) {
e1.printStackTrace();
}
}
Конечно это не единственный способ для снятия скриншотов,но сойдет.
Вроде есть много java-библиотек для работы с изображениями,но стоящую и для такой не трудной задачи искать действительно тяжело.(я вроде как не нашел)
в общем можно использовать этот класс:
Попробуем что нить простое(не придираться,это для примера)
В результате:
1й скрин
2й скрин
и отличие(если вы заметили то в классе 2 варианта,один закомменитрован) так что:
и 2м способом
Вот и все.
Вроде есть много java-библиотек для работы с изображениями,но стоящую и для такой не трудной задачи искать действительно тяжело.(я вроде как не нашел)
в общем можно использовать этот класс:
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* I am gonna pass two images and I am gonna recort only the differences
* trying to catch if there is a different object or not int the scene
*
* @author maikon
*/
public class CheckingDifferentImages {
public static void checkDifference(String pathToTheFirstScreen, String pathToTheSecond, String nameDifference) {
BufferedImage im1 = null;
BufferedImage im2 = null;
try {
//loading the two pictures
//read and load the image
BufferedImage input = ImageIO.read(new File("target"+File.separator+"failure_screenshots"+File.separator+pathToTheFirstScreen));
//build an image with the same dimension of the file read
im1 =
new BufferedImage(input.getWidth(), input.getHeight(), BufferedImage.TYPE_INT_ARGB);
//object create to draw into the bufferedImage
Graphics2D g2d = im1.createGraphics();
//draw input into im
g2d.drawImage(input, 0, 0, null);
//making all again for the second image
BufferedImage input2 = ImageIO.read(new File("target"+File.separator+"failure_screenshots"+File.separator+pathToTheSecond));
//build an image with the same dimension of the file read
im2 =
new BufferedImage(input2.getWidth(), input2.getHeight(), BufferedImage.TYPE_INT_ARGB);
//object create to draw into the bufferedImage
Graphics2D g2d2 = im2.createGraphics();
//draw input into im
g2d2.drawImage(input2, 0, 0, null);
} catch (IOException ex) {
Logger.getLogger(CheckingDifferentImages.class.getName()).log(Level.SEVERE, null, ex);
}
showDifference(im1, im2, nameDifference);
}
public static void showDifference(BufferedImage im1, BufferedImage im2, String nameDifference) {
BufferedImage resultImage =
new BufferedImage(im1.getWidth(), im2.getHeight(), BufferedImage.TYPE_INT_ARGB);
double THR = 50;
int area = 0;
for (int h = 0; h < im1.getHeight(); h++) {
for (int w = 0; w < im1.getWidth(); w++) {
int red1 = 0xff & (im1.getRGB(w, h) >> 16);
int green1 = 0xff & (im1.getRGB(w, h) >> 8);
int blue1 = 0xff & im1.getRGB(w, h);
int red2 = 0xff & (im2.getRGB(w, h) >> 16);
int green2 = 0xff & (im2.getRGB(w, h) >> 8);
int blue2 = 0xff & im2.getRGB(w, h);
//euclidian distance to estimate the simil.
double dist = 0;
dist = Math.sqrt(Math.pow((double) (red1 - red2), 2.0)
+ Math.pow((double) (green1 - green2), 2.0)
+ Math.pow((double) (blue1 - blue2), 2.0));
if (dist > THR) {
resultImage.setRGB(w, h, im2.getRGB(w, h));
area++;
} else {
resultImage.setRGB(w, h, 0);
}
//2nd option
/* if (dist > THR) {
resultImage.setRGB(w, h,255);
area++;
} else {
resultImage.setRGB(w, h, im1.getRGB(w, h));
}*/
} //w
} //h
try {
File fileScreenshot = new File("target" + File.separator + "DifferenceScreens" + File.separator + nameDifference);
fileScreenshot.getParentFile().mkdirs();
ImageIO.write(resultImage, "PNG", fileScreenshot);
} catch (IOException ex) {
Logger.getLogger(CheckingDifferentImages.class.getName()).log(Level.SEVERE, null, ex);
}
}
//end functionn
}
Попробуем что нить простое(не придираться,это для примера)
@Test
public void testYandex(){
get("http://www.yandex.ru/");
makeScreenshot("1");
get("http://www.yandex.ru/");
makeScreenshot("2");
CheckingDifferentImages.checkDifference("1.png","2.png","diff.png");
}
В результате:
1й скрин
2й скрин
и отличие(если вы заметили то в классе 2 варианта,один закомменитрован) так что:
и 2м способом
Вот и все.




Комментариев нет:
Отправить комментарий