вторник, 2 ноября 2021 г.

Первый TestOps Hackaton от PropellerAds и Qameta Software

Мы в PropellerAds, совместно с ребятами из Qameta Software, а так же при идейном участии известного многим Андрея Солнцева, решили провести первый TestOps-хакатон!

Суть хакатона — за пять дней запилить инструмент для тестирования на Java: плагин для любимой IDE, расширение или интеграцию для тестового фреймворка, новую штуку, которая сделает жизнь лучше!

Хакатон рассчитан на SDET и автоматизаторов, у которых руки чешутся что-то свое написать, но все руки не доходили:) Да и вообще для неравнодушных к автоматизации тестирования!

Даты: 12-16 ноября.

Больше деталей здесь - https://propellerads-testops-hackathon.eventbrite.com

Регистрируйся быстрее - количество мест - ограничено!

Крутые призы, подарки всем участникам - всё это и многое другое ждет вас!

среда, 29 ноября 2017 г.

Что интересного в питерском мире тестирования?


Немного уйду от своего обычного формата технических статей, и расскажу, что же в последнее время происходит в уютном и дружном мире тестирования и его автоматизации в нашем прекрасном городе Санкт-Петербурге.

Совсем недавно мы в компании AdServer провели, на мой взгляд, очень крутой митап. Мы собрали кажется лучшее, что можно было собрать. Артём Ерошенко, Ваня Крутов, Андрей Солнцев - эти имена не нужно представлять никому, кто вертится в мире автотестов и около него. Среди таких гигантов не затесался и наш родной Андрей Африканов - человек, с которым мы рука об руку строили и строим процесс автоматизации тестирования в компании.

Мы узнали множество нового про метрики тестирования и Graphana, селениум кластеры и selenoid, как подобрать удобный стек технологий для автотестов, ну и наконец, какие секреты и фишки есть в selenide и что такое хорошо и что такое плохо в процессе разработки и тестирования.

Более подробное описание я сделал тут
Сказать, что это было круто - это ничего не сказать. Лично у меня после митапа от мыслей о том, что можно было было сделать еще у нас в AdServer просто разрывало голову. Кажется я столько задач на новые фичи в автоматизации за столь короткое время еще не заводил :)

Разумеется, в скором времени мы организуем еще митап(и не один), на котором постараемся собрать не менее интересные доклады и выступающих!

Хотелось бы отметить, что наш зажигательный QA Head Вася Петухов уже завтра планирует выступить на одном интересном событии и рассказать много интересных вещей! Там будет и про то, как строить команду, и про некоторые технические аспекты в процессе тестирования, ну и вообще - доклады Васи это всегда весело и при этом познавательно. Приходите, думаю никто не пожалеет о проведенном времени!

Ну а от себя - ждите новых постов :)

среда, 13 апреля 2016 г.

Selenium + Browser proxy : куда уходят запросы?

Всем привет.
Не так давно в работе мне пришла задачка - нужно было смотреть, сколько определенных запросов уходит при открытии страницы и при некоторых действиях на ней. Как же сделать? Первое, что приходит на ум - прокси. Browser Proxy - библиотека, которая уже давно живет где-то по соседству с selenium, да вот только с недавних пор она притерпела небольшую "пластику" и теперь с ней нужно общаться немного по другому. Как именно - я сейчас расскажу и покажу. asdf


Итак. Для начала - ссылочка на гитхаб с библиотекой - https://github.com/lightbody/browsermob-proxy
Там в readme уже есть неплохое описание, какие-то основные вещи можно понять и оттуда. Но я всё же расскажу еще раз в разрезе решаемой задачи.

Первое, что мы делаем - правильно - подключаем библиотечку к нашему проекту с помощью любимого maven:

<dependency>
    <groupId>net.lightbody.bmp</groupId>
    <artifactId>browsermob-core-littleproxy</artifactId>
    <version>2.1.0-beta-5</version>
</dependency>


И собственно пишем код для работы с прокси:

public class BrowserProxy {
    private BrowserMobProxy proxyServer;
    private boolean isServerStarted;

    public void startServer(DesiredCapabilities capabilities) {
        proxyServer = new BrowserMobProxyServer(0);
        try {
            proxyServer.start();
            isServerStarted = true;
        } catch (Exception e) {
            throw new RuntimeException("Can't start proxy-server on port: " + proxyServer.getPort(), e);
        }

        Proxy proxy = null;
        try {
            proxy = createHttpProxy(proxyServer.getPort());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        createNewHar();
        capabilities.setCapability(CapabilityType.PROXY, proxy);
    }

    private Proxy createHttpProxy(int port) throws UnknownHostException {
        Proxy proxy = new Proxy();
        proxy.setProxyType(Proxy.ProxyType.MANUAL);
        String proxyStr = String.format("%s:%d", InetAddress.getLocalHost().getCanonicalHostName(),  port);
        proxy.setHttpProxy(proxyStr);
        proxy.setSslProxy(proxyStr);
        return proxy;
    }

    public void createNewHar(){
        proxyServer.newHar();
    }

    public void stopServer() {
        if (isServerStarted) {
            try {
                proxyServer.stop();
            } catch (Exception e) {
                throw new RuntimeException("Can't stop proxy server", e);
            }

        }
    }


    public int getCallsCountByContainsKey(String key, boolean clearHistory) {
        int result = 0;
        Har har = proxyServer.getHar();
        if (har != null) {
            HarLog harLog = har.getLog();
            List<HarEntry> entries = harLog.getEntries();
            for (HarEntry entry : entries) {
                if (entry.getRequest().getUrl().contains(key)) {
                    result++;
                }

            }

        } else {
            return -1;
        }
        if(clearHistory) {
            createNewHar();
        }
        return result;
    }

    public Har getHar() {
        return proxyServer.getHar();
    }
}

Ну и теперь - всё, что нам нужно - это вызвать метод getCallsCountByContainsKey с желаемым урлом, который нам нужен. Второй параметр - clearHistory - нужен для того, чтобы можно было удалять по сути не нужную историю, чтоб при подсчете кол-ва вызовов не всегда проходить по огромному списку урлов.

Код, который получится у Вас в итоге:

public static void main(String[] args){
    BrowserProxy browserProxy = new BrowserProxy();
    DesiredCapabilities caps = getBrowserCapabilities(); //здесь мы в зависимости от браузера берем capabilities    browserProxy.startServer(caps);
    WebDriver webDriver = new RemoteWebDriver(caps);
    webDriver.get("http://yandex.ru");
    int callsCount = browserProxy.getCallsCountByContainsKey("coolUrl.com", false);
    assertTrue("Unexpected calls count",callsCount == 2);
    webDriver.quit();
}

Вот и всё. Проще простого!


четверг, 30 июля 2015 г.

IntelliJ Idea Selenium plugin with Selenide

Сегодня замечательный день - в IntelliJ Idea плагин для Selenium(я уже писал о нем ранее) добавлена поддержка очень интересной библиотеки - Selenide. 
Что такое selenide? Это по сути своей удобная обертка над selenium, позволяющая разрабатывать веб тесты не особенно задумываясь о таких вещах, как поднятие/закрытие браузера, ожидания и тп. 

В плагине добавлены следующие фичи:
  1. Возможность создания преднастроенного проекта для selenide, со всеми зависимостями и примерами тестов
  2. code complete для локаторов для $ методов
  3. проверка ошибок локаторов "на лету" для $ методов
  4. проверка существования элементов для $ методов

вторник, 7 апреля 2015 г.

Что за зверь, этот Selenium?

Уже достаточно давно огромную популярность и распространенность приобрела разработка автоматических тестов на веб. И правда - при этом мы проверяем поведение, по сути, как это делает пользователь - вводим значения в поля, нажимаем кнопочки, ждем контента. И практически на протяжении всего этого времени нам в нашем нелегком деле помогает Selenium (ссылка на официальный сайт) 

Что ж это за зверь такой, этот Selenium? 

понедельник, 30 марта 2015 г.

Рецепты приготовления JUnit и TestNG

В мире существует множество фреймворков, помогающих в разработке автоматических тестов на Java. Некоторые помогают во взаимодействии с браузерами, некоторые - с базами данных. Но при этом особняком стоят два "атланта" - TestNG и JUnit. Эти фреймворки предназначены для облегчения жизни рядовым разработчикам при написании автотестов. Изпользуя их, уже не нужно задумываться, а как запустить Ваши тесты? Как добавить настройки? Как объединить тесты в наборы? За Вас уже все продумали создатели этих чудесных библиотек, инструментов или фреймворков - каждый называет эти продукты как хочется.

Разумеется, и TestNG и JUnit обладают массой полезных и удобных фич, каждый по своему хорош. Уж сколько раз устраивались "холивары" по поводу того, кто же всё таки "круче"? Выбирать Вам, что для Вас удобно, что более оптимально.

В двух интересных статьях - о TestNG  и о JUnit - просто и доходчиво описаны основные и ключевые фичи того и другого продукта. Кажется, что они неплохо подойдут в качестве своеобразной методички для каждой из библиотек.

пятница, 20 марта 2015 г.

Allure - красивые и понятные отчеты к автотестам

Какими основными особенностями должны обладать хорошие автотесты? Основное - это конечно же простой, понятый, удобный для поддержки код. Без него никак. Если одно из перечисленных свойств отсутствует - уже сложно считать тесты "хорошими".

Но есть еще один пункт, о котором ни в коем случае нельзя забывать - это отчет. Если в результатах выполнения тестов может разобраться только человек, создавший их, то они никак не соответствуют определению "хорошие", не так ли?

Отчет должен быть понятным, и, что на мой взгляд важно, красивым. Так же система, с помощью которой мы работаем с этим отчетом из кода(добавление различных шагов, логов, скриншотов) должна быть по возможности как можно более простой и прозрачной.

Всеми перечисленными в предыдущем абзаце свойствами обладает allure. Основными его плюсами являются:

  1. Понятный для любого члена команды вид отчета - сразу видно разделение по функциональности, различные тестовые сьюты.
  2. Красивый и достаточно лакончиный UI, написанный с использованием последних технологий в веб разработке.
  3. Наличие поддержки различных языков программирования - Java, С#, python и библиотек - JUnit, TestNG, NUnit, PyTest.
  4. Удобное и достаточно гибкое API  - не составит сложности подключить отчеты к уже существующим тестам.
  5. Написанные плагины для различных CI инструментов.
  6. Продукт является opensource с очень дружественными разработчиками, готовыми к обсуждению и добавлению желаемой функциональности.
И это лишь малая часто того, что предоставляет нам allure.  
Внутри самого отчета так же очень хочется выделить возможность различного рода attach'ей, через которые можно расширять возможности отчета до беспредельных величин.

Более подробная инструкция о том, как же пользоваться инструментом - в нашей статье.



пятница, 13 марта 2015 г.

IntelliJ IDEA Selenium Pligin

При написании тестов на веб мы , зачастую, сталкиваемся с целом рядом проблем. В начале - это размышления о том, какую архитектуру фреймворка выбрать, как взаимодействовать с webdriver. В процессе написания кода возникают проблемы : а правильно ли написан локатор?Есть ли такой элемент на странице? 

С этими проблемами нам призван помочь разработанный недавно плагин для IntelliJ IDEA. Описание можно увидеть на сайте разработчиков. Из заявленных функций:


  1. Создание преднастроенного проекта для написания тестов. То есть в несколько кликов есть возможность создать уже рабочий проект, готовый для работы.
  2. Code complete для локаторов. Многие уже давно не могут жить без этого для обычного кода, а теперь такая возможность появилась так же и при составлении локаторов.
  3. Проверка правильности написания локаторов в коде. Ведь наверняка бывало, что из за случайно забытой одинарной кавычки в локаторе мы тратили драгоценное время, чтобы понять, где же все таки проблема?
  4. Проверка сущствования элементов на странице. Написали локатор, но не понятно, правильно ли мы это сделали? И сколько элементов может быть найдено по данному идентификатору?
  5. Возможность простой генерации полей для Page Object(те, что помечены аннотациями @FindBy). 

Набор полезных фишек неплохой, не так ли? Разработчики(в числе которых Ваш покорный слуга) плагина готовы слушать предложения и добавлять любые желанные "фишки". Сейчас продукт находится в активной фазе развития и мы верим, что в итоге должен получиться инструмент, который реально упростит жизнь разработчикам автоматических тестов на веб с использованием selenium.
Любые предложения, пожелания, комментарии ну и , разумеется, баг репорты, можно отправлять по форме обратной связи прямо на сайте.

пятница, 16 января 2015 г.

Thucydides или собственный фреймворк - что лучше?!

Совсем недавно тут мы проводили достаточно интересный опрос - А какой webdriver framework используете Вы? И правда - сейчас существует достаточно богатый выбор уже готовых решений, осталось только выбрать подходящий. Или может всё таки использовать что-то своё? 
В этой статье я постараюсь проанализировать результаты опроса, высказать свои мысли по поводу результатов и попробую на их основании ответить на следующие вопросы:
  1. Какими свойствами должен обладать фреймворк, чтобы быть на первом месте?
  2. Почему чаще всего всё же используется «самописные» библиотеки?
Начнем по порядку.
Еще раз приведу результаты, на основании которых я делал выводы:
Тут же хотелось бы немного разделить фреймворки следующим образом:
в первой группе будут - Thucydides, Html Elements и Selenide
во второй - cucumber-jvm и jbehave.
Остальное пока оставим в стороне.
Я специально разделил их, так как всё-таки первые - это строго selenium фреймворки, а вторые - это фреймворки для BDD и их можно использовать как в связке с Webdriver, так и без нее.
Итак. Почему же результаты расположились именно таким образом? Анализ хотелось бы провести так же отдельно для разных групп.

понедельник, 5 мая 2014 г.

Selenium: снятие скриншота элемента

В некоторых ситуациях при написании тестов с использованием селениума появляется желание прикрепить к отчету снимок не целого экрана, а только лишь отдельного элемента.  Разумеется, вариантов, как это сделать - огромное множество. Я , как обычно, решил сделать еще один, свой. Использую его достаточно часто при написании тестов. 
Собственно немного об моем подходе можно прочитать далее.

Алгоритм работы
Сам принцип работы до нельзя прост - берется скриншот всего экрана, далее с помощью стандартных библиотек java по определенным координатам вырезается необходимое изображение. Что с ним делать далее - каждый волен решать сам. В моем случае - я записываю его в файл.

1-ый шаг - снимаем скриншот и преобразовываем его в BufferedImage.
Здесь все достаточно просто :

...
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
....

File screenShot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
BufferedImage screenshotImage = ImageIO.read(screenShot);

....

понедельник, 11 ноября 2013 г.

Selenium - CSS или XPath?

Предисловие.
В последнее время стал замечать в разных местах - в автоматических тестах, в статьях, в обсуждениях на форумах, что люди стали очень часто использовать XPath для определения элеметов в web тестах написанных с использованием Selenium WebDriver. Единого ответа на вопрос - почему - я так и не смог получить. Лично я как-то никогда особо xpath не любил(уж не знаю почему) и при написании использовал исключительно CSS. И вот я решил разобраться и попытаться сравнить(больше для себя, а может и кому-нибудь полезно будет) эти 2 способа поиска элементов - CSS и XPath. Основными критериями для сравнения хочется взять следующие:


а)скорость - оценить, кто же быстрее ищет элементы?

б)красота и удобство написания локаторов - достаточно субъективная оценка, но все же
в)возможности и ограничения - что может один и не может другой?



Скорость.
Наверное самый интересующий показатель в данном исследовании - это скорость. Раздел будет состоять из 2-х частей:
а)как проводилась проверка - описание теста, входные данные и тп
        б)анализ результатов


Входные данные:

четверг, 17 октября 2013 г.

Jsonium - инструмент для тестирования REST запросов

Как часто в моей практике работы в IT я сталкивался с проблемой - нужно быстро попробовать послать , скажем, POST  запрос по определенному url с некоторыми параметрами в теле. 
Понятно, что существует множество инструментов для этих целей. Один из самых известных - это, наверное, Postman - плагин для chrome, позволяющий делать множество различных операций с REST. 
В данном посте хотелось бы рассказать о новом инструменте - Jsonium( ссылка на сайт ).



Что такое Jsonium?
      По сути своей - это инструмент с удобным и , что важно, очень простым интерфейсом для тестирования различных REST запросов, но со смещением в сторону популярного в наше время формата передачи данных - JSON. 

       Что хотелось бы выделить из явных плюсов:

пятница, 15 марта 2013 г.

Maven: specify folder for jars

Sometimes you need to download jars, which were in your "dependencies" block into specified directory.
For this task you may use this approach: in "plugins" part of your pom.xml add such block:


<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


This will copy all jars into target/lib folder after run command : mvn generate-sources
If you want to specify directory from command line, you can do such thing:

четверг, 7 марта 2013 г.

Роль архитектуры в автоматизации тестирования



Введение.
В последнее время всё чаще при просмотре чьих-либо автоматических тестов я начал сталкиваться с рядом проблем, связанных во многом с  изначально слабой продуманностью их архитектуры.  Стало создаваться такое впечатление, что весь процесс написания автотестов сводится к 2 шагам - получение задачи от заказчика(во многом в его роли выступает начальник отдела тестирования или какой либо project manager) и написание кода. В этой цепочке слишком часто стал упускаться один важнейший шаг, а именно - проработка архитектуры тестов. В итоге всё это приводит к тому, что при желании модифицировать или добавить что-либо в тесты - приходится , как говорил один мой хороший знакомый, “переколбашивать” много уже написанного кода. А это - время, которое в современном мире очень дорого может стоить.
В данной статье мне хотелось бы описать некоторые проблемы, которые встречаются чаще всего при написании автоматических тестов, попробовать разобраться, почему они возникают, и предложить, разумные решения для выхода из сложившихся ситуаций. Так же постараюсь описать некоторые правила , которые я понял на своём “горьком” опыте, и которые должен понять каждый специалист, занимающийся непростым занятием - автоматизацией тестирования.
Начнем, наверное, с главного, а именно - что же это за зверь, автоматизация?


среда, 20 февраля 2013 г.

SoapUI - the best ways of test projects integration.


I want to talk about some problem I encountered with while I created some tests with SoapUI tool.
The problem was - when we want to use some tests modules , which was developed by another person also with SoapUI - we often do the following:
1)Import someone's test suite to our project
2)use "Run TestCase" step for executing of test cases of someone's suite.
This is the standard way of integration of several test projects in SoapUI.
But. What will happened if this "someone" modified his test suite? Your imported test suite now doesn't work.
After that you will try to do the following:
1)get new version of "someone's" test suite and import it instead of old version.
After run of modified tests - you will get an exception, because SoapUi saved dependency to old version of "someone's" test suite and "doesn't understand" the new version of this suite.
I hope I well described the problem. Now I want to describe good(in my opinion) way to solve this problem.

First.
When you are writing your tests and you know that you will use someone's modules(in SoapUI terminology - this means - Test Suites), the better way is NOT to use "Run TestCase" from your tests. The better way is described on the image below: