Как я пишу модульные тесты в PHP с процедурной кодовой базой?

Сценарий приложения (в значительной степени) просто Javascript; plain-old JSON.parse - ваш лучший вариант для анализа JSON в объектном представлении.

Вы также можете использовать JSON.stringify для сериализации объекта в строковое представление.

30
задан Travis Beale 22 May 2009 в 18:46
поделиться

3 ответа

Вы можете юнит-тестировать процедурный PHP, без проблем. И вам определенно не повезло, если ваш код смешан с HTML.

На уровне приложения или приемочного тестирования ваш процедурный PHP, вероятно, зависит от значения суперглобальных переменных ( $ _ POST, $ _GET, $ _COOKIE и т. Д.) Для определения поведения и заканчивается включением файла шаблона и выдачей вывода.

Для тестирования на уровне приложения вы можете просто установить суперглобальные значения; запустить буфер вывода (чтобы не дать кучу HTML переполнить ваш экран); вызвать страницу; утверждать против материала внутри буфера; и выбросить буфер в конце. Итак, вы можете сделать что-то вроде этого:

public function setUp()
{
    if (isset($_POST['foo'])) {
        unset($_POST['foo']);
    }
}

public function testSomeKindOfAcceptanceTest()
{
    $_POST['foo'] = 'bar';
    ob_start();
    include('fileToTest.php');
    $output = ob_get_flush();
    $this->assertContains($someExpectedString, $output);
}

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

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

Переменные передаются явно, как параметры или массивы параметров между функциями? Или переменные установлены во многих разных местах и ​​передаются неявно как глобальные переменные? Если это' В (хорошем) явном случае вы можете выполнить модульное тестирование функции: (1) включив файл, содержащий функцию, затем (2) напрямую загрузив тестовые значения функции, и (3) зафиксировав вывод и подтвердив его. Если вы используете глобальные переменные, вам просто нужно быть особенно осторожным (как указано выше в примере $ _POST), чтобы тщательно обнулить все глобальные переменные между тестами. Также особенно полезно, чтобы тесты были очень маленькими (5-10 строк, 1-2 утверждения) при работе с функцией, которая подталкивает и извлекает множество глобальных объектов.

Еще одна основная проблема заключается в том, работают ли функции, возвращая результат, или путем изменения переданных параметров, вместо этого возвращая true / false. В первом случае тестирование проще, но, опять же, это возможно в обоих случаях:

// assuming you required the file of interest at the top of the test file
public function testShouldConcatenateTwoStringsAndReturnResult()
{
  $stringOne = 'foo';
  $stringTwo = 'bar';
  $expectedOutput = 'foobar';
  $output = myCustomCatFunction($stringOne, $stringTwo);
  $this->assertEquals($expectedOutput, $output);
}

В плохом случае, когда ваш код работает за счет побочных эффектов и возвращает истину или ложь,

36
ответ дан 28 November 2019 в 00:08
поделиться

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

Итак, если у вас есть процедурная база кода, вы можете выполнить это, вызывая свои функции в методы тестирования

require 'my-libraries.php';
class SomeTest extends SomeBaseTestFromSomeFramework {
    public function testSetup() {
        $this->assertTrue(true);
    }

    public function testMyFunction() {
        $output = my_function('foo',3);

        $this->assertEquals('expected output',$output);
    }
}

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

Если в вашем коде нет функций, и он представляет собой просто серию файлов PHP, которые выводят HTML-страницы, вам не повезло. Ваш код не может быть разделен на отдельные блоки, а это значит, что модульное тестирование не принесет вам особой пользы. Лучше провести время на уровне «приемочного тестирования» с такими продуктами, как Selenium и Watir . Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.

Ожидайте, что когда-нибудь вы дойдете до того момента, когда вы сможете включить код своей библиотеки и выполнить простой тест (функция testSetup выше).

Если в вашем коде нет функций, и он представляет собой просто серию файлов PHP, которые выводят HTML-страницы, вам не повезло. Ваш код не может быть разделен на отдельные блоки, а это значит, что модульное тестирование не принесет вам особой пользы. Лучше провести время на уровне «приемочного тестирования» с такими продуктами, как Selenium и Watir . Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.

Ожидайте, что когда-нибудь вы дойдете до того момента, когда вы сможете включить код своей библиотеки и выполнить простой тест (функция testSetup выше).

Если в вашем коде нет функций, и он представляет собой просто серию файлов PHP, которые выводят HTML-страницы, вам не повезло. Ваш код не может быть разделен на отдельные блоки, а это значит, что модульное тестирование не принесет вам особой пользы. Лучше провести время на уровне «приемочного тестирования» с такими продуктами, как Selenium и Watir . Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.

и это просто серия файлов PHP, которые выводят HTML-страницы, вам не повезло. Ваш код не может быть разделен на отдельные блоки, а это значит, что модульное тестирование не принесет вам особой пользы. Лучше провести время на уровне «приемочного тестирования» с такими продуктами, как Selenium и Watir . Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.

и это просто серия файлов PHP, которые выводят HTML-страницы, вам не повезло. Ваш код не может быть разделен на отдельные блоки, а это значит, что модульное тестирование не принесет вам особой пользы. Лучше провести время на уровне «приемочного тестирования» с такими продуктами, как Selenium и Watir . Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.

Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.

Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.

6
ответ дан 28 November 2019 в 00:08
поделиться

Вы можете попытаться включить свой неоперативный код в тестовый класс, используя

require_once 'your_non_oop_file.php' # Contains fct_to_test()

И с помощью phpUnit вы определяете свою тестовую функцию:

testfct_to_test() {
   assertEquals( result_expected, fct_to_test(), 'Fail with fct_to_test' );
}
1
ответ дан 28 November 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: