Сценарий приложения (в значительной степени) просто Javascript; plain-old JSON.parse
- ваш лучший вариант для анализа JSON в объектном представлении.
Вы также можете использовать JSON.stringify
для сериализации объекта в строковое представление.
Вы можете юнит-тестировать процедурный 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);
}
В плохом случае, когда ваш код работает за счет побочных эффектов и возвращает истину или ложь,
Какие модульные тесты работают хорошо и для чего их следует использовать, это когда вы у вас есть фрагмент кода, который вы даете некоторое количество входов, и вы ожидаете получить обратно некоторое количество выходов. Идея в том, что когда вы добавляете функциональные возможности позже, вы можете запускать свои тесты и убедиться, что они по-прежнему выполняют старую функциональность таким же образом.
Итак, если у вас есть процедурная база кода, вы можете выполнить это, вызывая свои функции в методы тестирования
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 . Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах. Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах. Это позволит вам автоматизировать браузер, а затем проверять страницы на предмет содержания в виде определенных мест / в формах.Вы можете попытаться включить свой неоперативный код в тестовый класс, используя
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' );
}