|
|
|
Тестирование 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 |
|