Статьи

Разработка через тестирование на PHP

В предыдущем посте я писал о преимуществах использования Test Driven Development в процессе разработки приложений . Это может быть использовано во всех типах разработки, от программного обеспечения до веб-интерфейса, от интерфейса до фоновых языков. В этой статье я расскажу о том, как использовать Test Driven Development в PHP.

PHPUnit

PHPUnit — это одна из самых популярных платформ автоматизированного тестирования для PHP, которая позволяет вам создавать собственные модульные тесты для процесса разработки, управляемого тестами.

Чтобы использовать PHPUnit, вам нужно установить его на свой сервер Apache с помощью установщика PEAR.

Вы можете увидеть, как установить это на странице PHPUnit Github.

PHPUnit на Github

Для пошагового руководства по использованию PHPUnit в автоматическом тестировании они создали подробную документацию здесь.

PHPUnit Документация

Простой тест

Простой тест — это более простой способ использования PHPUnit, это фреймворк для PHPUnit и фреймворк для веб-тестирования. Разница в том, что PHPunit выполняется исключительно в командной строке, когда Simple Test позволяет вам перейти на веб-страницу, и вы будете отображены с результатами тестов. Это делает его очень простым в использовании в процессе разработки.

Скачать простой тест

Установка PHPUnit с WAMP

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

Если вы используете то же самое, вот как вы установите PHPUnit с WAMP .

Сначала вам нужно установить PEAR, поскольку это необходимо для использования PHPUnit, это шаги для установки PEAR и PHPUnit.

  • Добавьте каталог PHP в переменную окружения Windows PATH. Перейдите в Дополнительные параметры системы, Переменные среды и добавьте свой путь php в переменную PATH C: \ wamp \ bin \ php \ php5.4.3.
  • Загрузите PEAR, перейдите по адресу http://pear.php.net/go-pear.phar и загрузите файл PEAR в свой каталог PHP.
  • Откройте новое окно командной строки и перейдите в каталог php.
  • Запустите файл php go-pear.phar.

Вышеуказанное запустит установку PEAR, теперь мы можем установить PHPUnit с помощью установщика PEAR.

  • Откройте новую командную строку от имени администратора.
  • Запустите команду груша config-set auto_discover 1
  • Запустите команду pear install pear.phpunit.de/PHPUnit
  • Откройте файл php.ini, расположенный в C: \ wamp \ bin \ php \ php5.4.3, и найдите следующие строки

    ; ***** Добавлен go-pear
    include_path = «.; C: \ wamp \ bin \ php \ php5.4.3 \ pear»
    ; *****

  • Скопируйте эти файлы в файл apache php.ini, расположенный в C: \ wamp \ bin \ apache \ apache2.2.22 \ bin.
  • Перезапустите WAMP

Теперь у вас будет установлен PHPUnit, и вы сможете начать писать свои модульные тесты.

Написание юнит-тестов

Прежде чем вы начнете писать свои модульные тесты, вам нужно настроить файл конфигурации теста, чтобы сообщить PHPUnit, где искать ваши модульные тесты.

Создайте новый файл XML и добавьте следующий код в файл конфигурации phpunit.

<phpunit backupGlobals="true"
         backupStaticAttributes="false"
         cacheTokens="false"
         colors="false"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         forceCoversAnnotation="false"
         mapTestClassNameToCoveredClassName="false"
         printerClass="PHPUnit_TextUI_ResultPrinter"
         processIsolation="false"
         stopOnError="false"
         stopOnFailure="false"
         stopOnIncomplete="false"
         stopOnSkipped="false"
         testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
         strict="false"
         verbose="false">
         <testsuites>
           <testsuite name="Test Title">
             <directory>/path/to/your/test/directory</directory>
             <file>/file/of/tests.php</file>
           </testsuite>
         </testsuites>
</phpunit>

Существуют различные типы функций, которые вы можете использовать с PHPUnit.

  • function setUp () — Первое, что будет запущено перед вашими тестами, должно быть использовано для настройки любых глобальных переменных.
  • function test * () — запуск теста с префиксом функции перед словом test.
  • function tearDown () — последняя функция, запускаемая в ваших тестах, должна использоваться в качестве очистки.

Утверждения

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

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

assertTrue($x) Ошибка, если $ x ложно
assertFalse($x) Ошибка, если $ x истинно
assertNull($x) Ошибка, если $ x установлен
assertNotNull($x) Ошибка, если $ x не установлен
assertIsA($x, $t) Ошибка, если $ x не является классом или типом $ t
assertNotA($x, $t) Ошибка, если $ x принадлежит к классу или типу $ t
assertEqual($x, $y) Ошибка, если $ x == $ y равно false
assertNotEqual($x, $y) Ошибка, если $ x == $ y верно
assertWithinMargin($x, $y, $m) Ошибка, если abs ($ x — $ y) <$ m ложно
assertOutsideMargin($x, $y, $m) Неудача, если abs ($ x — $ y) <$ m верно
assertIdentical($x, $y) Ошибка, если $ x == $ y равно false или не соответствует типу
assertNotIdentical($x, $y) Ошибка, если $ x == $ y верно и типы совпадают
assertReference($x, $y) Сбой, если $ x и $ y не являются одной и той же переменной
assertClone($x, $y) Сбой, если $ x и $ y не являются идентичными копиями
assertPattern($p, $x) Сбой, если регулярное выражение $ p не соответствует $ x
assertNoPattern($p, $x) Ошибка, если регулярное выражение $ p соответствует $ x
expectError($x) Глотает любую предстоящую ошибку соответствия
assert($e) Ошибка при сбое объекта ожидания $ e

Unit Test A Калькулятор

Мы собираемся создать очень простой калькулятор, который будет иметь 4 функции для сложения, вычитания, деления и умножения. Мы также собираемся создать несколько модульных тестов с PHPunit для проверки правильности работы калькулятора.

В истинном стиле разработки, основанном на тестировании, мы начинаем с создания тестов для калькулятора, мы знаем 4 основных требования, которые мы хотим, чтобы калькулятор выполнял, чтобы мы могли начать с создания тестов для них.

Создайте новый PHP-файл в своей тестовой директории и добавьте следующий код.

<?php
class CalculatorTests extends PHPUnit_Framework_TestCase
{
	/**
	 * Test to add two numbers
	 */
	public function testadd()
	{
	}
	/**
	 * Test to subtract two numbers
	 */
	public function testsubtract()
	{
	}
	/**
	 * Test to multiple two numbers
	 */
	public function testmultiple()
	{
	}
	/**
	 * Test to divide two numbers
	 */
	public function testdivide()
	{
	}
}
?>

Теперь у нас есть 4 теста, которые будут выполняться при запуске этого файла с PHPUnit, но тесты пока ничего не делают, так как нам нужно запустить функции, которые будут добавлены в класс calculator.

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

private $calculator;
protected function setUp()
{
	require_once 'Calculator.php';
	$this->calculator = new Calculator();
}
protected function tearDown()
{
	$this->calculator = NULL;
}

Теперь у нас есть доступ к переменной calculator внутри этого класса calculatorTest, которую мы можем использовать для запуска метода add в классе.

В этом тесте будет запущен метод add, передающий два параметра, и возвращаемое значение переходит в переменную с именем $ equals, затем мы используем метод assertEquals, чтобы убедиться, что переменная $ equals — это то, что мы ожидаем.

/**
 * Test to add two numbers
 */
public function testadd()
{
	$equals = $this->calculator->add( 1, 2 );
	$this->assertEquals(3, $equals);
}

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

Вот полный класс CalculatorTests.

<?php
class CalculatorTests extends PHPUnit_Framework_TestCase
{
	private $calculator;
	protected function setUp()
	{
		require_once 'calculator.php';
		$this->calculator = new Calculator();
	}
	protected  function tearDown()
	{
		$this->calculator = NULL;
	}
	/**
	 * Test to add two numbers
	 */
	public function testadd()
	{
		$equals = $this->calculator->add( 1, 2 );
		$this->assertEquals(3, $equals);
	}
	/**
	 * Test adding string
	 */
	public function testaddString()
	{
		$equals = $this->calculator->add( "1", "2" );
		$this->assertEquals(3, $equals);
	}
	/**
	 * Test adding null
	 */
	public function testaddNull()
	{
		$equals = $this->calculator->add( NULL, NULL );
		$this->assertFalse($equals);
	}
	/**
	 * Test to subtract two numbers
	 */
	public function testsubtract()
	{
		$equals = $this->calculator->subtract( 2, 1 );
		$this->assertEquals(1, $equals);
	}
	/**
	 * Test to subtract two numbers
	 */
	public function testsubtractString()
	{
		$equals = $this->calculator->subtract( "2", "1" );
		$this->assertEquals(1, $equals);
	}
	/**
	 * Test to subtract two numbers
	 */
	public function testsubtractNull()
	{
		$equals = $this->calculator->subtract( NULL, NULL );
		$this->assertFalse($equals);
	}
	/**
	 * Test to multiple two numbers
	 */
	public function testmultiple()
	{
		$equals = $this->calculator->multiple( 1, 2 );
		$this->assertEquals(2, $equals);
	}
	/**
	 * Test to multiple two numbers
	 */
	public function testmultipleString()
	{
		$equals = $this->calculator->multiple( "1", "2" );
		$this->assertEquals(2, $equals);
	}
	/**
	 * Test to multiple two numbers
	 */
	public function testmultipleNull()
	{
		$equals = $this->calculator->multiple( NULL, NULL );
		$this->assertFalse($equals);
	}
	/**
	 * Test to divide two numbers
	 */
	public function testdivide()
	{
		$equals = $this->calculator->divide( 10, 2 );
		$this->assertEquals(5, $equals);
	}
	/**
	 * Test to divide two numbers
	 */
	public function testdivideString()
	{
		$equals = $this->calculator->divide( "10", "2" );
		$this->assertEquals(5, $equals);
	}
	/**
	 * Test to divide two numbers
	 */
	public function testdivideNull()
	{
		$equals = $this->calculator->divide( NULL, NULL );
		$this->assertFalse($equals);
	}
}
?>

Калькулятор Класс

Теперь, когда все тесты настроены, мы можем начать разработку класса Calculator. В этом классе будет только 4 метода сложения, вычитания, умножения и деления.

Следующий код является полным кодом, который будет использоваться для калькулятора, и будет гарантировать, что все тесты пройдут. Создайте новый файл PHP с именем Calculator.php и добавьте следующий код.

<?php
class Calculator
{
	/**
	 * Test to add two numbers
	 *
	 * @param int $number1 First number
	 * @param int $number2 Second number
	 */
	public function add( $number1, $number2 )
	{
		if(!is_numeric($number1) || !is_numeric($number2))
		{
			return false;
		}
		return $number1 + $number2;
	}
	/**
	 * Test to subtract two numbers
	 *
	 * @param int $number1 First number
	 * @param int $number2 Second number
	 */
	public function subtract( $number1, $number2 )
	{
		if(!is_numeric($number1) || !is_numeric($number2))
		{
			return false;
		}
		return $number1 - $number2;
	}
	/**
	 * Test to multiple two numbers
	 *
	 * @param int $number1 First number
	 * @param int $number2 Second number
	 */
	public function multiple( $number1, $number2 )
	{
		if(!is_numeric($number1) || !is_numeric($number2))
		{
			return false;
		}
		return $number1 * $number2;
	}
	/**
	 * Test to divide two numbers
	 *
	 * @param int $number1 First number
	 * @param int $number2 Second number
	 */
	public function divide( $number1, $number2 )
	{
		if(!is_numeric($number1) || !is_numeric($number2))
		{
			return false;
		}
		return $number1 / $number2;
	}
}
?>

Теперь, если вы запустите свои модульные тесты, вы увидите, что все тесты теперь пройдут, и вы проверили возврат функций, даже когда вы передаете различные типы параметров.

Именно так вы используете тестовую разработку с PHP, надеюсь, вы сможете использовать это в своих будущих проектах.