SourceForge.net Logo
prevtopnext
Система тестирования izh_test
    Частные случаи

PHP-страницы.

Тестирование 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;
В данном случае repair нужен для того, чтобы сбрасывать счётчик автоинкрементного поля и добиться тем самым повторяемых результатов.

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

  1. Запустить сервер mysql.
  2. Создать базу данных.
  3. Заполнить базу данных тестовыми данными.
Опишем все необходимые действия а также переменные подстановки в отдельном файле (declaration.iti.xml), так чтобы мы могли его использовать и в других тестах:
<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).

Подумаем, какие случаи для нашей формы должны быть протестированы:

  1. Введён пустой логин
  2. Введённые пароли не совпадают
  3. Введены пустые пароли
  4. Пользователь с таким логином уже существует
  5. Регистрация пользователя с пустым именем
  6. Регистрация пользователей разных типов:
    1. Зарегистрирован пользователь типа "user"
    2. Зарегистрирован пользователь типа "admin"
    3. Зарегистрирован пользователь типа "programmer"
    4. На вход регистрационного скрипта был подан неправильный тип пользователя "unknown_type"
Причём заметим что при удачной регистрации должно измениться состояние базы данных и переменной сессии (то есть при удачной регистрации сразу же начинается сессия для вновь зарегистрированного пользователя). Будем записывать идентификатор зарегистрированного пользователя в переменную сессии account_id.

Для тестирования странички будем использовать тест 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/

Для его использования необходимо:

  1. Скачать его и распаковать в директорию.
  2. Иметь установленный mysql. Пример тестировался с версией 4.1.7. Скачать и установить можно с сайта http://www.mysql.com .
  3. Иметь установленный php. Пример тестировался с версией 4.3.0. Скачать и установить можно с сайта http://www.php.net/ .
  4. Настроить правильно путь до php и mysql в файле tests\declarations.iti.xml .
  5. Настроить правильно параметры соединения с mysql в файле php\registrate.php (функция db_connect) .
  6. Запустить командную строку
    itr tests\php_sample.itd.xml
    или
    itr tests\php_sample.itd.xml --gui


prevtopnext

SourceForge.net Logo