Показаны сообщения с ярлыком junit. Показать все сообщения
Показаны сообщения с ярлыком junit. Показать все сообщения

суббота, 5 июня 2010 г.

Автоматическое занесение отчётов в BTS при нахождении автотестами ошибок

Немного потыкав по клавишам всё же воплотил в жизнь идею с автоматическим занесением отчётов об ошибках в багтрекинговую систему, в моём случае это mantis.

Суть идеи такова... гонятся авто-тесты в связке JUnit + Selenium RC, которые в случае нахождения ошибки автоматом создают отчёты об ошибка в багтрекере, как Вам? :)

Для реализации используем связку двух классов в одном из которых уже описанный способ создания скриншотов при прогоне тестов, а  во втором тест создающий отчёты о найденных ошибках.

Итак.... гоним первый тест
package seleniumtests;

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;

/**
 *
 * @author makeenkov
 */
public class googletest extends SeleneseTestCase {

    public static String what;
    public static String filename;
    String time = new SimpleDateFormat("dd.MM.yyyy_HH.mm.SS").format(new java.util.Date());

    void recordStep(String name) throws AWTException, IOException {
        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("0.0.0.0", 4444, "*firefox", "http://www.google.ru/");
        selenium.start();
    }

    public void test() throws Exception {
        System.out.println("Итак начнём: " + time);
        selenium.open("http://www.google.ru/");
        selenium.waitForPageToLoad("30000");
        selenium.selectWindow("Google");
        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);
            what = "Сайт выпал из индекса или из топ-5" + time;
            filename = "индекс_топ-5_" + time + ".png";
        }
        selenium.close();
        selenium.stop();
        System.out.println("Конец: " + new SimpleDateFormat("dd.MM.yyyy HH.mm.SS").format(new java.util.Date()));
    }
}
который в случае ошибки на выходе даёт нам скриншот и переменные содержащие суть ошибки.
Этот класс вызывается из второго класса
package seleniumtests;

import com.thoughtworks.selenium.*;
import junit.framework.Test;
import junit.framework.TestSuite;

/**
 *
 * @author makeenkov
 */
public class obts extends SeleneseTestCase {

//    googletest gt = new googletest();

    @Override
    public void setUp() {
        selenium = new DefaultSelenium("0.0.0.0", 4444, "*firefox", "http://www.bugtrack-online.com/");
        selenium.start();
    }
   
    public void test() throws Exception {
        System.out.println(googletest.what);
        System.out.println(googletest.filename);
        if (googletest.what == null) {
            System.out.println("Сайт в индексе в топ-5");
        } else {
            selenium.open("/login_page.php");
            selenium.waitForPageToLoad("30000");
            selenium.type("username", "йцукен");
            selenium.type("password", "123456");
            selenium.click("//input[@value='Войти в систему']");
            selenium.waitForPageToLoad("30000");
            selenium.click("link=Online Bug Tracking System");
            selenium.waitForPageToLoad("30000");
            if (selenium.isTextPresent("По всем вопросам пишем в этот отчёт...")) {
            } else {
                selenium.select("project_id", "label=Online Bug Tracking System");
                selenium.waitForPageToLoad("30000");
                selenium.click("//input[@value='Переключиться']");
                selenium.waitForPageToLoad("30000");
            }
            selenium.click("link=создать отчет");
            selenium.waitForPageToLoad("30000");
            selenium.select("category", "label=Категории 1");
            selenium.select("reproducibility", "label=всегда");
            selenium.select("severity", "label=значительная");
            selenium.type("summary", "summary="+googletest.what);
            selenium.type("description", "description="+googletest.what);
            selenium.type("file", "D:\\NetBeansProjects\\seleniumtests\\"+googletest.filename);
            selenium.click("//input[@value='Создать отчет']");
            selenium.waitForPageToLoad("30000");
        }
        selenium.close();
        selenium.stop();
    }

    public static Test googletest() {
        return (Test) new TestSuite(googletest.class);
    }

    public static Test obts2() {
        return (Test) new TestSuite(obts.class);
    }

    public static void main(String args[]) {
        junit.textui.TestRunner.run(googletest());
        junit.textui.TestRunner.run(obts2());
    }
}
который в свою очередь вытягивает переменные и скриншот, а дальше создаёт на основе полученных данных отчёт в багтрекинговой системе.

В итоге получаем вот такого вида отчёт в системе отслеживания ошибок

пятница, 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


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