пятница, 4 июня 2010 г.

Создание скриншотов в случае нахождения тестами ошибок

С недавних пор пишу тесты на java для связки JUnit + Selenium RC.

В какой-то момент появилась идея заносить отчёты в систему отслеживания ошибок прямо из тестов... но прикинув пока решил, что очень громоздко получается :)


И вот во время прикидывания наткнулся на интересный кусочек кода, создающий скриншоты и сохраняющий их в файлы...
void recordStep(String name) throws AWTException {
    File screenshot = new File(new File("."), name + ".png");
    Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
    BufferedImage image = new Robot().createScreenCapture(new Rectangle(0, 0, screenDim.width, screenDim.height));
    try {
        ImageIO.write(image, "png", screenshot);
    } catch (IOException ignore) {
        ignore.printStackTrace();
    }
}
Объяснять как работает этот метод не буду, т.к. во-первых, многие и сами понимают, а во-вторых, это сделали лучше меня там, где я этот код нашёл:
Здесь все очень просто. В качестве параметра мы передаем имя файла для скриншота.
Потом:
-объявляем файл, в качестве директории я использую здесь текущую( можно сделать в качестве параметра).
-получаем размеры скриншота.
-в BufferedImage помещаем скриншот, сделанный с помощью возможностей класса Robot.
- и наконец - создаем(помещаем) наш скриншот в сам png-файл.
И вот такое чудо получается:
import com.thoughtworks.selenium.*;
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import javax.imageio.ImageIO;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
 *
 * @author makeenkov
 */
public class bnwintop extends SeleneseTestCase {
    String time = new SimpleDateFormat("dd.MM.yyyy HH.mm.SS").format(new java.util.Date());
    void recordStep(String name) throws AWTException {
        File screenshot = new File(new File("."), name + ".png");
        Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
        BufferedImage image = new Robot().createScreenCapture(new Rectangle(0, 0, screenDim.width, screenDim.height));
        try {
            ImageIO.write(image, "png", screenshot);
        } catch (IOException ignore) {
        ignore.printStackTrace();
        }
    }
    @Override
    public void setUp() {
        selenium = new DefaultSelenium("localhost", 4444, "*opera", "http://www.google.com");
        selenium.start();
    }
    public void test() throws Exception {
        System.out.println("Итак начнём: " + time);
        selenium.open("/");
        selenium.waitForPageToLoad("30000");
        selenium.type("q", "black and white");
        selenium.click("btnG");
        selenium.waitForPageToLoad("30000");
        if (selenium.isTextPresent("Расходные материалы для лазерных принтеров") && selenium.isTextPresent("blacknwhite.ru") && selenium.isTextPresent("Картриджи по оптовым ценам: 589-49-04 Расходные материалы для лазерных принтеров.")) {
            System.out.println("Сайт в индексе в топ-5");
        } else {
            System.out.println("Сайт выпал из индекса или из топ-5");
            selenium.windowFocus();             //Gives focus to the currently selected window
            selenium.windowMaximize();           //Resize currently selected window to take up the entire screen
            recordStep("индекс_топ-5_" + time);
        }
        selenium.close();
        selenium.stop();
        System.out.println("Конец: " + new SimpleDateFormat("dd.MM.yyyy HH.mm.SS").format(new java.util.Date()));
    }
    public static Test EnterGoogle() {
        return (Test) new TestSuite(bnwintop.class);
    }
    public static void main(String args[]) {
        junit.textui.TestRunner.run(EnterGoogle());
    }
}
Этот тест контролирует нахождение сайта в топ-5 googl'а и в случае ошибки делает скриншот с участниками топ-5, собственно вот, файл индекс_топ-5_05.06.2010 16.50.155.png


Может быть не всегда применимо, но мне нравится :) постараюсь развить идею с автоматическим занесением отчётов, тогда и отпишусь....

2 комментария:

  1. Отлично! Спасибо за информацию.
    идея заносить отчёты в систему отслеживания ошибок прямо из тестов – это просто супер – я надеюсь Вам удастся её развить и Вы обязательно ей поделитесь :-) ... автоматизация – это наше ВСЁ.
    Удачи!

    ОтветитьУдалить
  2. Спасибо!
    Обязательно отпишусь о результатах :)

    ОтветитьУдалить