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

Специфика использования open-source проектов

  Как принято считать, стоимость исправления дефектов в ПО тем ниже, чем раньше стадия, на которой этот дефект был выявлен.Эта теорема не раз доказана практикой тысяч конкретных программных проектов. Тестирование идей и требований пока еще звучит как экзотика. Но стимуляция разработчиков к более тщательному выходному контролю кода уже стала нормой. Программисты клепают unit-тесты ( и теперь уже кто-то даже до написания логики ), многие обзаводятся своими собственными тестовыми стендами, и даже прогоняют на них основные по их мнению варианты. Этому нельзя ни радоваться и это нельзя не приветствовать. Но мышление разработчика остается мышлением разработчика. О многих вариантах использования, вариациях входных данных ему думать не досуг. И это правильно. Там, где за разработчиками стоят грамотные тестировщики, можно не беспокоиться - они позаботятся о проверке всех нужных вариантов, в том числе и довольно редких, но все-таки нужных.
  Но не все программные проекты подвергаются экзекуции тестировщиками, не все проекты проходят стадию "тестирования" перед выпуском в свет.. Особенно это касается многих open-source решений. Среди них много таких, которые кроме unit-тестирования никакого более тестирования не проходят. Баги ловят реальные пользователи, кто-то постит их в открытые багтреккеры и, если проект продолжает поддерживаться, он постепенно становится лучше. Бывает так, что баг висит годами без фиксов и пользователям этого открытого софта, библиотеки приходится патчить самим. Все бы ничего, схема работает. Да здравствует open source и GPL в руки! Но когда речь идет о создании коммерческого софта с использованием открытых библиотек, то не все удосуживаются анализировать используемый сторонний (3rd party) софт на наличие ошибок. Вот и вылезают потом неожиданности в виде багов, которые непонятно кому исправлять - то ли ждать фиксов от авторов сторонней софтины, то ли самим патчить. Если самим , то как это сделать так, чтобы не сломать - а для этого надо разобораться с внутренней архитектурой стороннего решения...
   В общем, не так гладко может все сложиться. А ведь даже поверхностный анализ баг-треккера той или ной открытой либы может помочь понять , стоит ее использовать в коммерческой разработке или нет.

  • Покрыта ли библиотека unit-тестами, если да , то на сколько ? 
  • Проходят ли unit-тесты в окружении, в котором планируется использовать будущий коммерческий софт? 
  • Даже если внешне все гладко, то не стоит ли поручить тестировщикам помучать с помошью заглушек эту библиотеку и дать свою экспертную оценку о ее качестве?  
Ответ на последний вопрос, конечно же, не может быть однозначным - все решается на месте в данных конкретных условиях.

  Одно ясно точно - использовать open-source разработки в коммерческих проектах надо обязательно ( чтобы не изобретать велосипедов) , но чтобы потом не переписывать половину кода, из-за того, что "либа оказалась Г..", все сторонние решения надо тщательно анализировать.

вторник, 11 декабря 2012 г.

+27 к жизни


Помните песню Сюткина "ежедневно 42 минуты под землей", где он складывал в года время, потраченное на езду в метро?

Песня - песней, а для многих жителей мегаполиса и окружающих его окраин - это большая проблема... Например, я до недавнего времени тратил час - полтора на дорогу только в одну сторону. Было много причин, для того, чтобы мириться с этим положением дел. Было много компромиссов в виде аудиокниг (если в машине), читалок с полезным контентом (если на общ.тренспорте), прослушанных курсов английского и так далее...
Но простая арифметика показывала , что в год набегало что-то около 27 дней только на стояние в пробках, у которых пока не видно тенденции к уменьшению.. И когда я просто физически перестал успевать делать многие важные вещи, когда терпение лопнуло и здравый смысл перевесил все эмоции, то я перебрался поближе к основному месту работы. Какая красота - 15 минут от двери до двери!
Теперь в моем распоряжении совсем не лишних ~27 дней в году, которые можно как минимум потратить на хороший отдых )

Вот такой вот тайм-менеджмент...

вторник, 13 ноября 2012 г.

Загружаем большие объемы данных в oracle

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

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

Каждая реляционная субд имеет свои механизмы дампа, заливки, импорта , экспорта... Даже простецкий sqlite имеет свой  .dump.

Я бы хотел поделиться некоторыми аспектами создания больших объемов тестовых данных в субд Oracle.

Существует несколько вариантов:

Самый неудачный вариант - с наскока написать скрипт, который бы генерировал данные с помощью обычного DML. Подобное решение будет работать долго и потреблять слишком много ресурсов субд, связанных с ведением redo-логов, распуханием сегмента отката, фиксацией изменений (commit).

Другой вариант - использовать штатные оракловые утилиты бекапа и восстановления : imp , exp , которые очень шустро работают. Но этот вариант применим в ситуации, когда у вас уже имеется эталонная схема с нужным количеством данных - вы просто экспортируете (в бинарный файл) из нее все или часть данных и импортируете в нужную схему из полученного бинарного дампа. Например, таким образом, можно слить данные с боевой БД заказчика, разумеется, если он дает на это добро. К тому же использовать этот метод рекомендуется для работы с БД до 50 - 60 GB.

Ну и наиболее подходящий вариант - использование SQL*Loader.
Метод относительно быстр , гибок в настройке хоть и имеет свои особенности. Загрузка осуществляется оракловой утилитой sqlldr.
Ей на вход необходимо передать обязательно: управляющий файл и файл с данными, и необязательно  - файл пераметров.

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

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

Файл с параметрами - текстовый файл , в котором указываются параметры командной строки. Например sqlldr PARFILE=parameters.par 

Что же делает imp , sqlldr быстрыми? В первую очередь то, что они умеют использовать такую возможность Oracle, как метод "прямой вставки".

Прямая вставка - это почти тот же insert, который быстрее обычного за счет того , что при его использовании не тратится время на коммиты, redo-логи, большинство ограничений (кроме unique, primary key и not null) и insert-триггеры.
Чтобы sqlldr использовал метод прямой вставки, ему необходимо передать в командной строке или файле параметров опцию DIRECT=Y.
Кроме того, прямую вставку можно еще и распараллелить.
К слову, такой метод вставки можно использовать и самостоятельно.

Вот пример параллельного (в  2 процесса)  и нежурналируемого копирования данных из одной таблицы в другую.

ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+parallel(new_users,2)*/ INTO users NOLOGGING
SELECT * FROM old_users

Наибольший выигрыш от распараллеливания  загрузки достигается на тех серверах, где более одного CPU.

Ну и напоследок несколько советов о том, как сделать процесс загрузки более оптимальным:

1. подготовьте место да диске, где будут лежать dbf-ы новой базы, достаточное для будущего объема данных (посмотрите сколько занимают dbf-ы старой =)
2. отключите индексы в таблицах , которые собираетесь заполнять
3. используйте прямую и по возможности параллельную вставку
4. отключите архиватор, если включен (напарывался на ситуацию, когда архиватор отжирал место почти равное тому, что занимала новая база - это совершенно ненужное при генерации тестовых данных архивирование!):

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE NOARCHIVELOG;
ALTER DATABASE OPEN;

Если же архиватор все таки не был отключен и отожрал место на диске архивными dbf-ами, то их можно легко удалить.
Для этого в папке с архивными dbf-ами удалить все ненужные архивы и после этого с помощью rman избавиться от соответствующих записей в БД:

rman target sys@dbsid
crosscheck archivelog all;
delete noprompt expired archivelog all;


Хорошую подборка проверенных советов по оптимизации именно SQL*Loader можно найти здесь

На полноту охвата темы не претендую, но , надеюсь, у того кто с описанными вкратце механизмами не знаком , появится вектор, куда копать в случае необходимости :)

четверг, 1 ноября 2012 г.

Практичный WWW::Mechanize

Так сложилось, что мне частенько приходится пользоваться различными виртуальными хостингами.
С недавнего времени среди тех, которыми я часто пользуюсь появился такой хостер, который разрешает подключаться к серверу по SSH только с одного IP.
При этом , конечно же, позволяет указывать разрешенный IP в хостинг-панели.
В целом, штука конечно-же, секьюрная , но немного неудобная.
Теперь мы все стали мобильные, наши IP-ы часто меняются - дома один, в дороге или кафе - другой,  в офисе - третий.
Один раз залезешь - переключишь, другой, а на третий уже автоматизируешь.
Так поступил и я... В голове сразу мелькнули мысли от трех вариантах - Selenium, Jmeter и гипотетический perl-скрипт с использованием WWW::Mechanize.

По ряду причин решил использовать второй третий вариант...

Для этого нужно:

  1. perl  c установленным WWW::Mechanize, а лучше и Test::WWW::Mechanize
  2. Firefox с включенным плагином MozRepl ( ТОЛЬКО ЕСЛИ ЗАХОТИТЕ СНИМАТЬ СКРИНШОТЫ!)
  3. Пара минут времени

#!/usr/bin/perl -w use utf8;
 use Test::More "no_plan"; 
 use Test::WWW::Mechanize; 
 use constant URL => 'нужный урл'; 
 use constant LOGIN =>; 'логин к админ панели'; 
 use constant PASSWORD =>; 'пароль к админ панели'; 

 my $m = Test::WWW::Mechanize->new(autolint=>0); 
 $m->get_ok( URL , 'Open login page'); 
 $m->content_contains( 'Контрольная панель' , 'Check we are on right page'); 
 $m->submit_form_ok({ 
    form_number =>; 1, 
    fields => { 
      login => LOGIN, 
      password => PASSWORD, 
    }, 
 } , 'Submit login form' ); 
 $m->follow_link_ok( { 
        text_regex => qr/Настройки SSH/i 
     } , 'Follow ssh settings link'); 
 $m->content_contains( 'Настройки SSH' , "Check we are on right page"); 
 $m-$gt;follow_link_ok( {id =>; 'user-ip' }, "Allow current ip"); 
 my $link =$m->find_link( id => 'user-ip' ); ok($link, 'Get current ip from page'); 
 $m->submit_form_ok({ form_number => 1, fields => { ip => $link->text, }, } , 'Submit ip changing form' );


В скрипте используется Test::WWW::Mechanize - обертка над WWW::Mechanize  , которая используется в написании автотестов, что делает этот скрипт по сути автотестом с наглядным логированием в консоль:

$ ./ssh_switcher 
ok 1 - Open login page 
ok 2 - Check we are on right page 
ok 3 - Submit login form 
ok 4 - Follow ssh settings link 
ok 5 - Check we are on right page 
ok 6 - Allow current ip 

ok 7 - Get current ip from page
ok 8 - Submit ip changing form
1..8

Ну и этот "тест" потестить тоже надо бы.. Убеждаемся, что до запуска ssh-соединение не устанавливаетса, а после запуска - проблем нет.


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

Разумеется, это  подходит только для данного конкретного хостера и его алгоритма смены разрешенного ip ) И, конечно же, хостер может изменить названия переменных, ссылок, вообще поменять логику - это не проблема, скорректировать скрипт дело пары минут :)

Не а ежели хостер навесит капчу, то будет очень интересно решить эту задачу, тем более, что кое-какие наработки где-то в дебрях харда валялись )

p.s. в целом WWW::Mechanize очень даже применим для автоматизации сценариев , а его обертка Test::WWW::Mechanize - даже для создания функциональных автотестов.

вторник, 16 октября 2012 г.

Монтируем yandex disk

Яндекс недавно запустил наш отечественный аналог dropbox-а - "Yandex disk", который позволяет получить как минимум 10гб бесплатного облачного хранилища файлов.

Одним из преимуществ использования этого "еще одного облачного хранилища" в том, что его можно примонтировать с помощью davfs2 (WebDAV Linux File System) ( как локальный диск без особых трудностей. Разумеется , речь идет о linux.
Перед началом опыта надо , разумеется, зарегистрировать (если еще такого нет) аккаунт у "Яндекса".

Пример для debian или debian-подобного дистрибутива:

$ mkdir /home/linuxuser/yandex #создаем у себя в хомяке директорию для содержимого "диска" 
$ sudo apt-get install davfs2 

$ sudo mount -t davfs https://webdav.yandex.ru /home/linuxuser/yandex/

Будет запрос ввода логина и пароля к учетной записи на "яндексе" - вводим )
Чтобы избежать ввода при каждом монтировании можно добавить данные учетной записи в /etc/davfs2/secrets

 $ sudo /vim/etc/davfs2/secrets #в конец файла добавляем строку https://webdav.yandex.ru "логин" "пароль", подставляя свой логин и пароль

Проверяем содержимое директории с диском  

$ ls -l /home/linuxuser/yandex 

drwx------ 2 root root 0 Окт 16 08:16 lost+found 
-rw-r--r-- 1 root root 455833 Окт 4 18:44 Добро Пожаловать.pdf 
drwxr-xr-x 2 root root 0 Окт 4 18:44 Документы 
drwxr-xr-x 2 root root 0 Окт 4 18:44 Музыка 
-rw-r--r-- 1 root root 937311 Окт 4 18:44 Обои для рабочего стола.jpg 

Это дефолтное содержимое Как видим все от рута.
Чтобы дать возможность пользователю linuxuser пользоваться всеми благами примонтированного "диска" делаем следующее:  

$ sudo vim /etc/fstab

Прописываем строку:  

https://webdav.yandex.ru /home/linuxuser/yandex davfs uid=linuxuser,file_mode=640,dir_mode=755,user,noauto 0 0 

Затем добавляем пользователя в группу davfs2, которая была создана автоматически при установке davfs2 и добавляем права на запуск mount.davfs  

$ sudo usermod -a -G davfs2 linuxuser $ sudo chmod 4755 /usr/sbin/mount.davfs

Теперь проверяем , что все ок от имени пользователя  

$ umount /home/linuxuser/yandex 
$ mount /home/linuxuser/yandex 
$ ls -l /home/linuxuser/yandex 

drwx------ 2 linuxuser linuxuser 0 Окт 16 08:25 lost+found 
-rw-r----- 1 linuxuser linuxuser 455833 Окт 4 18:44 Добро Пожаловать.pdf 
drwxr-xr-x 2 linuxuser linuxuser 0 Окт 4 18:44 Документы 
drwxr-xr-x 2 linuxuser linuxuser 0 Окт 4 18:44 Музыка 
-rw-r----- 1 linuxuser linuxuser 937311 Окт 4 18:44 Обои для рабочего стола.jpg 

Удачного и полезного использования )

Ссылки:
WebDAV file system project
Yandex Disk

понедельник, 15 октября 2012 г.

blogger.com обнулена статистика просмотров ?

Сегодня с удивлением обнаружил обнуление статистики просмотра страниц блога у blogger.com.
Проблема , видимо, касается если не всех blogger.com-пользователей, то многих (первая реакция blogger.com).
Не смертельно, конечно, но неприятно.
Надеюсь, починят.


среда, 3 октября 2012 г.

Когда теория расходится с практикой

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

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

yandex.browser - первое впечателение о новом игроке

Кто не слышал и не в курсе - вчера вышла в массы первая версия браузера от Yandex. Все логично. Поисковик развивается динамично. Под рукой куча открытых технологий, из которых при желании и наличии средств можно попытаться сделать успешный продукт. По первому впечатлению - броузер мало чем отличается от Chromium, на основе которого он, собственно , и был собран. Изменения чисто косметические и затронули в основном верхнюю панель и строку адреса - так называемую "умную строку". "НАстройки", "Инструменты разработчика" - это все 1 в 1 как в Chromium. Что, вообще-то , не плохо) "Умную строку" я пока назвал бы "раздражающей строкой" - при клике на нее выскакивает здоровенная панель с кнопками , ведущими на различные Я-сервисы... Это дело , правда, отключается в "Настройках". В целом от браузера жтать чего-то сверхнового пока рано: как в хорошем смысле (новая функциональность) так и в плохом (новые баги). Новые фишки , надеюсь, скоро появятся. Новые баги, надеюсь, тоже =) А пока в помощь исследователям Яндекс честно приводит список стороннего софта, использованного в разработке. Из основного: js-движок "V8", парсер XML - expat, утечки искали Valgrind-ом и еще много другого... Жаль вот только версии стороннего софта не указываются :) Посмотреть на все это можно , набрав "chrome://Credits" в "умной строке". Пожелаю удачи новому броузеру - я за разнообразие !) p.s. отдельное спасибо за любезную landing-страницу для linux-пользователей. Будем ждать первых версий и для этой ОС.

среда, 26 сентября 2012 г.

Логи и безопасность - практика показывает

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

понедельник, 24 сентября 2012 г.

Игры со временем продолжаются

Только-только утихли споры по поводу перехода на постоянное летнее время, даже самые ленивые админы уже обновили tz-либы на своих серверах . И вот-те на. Опять , по-видимому, грядет переход - теперь на "постоянное зимнее". Понятно, что кому-то хочется удовлетворить свой законотворческий зуд, кому-то хочется набрать очков в глазах избирателей, которым пришелся не по нраву прошлый перевод, а кому-то хочется опять хоть как-то войти в историю (на худой конец вляпаться). Ну а нам опять, судя по всему, пере-привыкать, пере-проверять и пере-накладывать патчи. А принимая во внимание хоть и туманную но перспективу Медведа вернуться в Кремль через ННое количество лет, старые патчи предлагаю далеко не убирать - вдруг опять на летнее ? :)

пятница, 14 сентября 2012 г.

mercurial: +100 к гибкости

Недавно обнаружил замечательное расширение для hg : crecord.
Оно позволяет делать построчные коммиты - то есть, выбирать конкретные строки, которые включить в очередной коммит.
Допустим у вас есть измененный файл и в стандартный diff попадают изменения , сделанные в рамках двух разных доработок. Изменения по одной из доработок вы хотите закоммитить,  а изменения по другой - пока не хотите. В этом случае как раз и поможет данное расширение..

Установка и подключение предельно просты:

1. выкачиваем расширение в локальную директорию из репозитория (расширение еще не включено в список стандартных)


$ hg clone https://bitbucket.org/edgimar/crecord
 
2. редактируем .hgrc файл  

[extensions] 



crecord = /путь/до/каталога/crecord/содержащего/__init__.py/ 

И теперь можем использовать как новую команду для hg:
$ hg crecord

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

p.s.

Без багов, конечно же , тоже не обошлось:

hg crecord требует указания имени пользователя.
Требует - указываем ... через стандартный для hg  параметр -u

$ hg crecord -u someuser
.. а он не понимает и продолжает требовать.

Приходится явно прописывать в .hgrc

[ui]
username = someuser
Приятного использования!

пятница, 7 сентября 2012 г.

Тестировщики и тех.поддержка: взаимовыгодное сотрудничество

Вопросам взаимодействия тестировщиков и технической поддержки уделяется гораздо меньше внимания , чем, например отношениям тестировщиков и разработчиков. Хотя, на мой взгляд, тут также довольно много разных тонкостей, психологических моментов, проблем , стереотипов  и всяческих там особенностей.
Сотрудники технической поддержки находятся на самом "острие" , ежедневно общаясь с заказчиком, мотаются по командировкам , где зачастую в стрессовых ситуациях вынуждены оперативно решать технические проблемы, прикрывая порой промахи остального коллектива, оставшегося в уютном оффисе. Саппортеры - первые, кто узнает о проблемах заказчиков, фильтрует всяческие ошибки настройки от реальных багов. Благодаря близости к "реальной эксплуатации" техподдержка обладает особо ценными знаниями о конфигурациях софта, о типичных действиях реальных пользователей, об реальных объемах баз данных и еще о многом таком, о чем тестировщики могут только догадываться. В общем, "сильные стороны" тех.поддержки очевидны. Переворачивая известный афоризм , можно  сказать , что "недостатки техподдержки являются продолжением их достоинств". Сотрудник тех.поддержки зачастую не знает досконально всех особенностей системы и не настолько глубоко в нее "погружен" как разработчик или тестировщик. Поэтому порой ему недостаточно знаний о системе, чтобы точно поставить "диагноз" той или иной проблеме и, тем более , выявить точную причину произошедшего сбоя.
Тестировщики же, наоборот  , зачастую "оторваны от реальности" , не обладая полным пониманием всех тонкостей и особенностей того, как именно используется софт " в бою".
Исходя из вышесказанного должно быть понятно, почему вопрос взаимодействия тестирования и тех.поддержки - довольно важен. Для менеджмента и руководителей этих подразделений важно не только решать всяческие шероховатости, конфликты , возможные взаимные производственные споры сторон, но и налаживать и отлаживать процесс обмена знаниями. Тестировщики должны быть более осведомлены о "реалиях" использования софта для того, чтобы само тестирование стало более адекватным и направленным на реальные, а не вымышленные или высосанные из пальца  сценарии и конфигурации. Сотрудники тех.поддержки должны быть более информированы об особенностях этого самого софта  , чтобы давать более точные  и оперативные рекомендации заказчикам.
Процесс обмена знаниями можно построить по-разному.
Я бы хотел поделиться собственным положительным опытом организации и участия в одном из вариантов подобного обмена.
А именно в некоей ротации.
Время от времени сотрудникам технической поддержки передаются задачи на регрессионное тестирование тех или иных частей системы. Почему именно регрессионное?  Потому что в этом случае саппортеру не надо выдумывать тесты, погружаться в теорию и практику тест-дизайна - он проверяет работоспособность по методикам тестирования , которые , к слову, после работы с ними техподдержки , становятся намного богаче и адекватнее.
В то же самое время тестировщикам время от времени поручается разбор кейсов от заказчика, в ходе которого ребята по-новому начинают смотреть на вроде бы уже досконально знакомую систему и наборы своих тестов. А также, что немаловажно - переоценивают свою меру ответственности за общий результат.
Вот такое вот взаимовыгодное сотрудничество.

четверг, 30 августа 2012 г.

эти хрупкие автотесты

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

Посмотрим, что же делает подобные тесты хрупкими:

  1. Несогласованность с разработчиками. Зачастую тестировщику-автоматизатору достается интерфейс и функционал мало пригодный для "нехрупкой" автоматизации. Например (Если говорить о web), беспорядочное отношение к именованию контролов, присовению идентификаторов важным контейнерам, таблицам и т.д. В данной ситуации необходима совместная выработка общих правил и дальнейшее соблюдение соглашений. Разработчики любят хорошие ТЗ для того, чтобы было "комфортно" программировать, а тестировщики любят предсказуемый код и интерфейсы, которые "комфортно" автоматизировать.
  2. Бездумное использование "записанных" тестов. Тут лучше привести пример. Есть таблица со списком объектов из БД. Гипотетический тест проверяет то, что она содержит запись об определенном объекте. Записывалка тестов генерирует код, который ищет нужную ячейку с текстом по xpath локатору с явным индексами tr и td. Тестировщик использует сгенерированный код без изменений и через некоторое время получает провал теста. В чем дело? А просто список объектов пополнен новым и старый сдвинут. Или разработчик выводит список без сортировки и СУБД вдруг "сфетчила" записи в новом порядке. Тут, конечно, можно запросить "поддержку тестирования" в виде добавления сортировки. Но правильнее сначала отредактировать локатор , убрав индексы (если, конечно, соблюдение порядока следования записей не критично), ну а потом можно и сортировку попросить.. для предсказуемости )
  3. Часто меняющиеся требования к продукту. Тут уж никуда не деться от переделывания тестов. Рынок диктует свои условия. Поменялись требования, поменялся функционал / внешний вид , меняются тесты. Если подобные правки слишком часты и накладны, то стоит подумать о том, чтобы отказаться от автоматизации данного участка.
  4. Плохой дизайн тестов. Тестируемая система не менялась,  а тест то и дело проваливается. Причиной может послужить недостаточно вдумчивое проектирование теста, не учитывающее возможное изменение тех или иных внешних по отношению к тесту условий при неизменности тестируемого функционала. Грубо говоря, тестировщик создал код , похожий на тот, что создают "записывалки". Рекордеры ничего не "знают" об особенностях, которые обязан знать и учитывать автоматизатор.
Наверняка, можно еще добавить несколько пунктов. Но навскидку - приведенные кажутся мне основными.

понедельник, 25 июня 2012 г.

Платежные системы: непридуманный случай использования

Спешка.
Не вовремя заканчиваются средства на счету мобильного телефона.
Первый аппарат привычной системы оплаты.
Абонент закидывает в "кошелек" последнюю на данный момент наличность, например  500р, чтобы из "кошелька" уже совершить беспроцентное пополнение баланса мобильника.
Тут же в терминале заходит в кошелек и видит несколько предложений, как оплатить - но нужной возможности оплаты прямо из кошелька в терминале уже нет (закрыли в целях безопасности?).
Есть возможность отправки кодовой смс на кодовый номер - оператор берет плату - не подходит, так как баланс отрицательный.
Есть возможность оплаты из соответствующего android-приложения - не подходит, так как надо его качать ,  а 3g-сессии тоже не бесплатны.
Есть возможность через оплатить через сайт системы оплаты, что тоже неподоходит, так как халявного мобильного инета ОПСОСы еще не предоставляют.
В итоге: терминал деньги принял,  а потратить их не дает. Результат: у абонента наличных нет, связи все еще нет, абонент бегает ищет халявный вайфай (макдональдс, например) или банкомат (если есть карточка с нужным количеством средств)....

Вопрос авторам этой очередной версии ПО для терминала оплаты - вы о людях вообще думаете, когда патчи накладываете? ))

вторник, 29 мая 2012 г.

как ведут себя люди в последние 2 недели на рабочем месте

Многим из нас приходилось менять места работы, многим приходилось видеть как увольняются коллеги.
Наблюдая за та тем , как это все происходит иногда поражаешься со знаком "+" , как некоторые профессионально ведут себя последние стандартные 2 недели... Никакого послабления в качестве, никакой расслабленности. Все дела закончены. Все инструкции написаны. Человек заботится о своей репутации. Ему дорого мнение остающихся на этом месте коллег и иногда даже друзей.
А иногда поражаешься со знаком "-" тому, как люди воплощают в жизнь "а после нас хоть потоп" в те же стандартные 2 недели... Бумага написана. "отрицательно стимулировать" уже точно никто не будет. Хочу работаю, хочу не работаю. Хочу опоздаю на 2 часа, хочу приду вовремя.
Одних провожают всем отделом, уход других или не замечают вовсе или встречают с облегчением.
Разные все-таки люди бывают при том, что "чемоданное настроение" посещает любого , кому скоро придется подписывать обходной лист )

пятница, 25 мая 2012 г.

Оборотни на собеседовании

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

четверг, 24 мая 2012 г.

Чтение логов в рамках тестирования безопасности

При тестировании защищенности приложений, в том числе и веб-ориентированных, уделяют внимание защите от всяческих красивых аббревиатурных приемов типа xss, csrf , mitm и еще куча всяких красивых сокращений и еще более красивых расшифровок... Но порой частенько забывают о такой банальщине как логи.
Чем же они могут навредить приложению, честным пользователям, владельцам бизнеса?
Недавно один мой коллега столкнулся с реальным примером вывода (видимо, дебаг) в логах одного веб-портала системы дампы авторизационных данных пользователей системы... пароли в чистом виде в логах, при том, что в бд только хеши... ужас.
Само по себе наличие в логах таких данных никому не вредит.. до них ведь еще добраться надо.
Но кто помещает, например, недобросовестному админу, обиженному на всех и вся, слить налево такие данные , абсолютно не рискуя навлечь на себя подозрения ?
А про сценарий, когда на сервер проник злоумышленник извне (например, пробив какой-нибудь давно не патченный сетевой сервис) .. В этой ситуации , ему надо только уметь читать и ничего более ) Понятно, что ребята, которые могут легко пробивать "непропатченные сетевые сервисы" пробьются затем и в БД, и еще куда захотят, но зачем им облегчать жизнь? В общем, к логам хорошо бы относиться повнимательнее. Как разработчикам и тестировщикам , так и админам с их пермишенами :)

вторник, 15 мая 2012 г.

virtualenv в помощь

В этой статье хочу поделиться опытом того, как можно без лишней головной боли организовать тестирование web-приложения , написанного на python c различными версиями этого языка. И даже с различными версиями того или иного фреймворка (django, pylons etc)...если, конечно , фреймворк используется.
Итак , есть сервер , для определенности : на нем установлен linux.. для еще большей определенности - debian )
Любой linux - дистрибутив уже включает в себя ту или иную версию python. Допустим "из коробки" имеем python v2.5. Мы же хотим протестировать наше гипотетическое приложение на совместимость с python 2.5, 2.6 и 2.7 (на совместимость с версией 3 лучше не тестировать - под нее надо писать отдельно =), чтобы быть уверенным, что наше приложение будет работать на большинстве python-хостингов.
  1. доставляем отсутствующие версии python. Для этого wget-ом, например, выкачиваем соответствующие исходники, распаковываем (tar), конфигурируем НЕ ЗАБЫВАЯ УКАЗЫВАТЬ ПРЕФИКС установки отдельно для каждой версии python, затем make и make install. В итоге получаем:
    • /usr/bin/python - дефолтный
    • /usr/python2.6/bin/python
    • /usr/python2.7/bin/python
  2. теперь самое интересное - у нас три одинаковых бинаря python в трех разных местах. Если вызвать python из командной строки, то будет дернут тот, чей путь левее всего в PATH. Как быть? каждый раз руками менять PATH? мучаться с симлинками? Слава Богу нет. Нам на помощь приходит замечательная штукенция - virtualenv !
    
    sudo apt-get install virtualenv
    mkdir ~/projects/
    cd projects
    virtualenv --no-site-packages -p /usr/bin/python app_test_python2.5
    virtualenv --no-site-packages -p /usr/python2.6/bin/python app_test_python2.6
    virtualenv --no-site-packages -p /usr/python2.7/bin/python app_test_python2.7
    
    В результате мы имеем три директории - по одной для каждой версии питона. Интересное внутри этих директорий. Внутри же создается окружение - бинари, инсталляторы библиотек (pip , easy_install) - сюда же надо помещать и код тестируемого приложения, отсюда же и деплоить с локальным web-сервером (apache, nginx..)
  3. еще не все. Чтобы работать в окружении , надо его активировать:
    
    cd ~projects/app_test_python2.6
    . env/bin/activate
    
    
    теперь можно не боясь вызвать python, pip, easy_install - будет вызвана именно версия 2.6, будут использованы именно библиотеки для версии 2.6 и ставиться будут они не в /usr/lib/python , а в ~projects/app_test_python2.6/lib !
Полная изоляция, никакой мороки и путаницы.
Таким образом, создавая для каждой тестовой конфигурации свое виртуальное окружение, мы не засираем систему хаотичными симлинками, конфликтующими версиями библиотек и т.д. и т.п. В общем сплошные плюсы.
Расписал, конечно, не все максимально детально. Но, думаю, тому , кто решить освоить эту технику организации тестовых стендов помогут гугл, здравый смысл и прямые руки )
p.s. только python к сожалению ( Пока писал стало интересно есть ли аналоги для perl, php ... )

воскресенье, 13 мая 2012 г.

Вы уверены , что хотите выполнить операцию?

На тему о том, как делать удобные приложения написано немало статей, howto, "стандартов" и так далее. С каждым днем все больше действительно качественно продуманных приложений, по-настоящему дружественных и "обходительных" пользовательских интерфейсов. Развиваемся. Радует.
Но иногда встречаются просто умопомрачительные косяки.
Чтобы не быть голословным приведу пример.
Многие, наверное, знают о нашумевшей криптовалюте bitcoin. Одной из ее особенностью является принципиальная невозможность отмены транзакции. Например , если вы переводите монеты с одного кошелька на другой и при этом ошибаетесь в номере целевого кошелька , то отменить перевод невозможно. Вы можете ошибиться так, что укажете реально существующий кошелек и тогда, маловероятно, но есть шанс вернуть , уговорив его владельца сделать обратный перевод (найти владельца будет посложнее чем иголку в стоге сена). Если ошибетесь так , что такого кошелька просто нет - то монеты просто исчезают.
При всем при этом описанное именно особенность, связанная с изначальными архитектурными принципами этой по-настоящему безопасной криптовалюты. Зная об этой особенности , разработчикам стоит проектировать и реализовывать интерфейсы для работы с этой валютой, а тестировщикам , соответственно, тестировать. Но так ли думают разработчики авторы guiminer ? Это питоновский фронтенд над питоновским же майнером криптовалюты. Занимается он тем, что "добывает золото" . Кроме того , есть у него кнопочка "withdraw", по нажатию на которую все наработанное улетает на некий кошелек. Нет предложения ввести адрес перевода, нет предупреждения о том, что монеты уйдут на такой-то кошелек (чтобы юзер мог сверить лишний раз), нет предупреждения о невозможности отменить транзакцию. Есть только обработка сабмита кнопки в виде списания монет с баланса ))
Сколько же новичков майнинга тут "полегло" ! )) Наиболее распространенные сценарии потери с трудом намайненных монет такие:
  • пользователь недавно переставил винду и потерял свой кошелек, сгенерировал новый, а в настройки адресата переводов в учетной записи пула (например deepbit.net) новый адрес своего не внес, в итого withdraw на кошелек, который никогда нигде не увидеть больше
  • пользователь отправлял биткойны в биржу , где для получения средств каждый раз генерируется новый адрес..Соответственно, при очередном переводе, забывает указать новый адрес. Результат тот же - видеокарта жгла мазут зря.
В общем..если абстрагироваться от этого печального примера, то на ответ "выводить окно подтверждения или нет" можно так:
  1. если совершаемое действие может быть легко и без последствий отменено, то можно и не предупреждать
  2. если совершаемое действие не может быть отменено, то предупреждать
  3. если речь идет о финансах и клавиатура, которая может быть разбита, то ПРЕДУПРЕЖДАТЬ да еще и с описанием всех ньюансов)

пятница, 11 мая 2012 г.

"Сыпятся" диски - "валятся" тесты

Все мы привыкли к провалам автотестов из-за ошибок в тестируемом коде, в самих тестах , в конфигурации и т.д.
Но иногда случаются действительно редкие вещи. Как, например, сегодня в моей практике.
На одном из серверов автоматического тестирования часть тестов провалилась без видимых на то причин. Изменений, способных привести к провалам, не было ни в коде, ни в самих тестах , ни в тестовом окружении. Тесты имели длинную историю успешного прохождения - скучно даже было. И вот провалились.
После поверхностного анализа стало ясно, что не были созданы все тестовые данные - Oracle ругнулся так, что я никогда такого раньше не видел ) А точнее - не смог добавить extent в один из TABLESPACE-ов.
Смотрю в субд - инстанс в RO-режиме.
При попытке перезапустить бд получаю ошибку:

ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/u02/oradata/index01.dbf'

Пробую рекавери файла данных не помогает - из ругани Oracle становится ясно, что файловая система, где располагается том для файлов данных, находится также в RO-режиме. Сервер никто не трогал. Свет не отрубали (uptime сервака 52 дня). Лезу в /var/log/messages и вижу, что возникла проблема с ФС из-за проблемных блоков харда и ядро само перемонтировало раздел в RO-режиме. Теперь все встало на свои места. Далее лечение последствий в виде последовательных вызовов: umount, fsck, mount Ну и перезапуск oracle. В общем, мораль , железо тоже не выдерживает иногда :)

четверг, 26 апреля 2012 г.

"Везет" мне на IE в последнее время..

Буквально за пару последних дней дважды наткнулся на сообщения типа "Ваш броузер не поддерживается. Используйте IE..". Причем в приложениях довольно нужных: одно - важный интранет-портал (сделан на asp), другое - банковская веб-ориентированная система (написанная на jsp).
Если в случае ASP-шного портала запуск IE действительно помог, то банкиры удивили не на шутку.. Дословно "Ошибка: работа возможна только в IE5 и выше".
Хорошо, думаю, будет вам IE. Windows 7, думаю, IE 9. Хватит? Запускаю. Вижу "Ошибка: работа возможна только в IE5 и выше" Не смешно. На этот раз я выступал в роли не тестировщика, а обычного пользователя. Мне нужен был этот софт!)
Вот так вот. В обоих случаях, наверняка, разработка стоила кучу денег. Живо представляю себе пункт в требованиях к программно-аппаратному "Допускается работа только в IE5 и выше")) Толстые дяди с умным видом месяц согласовывали, потом подписывали, потом денежки перечисляли, потом в конверте часть назад приносили... А на дворе 21 век, а сайт работает только в IE5 , и не никак выше )))
p.s. вот найду на досуге ie5 иль эмулятор и затестирую изделие до... )

Офтопы на software-testing

Хорошо, когда твой профессиональный блог транслируется на такой посещаемый и авторитетный ресурс как, например, software-testing. Ты пишешь, делишься мыслями, рецептами - люди практически сразу это видят и могут дать отзыв о твоей записи, дельный совет и т.д.

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

В общем к чему это я..  Хорошо бы иметь механизм автора влиять на то , будет ли данная конкретная статья опубликована или нет. Сейчас я имею в виду конкретно трансляцию  на software-testing ... Думаю, можно сравнительно легко решить такую задачу. Например, автор добавляет некий код <!--DONTTRANSLATE--> в тело материала, если не хочет данной статьей флудить в ленте, а разрабочики сайта , немного "допиливают" свой транслятор, небольшим парсингом поступающего материала... Если знать точно, как именно происходит трансляция на S-T , то было бы легче "предлагать" и "советовать" и даже "приложить патч", но пока идея лишь в такой форме..

Если кто знает о "велосипеде" , который уже изобретен - буду рад совету )

воскресенье, 8 апреля 2012 г.

Взаимное влияние автотестов

Наиболее распространенной практикой при проектировании системы автотестов является минимизация взаимного влияния тестов между собой.
Для unit-теста "быть автономным" - аксиома. Для комплексных автотестов этот подход не всегда полностью применим. Но в этой статье речь пойдет не об этом.
Я хочу рассказать о способе, который может помочь в принудительном выявлении скрытых до поры до времени проблем в тестах, связанных с их явными и неявными зависимостями друг от друга.

Итак, имеем некоторый набор 4-х фазных тестов, которые время от времени проваливаются из-за недостаточной их изоляции друг от друга.
Это "время от времени" непредсказуемо и всегда не к стати.
Что можно сделать, чтобы выявить скрытые зависимости , от которых хотелось бы избавиться, не затеивая глобальной ревизии и перепроектирования системы автотестов?

Если у вас, как и большинства, тесты запускаются всегда в одном и том же порядке, то можно применить "метод перемешивания" автотестов. Сделав их порядок запуска каждый раз разным.
Чтобы это реализовать, скорее всего, потребуется реализация "перемешивателя" (mixer) списка тестов.
Отмечу, что не всегда можно просто взять и перемешать тесты.

Вот три основных типовых случая:

1. Ваши тесты ДОЛЖНЫ быть автономными согласно принятым у вас принципам автоматизации
Тут вы законно можете ожидать одинаковых результатов в независимости от порядка запуска

2. Ваши тесты сгруппированы. Порядок групп не важен, но внутри групп порядок обязателен. Перемешивайте группы тестов, оставляя порядок внутри групп постоянным.

3.зависимость между тестами - изначальный архитектурный принцип вашей системы автотестов.
В этом случае метод перемешивания неприменим.

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

Еще важно понимать, что данный метод не выявит сразу ВСЕХ проблемных зависимостей. Но постепенно от запуска к запуску позволит минимизировать их количество.
Так картина будет даже нагляднее..

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

В коллекцию граблей: chrome и html5

Сегодня столкнулся с проблемой, когда web-форма работает в IE, но отказывается работать в Chrome (чаще бывает наоборот=).
Неработоспособность заключается в том, что форма не отправляется.
html и js код верный. Повозился некоторое время и в результате понял причину. Дело оказалось в том, что разработчик реализовал по-умолчанию "скрывание" некоторых элементов управления от пользователя. В этом-то и оказался корень зла. Разработчик активно использовал нововведения HTML5 в виде возможности валидировать поля в броузере без js и до отправки на сервер. Речь идет об атрибутах required, maxlength... ( подробнее читать в стандарте )
Скрытые с помощью CSS контролы тоже имели подобные атрибуты, и разработчик ожидал , что броузеры не станут проверять то, что пользователю недоступно.
Ошибся.
Что касается IE, то ему на эти атрибуты вообще было плевать. Поэтому форма благополучно отправлялась.
chrome-же , действуя строго по стандарту, проверял все, не взирая на стили. Неожиданно для пользователя, но вполне логично с точки зрения разработчиков chrome.

Проблема решается, например, добавлением атрибута disabled тем элементам, которые надо спрятать.

Надеюсь, прочитавшие этот пост на подобные грабли не наступят :)

"Так никто не будет делать" или защита от дурака

Все мы в цейтноте. Всем не хватает времени. Успеть бы самое важное.
Но тестировщику, который по определению должен быть любопытен сложно запретить ковырять приложение там, где никто не ожидает. И когда он что-то эдакое наковыряет, то часто спешит поделиться результатом с окружающим миром... в виде бага например )
В таких условиях ему часто приходится слышать следующие ответы от разработчиков : "Зачем Вы регистрируете такие баги, ведь в жизни ТАК никто не будет делать!?".
Аргументирует. Доказывает - "Так сделал я, значит рано или поздно так сделает кто-нибудь другой" Иногда с ним соглашаются, иногда - нет. А когда не соглашаются, то , порой потом, бывает, получают такой фидбек: "Ну что же вы , ребята, даже защиты от дурака не сделали. Нехорошо. Не солидно."
Вопрос, стоит ли тратить время на маловероятные сценарии использования или нет? Уверен, что стоит. Да , с учетом приоритетов и предшествующего вылиызвания " основных " сценариев использования.

Сам стараюсь придерживаться следующих правил:

- если речь идет о trusted source, то обращать внимание на "дурацкие" сценарии только в самую последнюю очередь. Например, закрытая админская часть, где пользователь по определению должен быть обучен и не должен быть "сам себе злобный буратина".

- если функционал открыт для широкой общественности, то приложение должено быть максимально предусмотрительным. Тем более, что там где кончается "дурак" часто начинается "вредитель".

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

p.s. ну вот на закусу о "дураках" и "вредителях" - пару месяцев назад был обнаружен критичный баг в Safari . ОТкрываешь iframe с большим значением height и любуешься BSOD-ом. "Дурак" опечатался в "height", а "вредитель" подумал и использовал для выполнения произвольного кода...=)
Так что все как всегда неоднозначно .

среда, 7 марта 2012 г.

Тестировщик как ревизор кода или минусы "черного ящика"

Тестирование "черного ящика" , пожалуй, наиболее распространенная практика верификации ПО.
У нее есть свои плюсы , минусы и область применения. Хочу привести пример (буквально по горячим следам), когда одного "черного ящика" явно недостаточно...
До доработки у системы N имелась функция F. Эта функция вызвается из разных "мест" системы. То есть, есть основной сценарий ее использования и более редкие - побочные.
Функция F дополнена функцией f. Эта новая ф-я f ДОЛЖНА выполняться ПРИ КАЖДОМ "вызове" F.
Тестировщик протестировал основной сценарий - все ок. Тест дизайнер, доверяя сисаркам, тем не менее попросил тестировщика провести дополнительные тесты , проверяя "побочные" сценарии использования F. При прверке первого же такого сценария тестировщик выявил то, что новая функция f не вызывается при вызове F. Разработчик исправил , тестировщик проверил. Все ок. Переходит к следующему "побочному" сценарию - там та же история.
Тест-дизайнер смотрит на все это , удивляется и лезет в changeset-ы и, не веря своим глазам, обнаруживает, что с каждым фиксом разработчик копипастит код вызова f и вставляет везде, где вызывается F.
В итоге , разработчику пришлось-таки сделать так, как он по идее был должен сделать с самого начала - убрать код вызова f в код F , тем самым исключив проблему отстутствия новой функциональности во всех сценариях использования.


Не выходя за рамки процесса тестирования можно констатрировать минус "черного ящика", который заключается в риске пропустить подобный "архитектурный" баг. Этот риск тем больше, чем несовершениее процесс управления изменениями в конторе.
То есть, очевидна, польза в просмотре кода тестировщиками: если бы разработчик с самого начала расплодил код вызова в по всей системе, то тестировщик, проверяя все сценарии и, не находя в них ошибок, так никогда бы и не узнал о том, как неоптимально и взрывоопасно все реализовано. А при добавлении нового сценария с вызовом F через некоторое время получили бы проблему "невызова f" с большой долей вероятности.

p.s.
Читайте код, если есть возможность :)

среда, 29 февраля 2012 г.

Wimax. Поиск программного эмулятора ASN GW

В настоящее время активно ищу программный эмулятор для ASN GW. Пока ничего кроме недоделанного и давно не развивающегося boc-wimax не удалось откопать.
Если кто-то знаком с подобным опенсорцным решением и готов откликнуться - буду признателен :)
Также были бы очень полезны логи (дампы пакетов) RADIUS-сессий между реальной ASN-GW-железкой и ААА-сервером. Вендор железяки на данный момент не важен.

четверг, 23 февраля 2012 г.

Лидерство и управление командой



Интро: В этой статье делается попытка описать основные качества тим-лидера как в общем, так и в контексте тестирования ПО.

Прежде всего, попробуем определиться, кто такой тим-лидер.

У многих существует,на мой взгляд, неправильное представление о понятии "тим лидер". Оно звучит примерно так: "Тим лидер - это самый крутой спец в команде". Это неверное представление. Точнее, не совсем верное. Такой вот пример: самый "забивной" футболист в команде не всегда является ее капитаном. Скорее даже очень редко такой игрок им бывает. Как правило игроки совсем с другими "ТТХ" становятся капитанами. Почему? Потому что лидеры ценны не только умением "забивать", но в большей степени другим набором качеств. Уверен, что вполне можно провести аналогию между футбольной командой и , например, коллективом тестировщиков - каждая команда тестеров должна иметь своего капитана. Назовем его "Тим лидер".

Итак, поставим несколько вопросов:

Какими качествами должен обладать тимлидер ?
Каковы его обязанности и зона ответственности?
Каких ошибок следует избегать тим лидеру?
Легко ли быть лидером в команде?

Качества

1. Отличные профессиональные навыки (но не обязательно лучшие в команде): нужны для того, чтобы обосновано принимать или отвергать аргументы и предложения других "игроков" команды.
2. Известная доля смелости: для того чтобы не бояться принимать решения и нести личную ответственность за эти самые решения.
3. Дипломатичность: для того чтобы успешно разрешать возникающие конфликты и всякого рода противоречия. Без этого качества также не обойтись в ситуации, когда тим лиду надо указать человеку на недостатки в его работе.
4. Навыки психолога: для того , чтобы понимать мотивы тех или иных поступков и действий людей.
5. Чувство юмора: хорошая шутка зачастую вернейший способ разрядить напряженную обстановку и снять напряжение в коллективе.
6. Самоанализ: для того, чтобы вовремя заметить, что причина той или иной проблемы команды не в том или ином ее "игроке" , а в самом тим лиде.
7. Оптимизм: без этой черты тим лиду будет очень трудно воодушевлять людей на достижение целей.
8. Аналитик: для того, чтобы адекватно оценивать сроки, риски , возможные проблемы и запасные варианты на случай их возникновения
9. Опыт: тим лидером вряд ли может стать человек без богатого опыта в сфере деятельности команды.

Обязанности и сфера ответственности
1. Принимать непосредственное участие в процессе формирования команды
2. Делать общие цели понятными каждому члену команды
3. Делать все возможное для поддержания общего уровня мотивации и увлеченности общей целью на уровне , позволяющем решать задачи максимально эффективно
4. Выбор наиболее подходящего для данной конкретной задачи исполнителя
5. Обеспечивать обмен опытом и знаниями между членами команды, повышение степени взаимозаменяемости людей.
6. Поддержание дружеской и конструктивной атмосферы в коллективе.
7. Проведение внутрикомандных совещаний
8. Учет инициатив и предложений исходящих от членов команды. Поддержка полезных и беззастенчивая фильтрация вредных и бесполезных.
9. Предоставление "наверх" информации о состоянии дел в коллективе, сроках задач, степени завершения, имеющихся проблемах, которые невозможно решить только силами команды.

Несколько советов
1. "Хочешь, чтобы было сделано хорошо? -Сделай сам!" Доверие (с проверкой =) и делегирование гораздо лучше изнуряющих попыток сделать все самому.
2. "Начальник полютует и забудет" . Принимая то или иное решение необходимо сразу думать о том, как именно будет контролироваться его выполнение.
3. Не просите людей делать то, за что сами никогда бы не взялись.
4. Вы - лидер, не потому что вы сами о себе так думаете, а потому, что вам доверяют.

вторник, 31 января 2012 г.

"Фобосом" навеянное

ВЕРОЯТНАЯ ПРИЧИНА ПАДЕНИЯ аппарата "фобос-грунт" - ошибка в программировании. Версия с "происками Запада" , похоже, не состоятельна.
Многие, вцепившись , в версию "ошибка разработчиков" уже начали костерить деградацию образования, пресловутое снижение качества знаний выпускников, тут же пробежались по ЕГЭ, отдавая дань моде.. Да, деградация.. Да, снижение... Да, ЕГЭ, будь он неладен...
Но вот вспомнилась мне почему-то одна лекция по "Численным методам" в институте.. читал ее профессор Михайлов - человек с богатейшим опытом решения задач прикладной математики. Он поведал нам о подобном случае, который случился еще в СССР , когда был утерян очень дорогой спутник из-за ошибки программистов... Насколько я помню, тогда речь шла всего лишь о проблеме округления и накопления погрешности. В общем, из-за ошибки в вычислениях спутник улетел совсем не туда, куда планировалось и миллионы народных рублей сейчас возможно еще летают где-то в солнечной системе ).. Тогда не было ЕГЭ, не было "деградации" и "снижения" - все было, судя по всему, наоборот, но подобные ошибки случались и времена, которыми принято гордиться...

среда, 4 января 2012 г.

Internet Explorer на страже стандартов =)

Броузер Internet Explorer хорошо известен тем, что старается уж очень четко следовать стандартам, разработанным ответственными комитетами типа W3C
Там, где остальные броузеры закрывают глаза на некоторые опечатки, небольшие огрехи вебмастеров, IE каленым железом выжигает всякую "крамолу" )) Вот несколько граблей, на которые пришлось наступить в последнее время:
1. <!DOCTYPE
Сегодня довольно долго бился над выяснением того, почему на одном из сайтов "слетает" верстка в IE , которая идеально выглядит в Chrome, Opera, Firefox.
Перелопатил все стили, исправил пару незначительных кроссброузерных различий, но в целом IE продолжал показывать мне совсем не то ,что остальные броузеры.
Причина оказалась банальна - в первой строке html-ответа не было директивы <!DOCTYPE ...>, после его добавления в базовый html-шаблон все сразу стало выглядеть так, как требовалось (с небольшими допустимыми для IE отличиями типа отсутствия теней у некоторых элементов).
Вот что пишет w3c об этой преамбуле: W3C-HTML5#DOCTYPE

2. js-движок и синтаксис записи словарей в js
Довольно много приходилось писать на perl и в последнее время на python. При записи структур типа:
my $dict = {
      'key1': 1,
      'key2': 2,
   }
давно выработалась привычка всегда ставить запятую после очередной записи в хеше, даже если она последняя - это позволяет избегать синтаксических ошибок при возможном будущем добавлении новых записей в этот словарь. Эта привычка меня недавно подвела при написании js-кода, содержащего в большом количестве структуры, подобные описанной выше.
Отладка кода проводилась в Chrome и Mozilla. Когда начал проверять работу в IE ошалел от кучи js-ошибок (при возникновении ошибок компилляции js - IE просто перестает рендерить страницу). Пришлось перелопатить все js исходники и повычищать последние запятые, которые оказались несоответствующими синтаксису описания словарей, к которому я так привык.
Теперь взял за правил ставить запятые ПЕРЕД элементами словаря ))

3. подчеркивания в именах хостов
На эти грабли наступал уже давно и , может быть, даже описывал на страницах этого блога. Но недавно, когда коллега начал в ярости постукивать по клавиатуре, я поинтересовался в чем у него проблема , понял, что он наступил на то же самое (спросил бы раньше))))
Пример: есть тестовый стенд одного веб-проекта. Тестируется в основном под Chrome, Mozilla. Начали проверять под IE. Полезли глюки в виде странной работы с куками. После ряда возгласов "мистика" стало ясным, что виноваты символы подчеркивания в имени тестового хоста, которые оказалиcь "не по стандарту".

4. зацикливание при редиректе из-за некорректного http-euiv
Вот такой вот код:
<meta http-equiv="Refresh" content="1; /" />
отлично понимается Chrome и Firefox - в результате выполняется редирект на главную страницу сайта.
В IE (например в 8.0) делается редирект на ту же самую страницу. В результате - ежесекундные бесконечные редиректы.
Чтобы сделать понятным для всех броузеров ,опять же обратимся к стандарту W3C-HTML5#PRAGMAS



Это далеко не полный список того, чему IE предельно жестко учит)) Буду пополнять эту коллекцию