При разработке программных продуктов периодически возникают задачи, требующие многократного выполнения одних и тех же операций. Например, инсталлировать или деинсталлировать компонент в процессе его отладки. Или эмулировать системные события и действия пользователя. В таких случаях хочется сберечь дорогое время разработчика/тестировщика, а также избежать досадных ошибок, связанных с усталостью, невнимательностью и прочими человеческими факторами.
На выручку приходят инструменты, позволяющие автоматизировать описанные выше действия и работать с интерактивными приложениями. Одним из таких инструментов является Expect. В конце статьи представлены ссылки на материалы, детально описывающие работу с этим замечательным продуктом, и потому сразу перейдем к примеру.
Задача: автоматизировать установку пакета в Solaris. На примере архиватора zoo, который можно взять здесь.
Решение: напишем скрипт, который будет запускать pkgadd и отвечать на вопросы. Для краткости изложения в скрипте не представлена обработка ошибок (неверный путь, битый пакет, пакет уже установлен и т.п.)
Скрипт запускает pkgadd и отвечает на вопросы: выбор пакета и “добро” на создание каталога (в случае его отсутствия).
#!/opt/sfw/bin/expect -f if { $argc != 1 } { puts "A full path to the package required!" exit } set package [lindex $argv 0] spawn pkgadd -d $package expect { "(default: all)" { send "1\r" } } expect { eof { exit } "you want this directory created now" { send "y\r" } } expect eof
Запуск:
bash-3.00# ./exp1 /tmp/zoo-2.10-sol10-intel-local spawn pkgadd -d /tmp/zoo-2.10-sol10-intel-local The following packages are available: 1 SMCzoo zoo (i386) 2.10 Select package(s) you wish to process (or 'all' to process all packages). (default: all) [?,??,q]: 1 Processing package instance <SMCzoo> from </tmp/zoo-2.10-sol10-intel-local> ... The selected base directory </usr/local> must exist before installation is attempted. Do you want this directory created now [y,n,?,q] y Using </usr/local> as the package base directory. ## Processing package information. ... Installation of <SMCzoo> was successful.
Expect сослужил хорошую службу не одному поколению автоматизаторов, но TCL-синтаксис вызывает восторг далеко не у всех. Как следствие, появились реализации подобной функциональности на других языках программирования. О них мы поговорим в следующей статье.
Ссылки по теме:
Сайт продукта | Статья в Википедии | Expect в TCL wiki | Краткое руководство
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.
Pingback : OpenQuality.ru » Expect.pm, Pexpect, empty | August 11, 2008
[…] было упомянуто ранее, функциональность Expect реинкарнировалась в других […]
Автор комментария : ruby | August 11, 2008
ruby expect
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/66884
[Ответить]
Автор комментария : Капитан Аляска | August 11, 2008
@ ruby:
Похоже, это еще один сын лейтенанта Шмидта :) Спасибо за ссылку!
[Ответить]