Как бы мы тестировали обычными методами php?
В общем не чего особенного, просто проверить соответствует ли содержание переменной или ретурн функции с тем, что мы ожидали.
Например
$а = 2 * 3;
Мы ожидаем и утверждаем, что $а должен быть равен 6, в противном случае случилось чтото непредвиденное и мы должны реагировать на поведение нашей программы, или может даже увидим логическую ошибку совершенную нашим не правильным ожиданием
if ($а !== 6) {
echo "что то не так, я ожидал 6\n";
}
Такая конструкция не очень гибкая, так как кроме "echo" у нас могут возникнуть более интересные методы запоминания результатов теста.
PHPUnit позаботился о многих проблемах и предлагает гибкую возможность для тестов и дает возможность многое настроить через конфигурацию или посредством передачи параметров. Дла этого PHPUnit капсулирует нашi запросы на верность выражения в функции assert (утверждать, заявлять, доказывать).
В классе PHPUnit_Framework_Assert мы можем найти аssert функции.
Функции построены по одинаковому принципу и их можно интуитивно применять
assertXXXXX(один или несколько параметров для проверки , (string)"заявление в случае если проверка не соответствует ожиданию");
Наш пример в PHPunit можно было бы записать так
$this->assertEquals($a,6,'я ожидал 6');
или даже так
$this->assertTrue($a==6,'я ожидал 6');
Список аssert: http://www.phpunit.de/manual/current/en/wr...unit.assertions
Начинать можно действительно с самых простых assertEquals, assertTrue, assertFalse
Ок. Попробуем написать первый тест и запустить его через PHPUnit
Создайте папку для теста и создайте новый файл
PrimitivTest.php
<?php
class PrimitivTest extends PHPUnit_Framework_TestCase {
}
PHPUnit_Framework_TestCase это класс который мы должны наследовать, чтоб написать тест.
Если мы зайдем через консоле в папку с нашим тестом и вызовем тест
papka> phpunit PrimitivTest.php
то получим такое сообщение
PHPUnit 3.7.10 by Sebastian Bergmann.
F
Time: 0 seconds, Memory: 3.25Mb
There was 1 failure:
1) Warning
No tests found in class "PrimitivTest".
FAILURES!
Tests: 1, Assertions: 0, Failures: 1.
Большая буква "F" означает "Failures" ="Провал нашего теста"
Предупреждение говорит о том, что в нашем классе PrimitivTest небыло найдено тестов, а также сказано, что была попытка запущен один тест, что небыло не одного assert-Metoda( Assertions: 0), а также провал теста (Failures: 1)
Исправим ситуацию и напишим в нашем классе первый тестметод. Чтобы метод был расспознан как тест, нужно исполнить по меньшей мере одно из следующих условий:
1) или название метода должно начинатся со слова "test"
2) или метод имеет анатацию @test
/**
* @test
*/
public function ....
попробуем с анататион
<?php
class PrimitivTest extends PHPUnit_Framework_TestCase {
/**
* @test
*/
public function isOneEqualsOne()
{
}
}
если вы опять запустите тест, то получите приблизительно следующее
papka> phpunit PrimitivTest.php
PHPUnit 3.7.10 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.25Mb
OK (1 test, 0 assertions)
Теперь мы видем вместо "F" просто точку "." которая означает, что тест прошол удачно. 1 тест и 0 assertions.
Не смотря на то, что мы не сделали не одной проверки посредством "assert" тест является удачным.
Иногда просто вызов какой нибидь функции внутри теста которая не вызывает ошибки можно рассматривать как удачный тест, но в нашем случае исходя из имя функции мы хотим проверить является ли 1==1 и по этому впишим в нее проверку этого утверждения посредством assert. Изменим функцию так:
/**
* @test
*/
public function isOneEqualsOne()
{
$this->assertEquals(1,1,"impossible 1!=1");
}
Если вы запустите тест, то увидите в результате первую assertion : "OK (1 test, 1 assertions)"
Для того, чтоб понять как работают приметивные утверждения (asserts) создайте новый класс
AssertionsTest.php
<?php
/**
* test Assertions
* Рассматримаем только позитивно прошедшие тесты
*/
class AssertionsTest extends PHPUnit_Framework_TestCase
{
/**
* assertTrue() and assertFalse
* @test
*/
public function TrueAndFalse()
{
//тестируем равняется ли переменная true
$variable = true;
$this->assertTrue($variable, '$variable is not equals true');
//тестируем равняется ли переменная false
$variable = false;
$this->assertFalse($variable, '$variable is not equals false');
}
/**
* тест на сравнение переменных
* @test
*/
public function compareMethods()
{
$a = 10;
$b = '10';
//ожидаем, что $a и $b одинаковы без учета типа
$this->assertEquals($a, $b, '$a and $b are not equals');
//ожидаем, что $a и $b не одинаковы без учета типа
$a = 9;
$this->assertNotEquals($a, $b, '$a and $b are equals');
//иногда требуется допустить при сравнении толерантность
//3-й параметр в функциях assertEquals и assertNotEquals
//разрешает указать на сколько разрешина толерантность.
$tolerance = 1.5;
$this->assertEquals(
$a, $b, '$a and $b are not equals' , $tolerance
);
//assetNotEquals при толерантности 1.5 должен иметь
//разницу между переменными большей 1.5.
//Тоесть при сравнении 8.5 с 10 переменные являются еще одинаковыми,
//а при сравнении 8.5 и 10.1 уже нет
$this->assertNotEquals(
8.5, 10.1, '$a and $b are not equals' , $tolerance
);
//для быстрого сравнениа с учетом типа переменных
// or assertTrue($var1 === $var2)
$this->assertSame(16,16);
$this->assertNotSame(17,16);
}
}
и попробуйте запустить его с командной строки "phpunit AssertionsTest.php"
Почитайте коментарии в классе и попробуйте, поэксперементировать с переменными, так, чтоб получить неудачные тесты и постарайтесь техт который выдает phpunit после удачных и неудачных тестов.
Продолжение следует.
_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();