воскресенье, 31 марта 2013 г.

Thucydides. Обработка исключений.

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

 Оказалось, что Thucydides нормально перехватывает только Exception типа AssertionError. Поэтому необходимо в ключевых местах пробрасывать именно AssertionError.

Например:

public void initializeConnection() throws SQLException {

    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    } catch (ClassNotFoundException e) {
        throw e;
    }
    String dbHost = null;
    try {
        dbHost = getCurrentDBConnectionUrl(DatabaseConst.TEST_SERVER, DatabaseConst.DB_NAME);
  
        connection = DriverManager.getConnection(dbHost, DatabaseConst.USER, DatabaseConst.PASS);
        query = connection.createStatement();
    } catch (SQLException e) {
        throw new SQLException("Cannot connect to Database " + dbHost);
    }
}

public String getSomeResults() throws Throwable{
    try{
        initializeConnection();
        //...queries
    catch(Throwable cause) {
        throw new AssertionError("Exeception while getting some results", cause); 
    }

В результате видим следующий стек-трейс:


java.lang.AssertionError: Exeception while getting some results
    at mypackage.Database.getSomeResults(Database.java:219)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at net.thucydides.junit.runners.ThucydidesStatement.evaluate(ThucydidesStatement.java:21)
...
Caused by: java.sql.SQLException: Cannot connect to Database jdbc:sqlserver://MyDatabaseIP:1433;databaseName=MyDataBase
    at mypackage.Database.initializeConnection(Database.java:55)
...

Thicydides. Несколько замечаний по аннотациям @DefaultUrl, @At

В блоге internetka.in.ua довольно подробно расписано об открытии, получении экземпляров страниц, но есть несколько моментов которые хотелось бы уточнить:

1. Аннотации @At и @DefaultUrl не взаимозаменяемы. Нельзя открыть страницу, не указав аннотацию @DefaultUrl
2. Аннотация @At не смотрит на то, что записано в свойство webdriver.base.url. Т.е. в качестве параметра должен быть указан либо полный путь к странице, либо #Host.
3. #Host должен соответствовать паттерну "https:/?://[^/]+"

Например,
webdriver.base.url = http://192.168.100.100:8080/www

@DefaultUrl("/login")
@At("#HOST/www/login")
public class AuthPage extends PageObject{
...
}

Thucydides. Временный фикс проблемы с кодировкой

Пару слов о фиксе


В Thucydides существует давняя проблема с кириллическими символами в отчетах.
http://java.net/jira/browse/THUCYDIDES-52

Возможное решение проблемы было подсказано уже в описании -> удалить тег
<meta charset="utf8"/> 
во всех файлах с отчетом.

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

Программа запускается следующим образом:
1. Указать программе каталог с отчетом:
C:\deleteTag.exe С:\Project\MyThucydidesProject\target\site\thucydides
2. Из каталога со сгенерированным отчетом (в данном случае никаких путей прописывать не надо).

Обработка файлов с отчетом Thucydides в TeamCity


Для того, чтобы заставить TeamCity запустить эту программу для сгенерированных отчетов. необходимо проделать следующее:

1. Добавить еще один шаг - PowerShell Script.

 2. В опции Script Source указать: 
c:\deleteTag.exe "%teamcity.build.workingDir%/target/site/thucydides"

Теперь при просмотре отчета видим, что вернулись родные кириллические символы :-)

четверг, 10 января 2013 г.

Userscript. Попытка убрать рекламу из radikal.ru

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

Решил попытаться написать скрипт удаляющий всю рекламу со страницы, заодно и улучшить свои знания JavaScript :). Сначала казалось все просто: пройтись по идентификаторам и поудалять ноды из дерева... Но, скрипт greasemokey срабатывает только после срабатывания эвента DOMContentLoaded, т.е. все странички и скрипты загрузились, выполнились и потом начинается процесс зачистки страницы.

Сразу же возник вопрос, а можно ли поудалять элементы до полной загрузки страницы. оказалось, что можно! Для этого необходимо добавить @run-at document-start в начало скрипта и далее отслеживать эвенты происходящие на странице.

Минус данной технологии в том, что userscript не всегда успевает сработать, до выполнения рекламного скрипта на обрабатываемой странице (изменения на странице) данный эффект, насколько я понял, называется flicker.

Установить получившееся творение можно отсюда: http://userscripts.org/scripts/show/156200

воскресенье, 23 декабря 2012 г.

Кастомизация TestLink. Добавление hot-key.

  Основной недостаток TestLink - малая приспособленность к быстрому вводу большого количества информации тестов,  и их выполнению.

  Взять к примеру выполнение тестов: для сохранения статуса теста необходимо попасть мышкой на мелкий кругляшок radio-button'a потом, нажать на одну из кнопок сохранить. В общем рутина, на которую при большой количестве тестов тратится довольно много полезного времени. Поэтому я и занялся добавлением на страницы TestLink горячих клавиш.

  Есть 2 способа осуществить задуманное: userscript (плагины GreaseMonkey для FF и TamperMonkey для Chrome) или прямая интеграция скриптов в php-код TestLink. Второй способ плох тем, что при обновлении версии TestLink необходимо будет обновлять некоторые файлы вручную, поэтому тут его не публикую.

  На userscripts.org выложен скрипт, позволяющий создавать, сохранять тест-кейсы, а также проводить быстрый выбор статуса при запуске тестов.

  Скрипт, с кратким описанием, выложен здесь


среда, 5 декабря 2012 г.

SoapUI, JDBC. Подключаемся к БД один раз на проект/тест-кейс/тест-сьют

В бесплатной версии SoapUI, к сожалению, отсутствует явный JDBC connection, поэтому пришлось потанцевать с бубном дабы подружить soapUI c базой данных.
Конечно, простое подключение, когда для каждого шага создается новое подключение к БД реализуется легко и этот способ вполне себе описан в документации.

import groovy.sql.Sql
com.eviware.soapui.support.GroovyUtils.registerJdbcDriver("com.microsoft.sqlserver.jdbc.SQLServerDriver")
def dbUrl='jdbc:sqlserver://<DBIp>\\<DBInstance>;databaseName=<DBName>'
def sql = Sql.newInstance(dbUrl,'user','pass', 'com.microsoft.sqlserver.jdbc.SQLServerDriver')
def row = sql.firstRow("select count(*) cnt from Table")log.info row.cnt

Но делать это в каждом шаге абсолютно не хотелось. Поэтому решил найти выход из данной ситуации. И таки нашел!

Генерация рандомной строки

Первый способ:
int  length = 9
String randomString = org.apache.commons.lang.RandomStringUtils.random(length, true, true)

Второй способ
def length = 9;
String validChars ="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
def rnd = new Random()
log.info ( (1..length).sum{ 
validChars[ rnd.nextInt(validChars.length()) ]