- Трохи історії
-Інсталяція PHPUnit
- Структура тесту
- Asserts
- Написання Тестів
- Data Providers
- Mock Objects
- Трохи про TDD
- Два слова про BDD
3.
Трохи історії
SUnit -xUnit framework на Smalltalk (Kent Beck)
JUnit - порт xUnit на Java (Kent Beck & Erich Gamma)
PHPUnit - порт xUnit на PHP (Sebastian Bergmann)
SimpleTest - конкурет PHPUnit
Структура тесту
- Базовийінтерфейс
TestCase/TestSuite implements PHPUnit_Framework_Test
public function run(PHPUnit_Framework_TestResult $result);
- Запуск
$test->run($result):
$result->run($test):
$test->setUpBeforeClass() //once per class
$test->setUp()
$test->runTest()
$test->tearDown()
$test->tearDownAfterClass() //once per class
7.
Структура тесту
- Інтерфейсsuite`a
PHPUnit_Framework_TestSuite implements IteratorAggregate
- Запуск тестів з suite’а
foreach ($suite as $test) {
$test->run();
}
Написання Тестів
class FirstTestextends PHPUnit_Framework_TestCase
{
public function testFirst()
{
$this->assertTrue(true);
}
}
class FirstTest extends PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function first()
{
$this->assertTrue(true);
}
}
11.
Data Providers
public functionfirstDataProvider()
{
return array(
'empty' => array(''),
'incorrect' => array('@#^&!^#*!#')
);
}
/**
* @test
* @dataProvider firstDataProvider
*/
public function first($data)
{
$this->assertFalse($object->validate($data));
}
Трохи про TDD
Простийприклад TDD
Спершу тест:
class EmailTest extends PHPUnit_Framework_TestCase
{
public function testGetDomainFromEmail()
{
$e = new Email();
$this->assertEquals(
'example.com',
$e->getDomainFromEmail('test@examlple.com')
);
}
}
Запускаєм тест. Результат Error.
18.
Трохи про TDD
Найпростішимспособом заставляєм працювати тест.
Підміняєм реалізацію (Fake It).
class Email
{
public function getDomainFromEmail($email)
{
return 'example.com';
}
}
Зелена плоса. Тест спрацьовує.
19.
Трохи про TDD
Рефакторимо.Видаляємо дублювання.
class Email
{
public function getDomainFromEmail($email)
{
return explode('@', $email)[1];
}
}
Зелена плоса. Тест проходить. Метод працює так як нам
потрібно.
20.
Трохи про TDD
Щеодин приклад
Спершу тест:
class EmailTest extends PHPUnit_Framework_TestCase
{
public function testIsEmailValid()
{
$v = new Validator();
$this->assertTrue(
$v->isEmailValid('test@examlple.com')
);
}
}
Запускаєм тест. Результат Error.
21.
Трохи про TDD
Найпростішимспособом заставляєм працювати тест.
class Validator
{
public function isEmailValid($email)
{
return true;
}
}
Зелена плоса. Тест проходить.
22.
Трохи про TDD
Добавимобільше тестових випадків (Triangulate).
public function isEmailValidDataProvider()
{
return array(
'correct' => array('test@example.com', true),
'incorrect' => array('incorrect', false),
);
}
public function testIsEmailValid($email, $expectedResult)
{
//...
$this->assertEquals($expectedResult, $v->isEmailValid
($email));
}
Запускаєм і на цей раз бачим Fail.
Далі пишемо правильну реалізацію.
23.
Трохи про TDD
Якщокод зрозуміло пишіть зразу правильний тест.
(Oblivious Implementation).
24.
Два слова проBDD
- Базується на TDD.
- Описує роботу Бізнесу та Девелоперів.
- Бізнес пише специфікації в вигляді тестів або
специфікації генеруються в тести.
- Девелопери пишуть код так щоб всі тести
спрацьовували.
Рішення для PHP:
Codeception
Behat
PHPUnit_Story
25.
Матеріали
Книжки:
Kent Beck -XP. Test Driven Development
Martin Fowler - Refactoring: Improving the Design of Existing Code
Лінки:
http://www.phpunit.de/manual/3.8/en/index.html
http://behat.org/
http://codeception.com/
http://getcomposer.org/
http://en.wikipedia.org/wiki/Test-driven_development
http://en.wikipedia.org/wiki/Behavior-driven_development