УрокМодульное тестирование с помощью Simpletest

В Друпале существует два варианта тестирования - модульное и функциональное. Про функциональное тестирование с Simpletest я уже рассказал. Пришло время поговорить о модульном.

Сразу хочу отметить, что модульное тестирование - это не значит, что тестироваться будут модули. Просто в английском языке оно называется Unit testing, что по традиции переводиться именно как модульное тестирование. А то, что в Друпале всё построено на модулях - это досадное совпадение ;)

Как и раньше, для примеров я буду использовать код из модуля Simpletest Example, который является частью examples. Для вас это хорошо тем, что можно скачать и посмотреть исходники, или же опробовать их в деле.

Итак, несмотря на то, что тестирование функциональности через класс DrupalWebTestCase является более распространённым, могут возникнуть потребности написать традиционный модульный тест. Модуль simpletest позволяет тестировать любым из этих методов.

Что мы будем тестировать?

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

function simpletest_example_empty_mysql_date($date_string) {
  if (empty($date_string) || $date_string == '0000-00-00' || $date_string == '0000-00-00 00:00:00') {
    return true;
  }
  return false;
}

Исходя из написанного, функция должна возвращать TRUE только в том случае, если переменная $date_string является корректной для вставки в базу данных. Нам надо проверить возвращаемые значения функции, если ей будут переданы различные данные в аргументе. Например, переменная $date_string может равняться NULL, пустой строке, '0000-00-00', '0000-00-00 00:00:00', числу, не пустой строке и т.д.

Создаём тест

Первым делом надо создать файл с тестом. Он создаётся в папке с модулем и имеет расширение .test. В нашем примере это simpletest_example.test.

Чтобы Drupal нашёл ваш тест, вам надо описать его в info файле модуля в конструкции files[]. Если модуль уже был включен - после добавления теста обязательно очистите кэш на сайте. Пример:

files[] = simpletest_example.test

Теперь открывайте файл с тестом simpletest_example.test и создайте класс для модульного теста. Он должен быть наследован от DrupalUnitTestCase:

<?php
 
class SimpletestUnitTestExampleTestCase extends DrupalUnitTestCase {
 
}

Так же как и в функциональном тестировании, в тесте должен быть метод getInfo(), чтобы этот тест был виден из админки simpletest'a. Он должен содержать в себе имя, описание и, если надо, группу к которой он относится.

public static function getInfo() {
  return array(
    'name' => 'Simpletest Example unit tests',
    'description' => 'Test that simpletest_example_empty_mysql_date works properly.',
    'group' => 'Examples',
  );
}

После имплементации метода getInfo() можно переходить к написанию теста. Все модульные тесты должны начинаться со слова 'test' в нижнем регистре. Все методы, которые начинаются с этог слова, автоматически распознаются Simpletest'ом и запускаются на этапе тестирования. Можно отделить разные вставки (assertations) в разные методы, однако рекомендуется для этого использовать один и тот же метод. Сделать это можно следующим образом:

function testEmptyMySQLDate() {
 
  $result = simpletest_example_empty_mysql_date(NULL);
  $message = t('A NULL value should return TRUE.');
  $this->assertTrue($result, $message);
 
  $result = simpletest_example_empty_mysql_date('');
  $message = t('An empty string should return TRUE.');
  $this->assertTrue($result, $message);
 
  $result = simpletest_example_empty_mysql_date('0000-00-00');
  $message = t('An "empty" MySQL DATE should return TRUE.');
  $this->assertTrue($result, $message);
 
  $result = simpletest_example_empty_mysql_date(date('Y-m-d'));
  $message = t('A valid date should return FALSE.');
  $this->assertFalse($result, $message);
 
}

Вот и всё, что надо сделать. Скорее всего, когда вы будете писать свои тесты, они будут более сложными и содержать много строк кода перед вставками. Однако они в любом случае будут проще, чем тест, написанный при помощи DrupalWebTestCase.

Комментарии

Аватар пользователя Romka
Romka написал:

как я могу отправить post при помощи этого модуля, если у меня НЕ форма?
Например внутри функции по урл содержится переменная $hello = $_POST['hello']; return $hello;

02.03.2016 22:47

Комментировать