Модульное тестирование

Пуленепробиваемый код

Если вы мало или совсем ничего не знаете о методологиях модульного тестирования, вы, вероятно, встраиваете фрагменты кода непосредственно в свою существующую программу, чтобы для отладки. Это, конечно, означает, что вы должны удалить их после запуска программы. Оставшиеся фрагменты кода, плохой дизайн и неправильная реализация могут стать ошибками при последующем развертывании приложения.

F3 упрощает отладку программ - не мешая вашим мыслительным процессам. Платформа не требует от вас создания сложных классов ООП, сложных проверок и навязчивых процедур.

Модуль может быть функцией/методом или классом. Приведем простой пример:

function hello() {
    return 'Hello, World';
}

Сохраните его в файле с именем hello.php. Как мы узнаем, что он действительно работает так, как мы ожидаем? Создадим нашу тестовую программу:

$f3=require(__DIR__.'/lib/base.php'); // path to f3
 
// Set up
$test=new Test;
include('hello.php');
 
// This is where the tests begin
$test->expect(
    is_callable('hello'),
    'hello() is a function'
);
 
// Another test
$hello=hello();
$test->expect(
    !empty($hello),
    'Something was returned'
);
 
// This test should succeed
$test->expect(
    is_string($hello),
    'Return value is a string'
);
 
// This test is bound to fail
$test->expect(
    strlen($hello)==13,
    'String length is 13'
);
 
// Display the results; not MVC but let's keep it simple
foreach ($test->results() as $result) {
    echo $result['text'].'<br>';
    if ($result['status'])
        echo 'Pass';
    else
        echo 'Fail ('.$result['source'].')';
    echo '<br>';
}

Сохраните его в файле с именем test.php. Таким образом мы можем сохранить целостность файла hello.php.

А теперь вся суть процесса модульного тестирования.

Для каждого теста, который вы хотите запустить, вызовите метод expect() класса Test. У expect() 2 аргумента:

  1. test это тест, который нужно запустить. Это должен быть простой тест,у которого будет два исхода:сдал или нет. Пример:$i==1.
  2. text текст, который будет отображаться для этого теста при отображении результатов теста. пример: «ввод равен числу 1».

При запуске тестов встроенный в F3 класс Test будет отслеживать результат каждого вызова метода expect(). Выходные данные каждого $test→expect()вызова сохраняются в многомерном массиве results с ключами:

  • text(отражение аргумента 2 из expect() ),
  • status (логическое значение, представляющее результат теста),
  • source (имя файла / номер строки конкретного теста для облегчения отладки)

В конце теста вы можете перебрать этот многомерный массив, распечатать текст теста, а затем распечатать статус теста ( trueесли тест пройден, falseесли тест не прошел, и включить исходный файл и строку для отладки )

Функция Fat-Free дает вам возможность отображать результаты тестов любым удобным для вас способом. Вы можете получить вывод в виде обычного текста или даже красивого HTML-шаблона, отрисовав файл шаблона, который взаимодействует через массив $ test→ results ().

Имитация HTTP-запроса

F3 дает вам возможность имитировать HTTP-запросы из вашей PHP-программы, чтобы вы могли протестировать поведение определенного маршрута, как если бы посетитель веб-сайта запросил эту страницу через браузер.

Вот простой имитированный запрос:

$f3->set('QUIET',TRUE);  // do not show output of the active route
$f3->mock('GET /test');  // set the route that f3 will run
// run tests using expect() as shown above
// ...
$f3->set('QUIET',FALSE); // allow test results to be shown later
$f3->clear('ERROR');  // clear any errors

Tip: Если у вас есть маршрут с токеном, например, /test/@name, вы можете протестировать этот маршрут, установив значение для токена в имитированной команде, и получить доступ к этому значению во время тестирования из ассоциативного массива PARAMS F3.

$f3->mock('GET /test/steve');
$name = $f3->get('PARAMS["name"]');
$test->expect(
    $name =="steve",
    'Uri param "name" equals "steve"'
);

Чтобы смоделировать запрос POST и отправить имитацию HTML-формы:

$f3->mock('POST /test', array('foo'=>'bar')); // pass in form values using assoc array

Tip: При использовании макета, отображении результатов теста с использованием визуализированного шаблона или тестировании чего-либо в вашей базе данных вам необходимо включить параметры конфигурации для F3, чтобы он знал расположение ваших шаблонов, параметры базы данных и т. Д.

Tips

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

Если вы создаете отдельные тестовые файлы, и вашим тестам требуется доступ к значениям конфигурации или доступ к базе данных, используйте директиву include once для файла, который имеет путь к f3 и значениям конфигурации, и вызовите этот включаемый файл из каждого отдельного тестового файла. Если вы включите каждый тестовый файл в один тестовый пакетный файл, «включить один раз» упростит тестирование отдельных классов и всего приложения.

Задайте себе вопрос: «Все ли возможные сценарии я проверил?». Чаще всего причиной ошибок являются те ситуации, которые не были приняты во внимание.

Печать/экспорт