|
Тестирование php страниц достаточно подробно в принципе описано в разделе про тест php .
Здесь делается попытка предоставить небольшой и понятный но в то же время демонстрирующий практически все аспекты тест для php-страницы. Из-за таких противоречивых целей (обозримый размер и покрытие всех аспектов) пример выглядит несколько искусственным, но зато полезным.
Итак, будем тестировать начальную страницу "регистрации" некоего воображаемого портала.
Информация о зарегистрированных пользователях пусть лежит в mysql-табличке. Скрипт, который инициализирует пустую базу данных назовём create_db.sql и он будет содержать следующий текст:
create database if not exists php_tests; use php_tests; create table Account( Account_id int NOT NULL primary key auto_increment, login char(50) NOT NULL, password char(50) NOT NULL, name char(50) NULL, account_type enum('user','admin','programmer'), unique index (login), index Login_password (login,password) ) TYPE=MyISAM; |
На всякий случай приготовим также скрипт уничтожения тестовой базы (drop_db.sql), который можно запускать например перед скриптом создания, чтобы уничтожать предыдущий вариант:
drop database if exists php_tests; |
Для полноценного тестирования подготовим скрипт с тестовыми данными (fill_test_accounts.sql):
use php_tests; insert into Account (login, password, name, account_type) values ("tlogin0", "tpassword0", null, "user"), ("tlogin1", "tpassword1", "tname1", "user"), ("tlogin2", "tpassword2", "tname2", "admin"), ("tlogin3", "tpassword3", "tname3", "programmer"); |
Для проверки состояния нашей СУБД заведём также специальный скрипт (check_accounts.sql):
use php_tests; select * from Account order by Account_id desc\G |
Кроме того, чтобы было легко восстанавливать исходное состояние СУБД, договоримся в процессе тестов регистрировать только логины с префиксом "test_". Соответственно очищать СУБД после тестов можно простым скриптом (clear_test_accounts.sql):
use php_tests; delete from Account where login like "test_%"; repair table php_tests.Account use_frm; |
Перед выполнением теста мы должны производит предварительную работу.
<declarations> <params> <par><name>path_to_mysql</name> <value>C:\mysql\bin</value></par> <par><name>php</name> <value>C:\php\cli\php.exe </value></par> <par><name>mysql</name> <value>%path_to_mysql%\mysql.exe </value></par> </params> <test_templates> <template> <name>safe_start_mysqld</name> <test> <test_script> <spec><fname>safe_start_mysqld</fname></spec> <items> <if_property_not_equal> <name>mysqld_on</name> <value>yes</value> <items> <echo>## start mysqld ##</echo> <start>%path_to_mysql%\mysqld.exe</start> <sleep>5000</sleep> <set_property> <name>mysqld_on</name> <value>yes</value> </set_property> </items> </if_property_not_equal> </items> </test_script> </test> </template> <template> <name>safe_prepare_schema</name> <test> <test_script> <spec><fname>safe_prepare_schema</fname></spec> <items> <if_property_not_equal> <name>mysqld_schema</name> <value>flat_trade</value> <items> <echo>## drop databases ##</echo> <mysql><script>..\db\drop_db.sql</script></mysql> <echo>## create databases ##</echo> <mysql><script>..\db\create_db.sql</script></mysql> <set_property> <name>mysqld_schema</name> <value>flat_trade</value> </set_property> </items> </if_property_not_equal> </items> </test_script> </test> </template> <template> <name>safe_prepare_test_data</name> <test> <test_script> <spec><fname>safe_prepare_test_data</fname></spec> <items> <if_property_not_equal> <name>mysqld_content</name> <value>test</value> <items> <echo>## fill test data ##</echo> <mysql><script>..\db\fill_test_accounts.sql</script></mysql> <set_property> <name>mysqld_content</name> <value>test</value> </set_property> </items> </if_property_not_equal> </items> </test_script> </test> </template> <template> <name>safe_start_simple_test</name> <test> <test_script> <spec><fname>safe_start_simple_test</fname></spec> <items> <call_template><name>safe_start_mysqld</name></call_template> <call_template><name>safe_prepare_schema</name></call_template> <call_template><name>safe_prepare_test_data</name></call_template> </items> </test_script> </test> </template> </test_templates> </declarations> |
В качестве регистрационных данных будем принимать логин, пароль, имя и кроме того "тип" аккауонта (user, admin, account).
Подумаем, какие случаи для нашей формы должны быть протестированы:
Для тестирования странички будем использовать тест php , а для работы с базой данных тестовую команду mysql . Для одного и того же теста но с разными типами пользователя будем использовать тест iterate , а в одно целое все тесты объединим тестом package .
Итак, тесты будут выглядеть следующим образом (файл registrate.itd.xml):
<package> <spec> <sname>registrate</sname> <fname>tests for sample_registrate php form</fname> <descr> This is the test to illustrate testing of php-pages using izh_test. </descr> </spec> <include> <declarations_from>declaration.iti.xml</declarations_from> </include> <on_start_terminal> <call_template><name>safe_start_simple_test</name></call_template> </on_start_terminal> <tests> <php> <spec><sname>empty_login</sname></spec> <script>..\php\registrate.php</script> <out>r\empty_login.html</out> <post> <par><name>login</name><value/></par> <par><name>image_path</name><value>../../</value></par> </post> </php> <php> <spec><sname>wrong_password</sname></spec> <script>..\php\registrate.php</script> <out>r\wrong_password.html</out> <post> <par><name>login</name><value>login</value></par> <par><name>pass1</name><value>pass1</value></par> <par><name>pass2</name><value>pass2</value></par> <par><name>image_path</name><value>../../</value></par> </post> </php> <php> <spec><sname>empty_password</sname></spec> <script>..\php\registrate.php</script> <out>r\empty_password.html</out> <post> <par><name>login</name><value>login</value></par> <par><name>pass1</name><value/></par> <par><name>pass2</name><value/></par> <par><name>image_path</name><value>../../</value></par> </post> </php> <php> <spec><sname>existed_login</sname></spec> <script>..\php\registrate.php</script> <out>r\existed_login.html</out> <post> <par><name>login</name><value>tlogin1</value></par> <par><name>pass1</name><value>pass</value></par> <par><name>pass2</name><value>pass</value></par> <par><name>type</name> <value>programmer</value></par> <par><name>image_path</name><value>../../</value></par> </post> <before><mysql><script>..\db\clear_test_accounts.sql</script></mysql></before> <after> <mysql> <script>..\db\check_accounts.sql</script> <etalon>r\test_data.accounts.txt</etalon> </mysql> </after> </php> <php> <spec><sname>empty_name</sname></spec> <script>..\php\registrate.php</script> <out>r\empty_name.html</out> <check_session>true</check_session> <post> <par><name>login</name><value>test_login</value></par> <par><name>pass1</name><value>pass</value></par> <par><name>pass2</name><value>pass</value></par> <par><name>name</name> <value/></par> <par><name>type</name> <value>user</value></par> <par><name>image_path</name><value>../../</value></par> </post> <before><mysql><script>..\db\clear_test_accounts.sql</script></mysql></before> <after> <mysql> <script>..\db\check_accounts.sql</script> <etalon>r\empty_name.accounts.txt</etalon> </mysql> <mysql><script>..\db\clear_test_accounts.sql</script></mysql> </after> </php> <iterate> <spec><sname>types_of_account</sname></spec> <names><name>type</name></names> <tuples> <tuple><value>user</value></tuple> <tuple><value>admin</value></tuple> <tuple><value>programmer</value></tuple> <tuple><value>unknown_type</value></tuple> </tuples> <template> <php> <spec><sname>%type%</sname></spec> <script>..\php\registrate.php</script> <out>r\type\%type%.html</out> <check_session>true</check_session> <post> <par><name>login</name><value>test_login</value></par> <par><name>pass1</name><value>pass</value></par> <par><name>pass2</name><value>pass</value></par> <par><name>name</name> <value>test_name</value></par> <par><name>type</name> <value>%type%</value></par> <par><name>image_path</name><value>../../../</value></par> </post> <before><mysql><script>..\db\clear_test_accounts.sql</script></mysql></before> <after> <mysql> <script>..\db\check_accounts.sql</script> <etalon>r\type\%type%.accounts.txt</etalon> </mysql> <mysql><script>..\db\clear_test_accounts.sql</script></mysql> </after> </php> </template> </iterate> </tests> </package> |
Очевидно, что нормальный веб-сайт имеет обычно и другие страницы кроме страницы регистрации. Заведём сразу "объединённый" тест, который будет включать в будущем тесты для всех страниц сайта, а пока только наш вышеприведённый тест (при разработке можно запускать на тестирование как тесты, описанные в файле registrate.itd.xml так и сводный файл). Итак, заготовка файла со "сводным тестом" (файл php_sample.itd.xml):
<package> <spec> <sname>sample</sname> <fname>tests for sample php project</fname> <descr> This is the test to illustrate testing of php-pages using izh_test. </descr> </spec> <tests> <link>registrate.itd.xml</link> </tests> </package> |
Готовый пример можно выкачать здесь (внимание, берите версию 1.2!): http://www.izhsoft.com/downloads.html или здесь : http://www.sourceforge.org/projects/izh-test/
Для его использования необходимо:
itr tests\php_sample.itd.xml |
itr tests\php_sample.itd.xml --gui |
|