Unit-test
быстрый старт

разработано WebGloss
Разработка и отладка тестов

IDE
Тест
разрабатывается в
IDE, затем по
средствам IDE тест
заливается на
тестовый сервер

ss...
Термины
●
●

сборка - слепок состония системы и тестов
тесткейс (тест)- список действий, переводящих систему из одного сос...
Термины
●
●
●
●

тестсюит - набор тесткейсов
фикстура - начальный набор данных
пограничные ситуации – случае, когда тестир...
Структура репы

/root
src

Тестируемый код

test
conf

Конфиги для запуска тестов

source

Файлы с тестами. Внутри source
...
Пример файловой архитектуры

commandsutilsdatetimenext_working_day.php
testssourcecommandsutilsdatetimeNext_workin
g_dayTe...
Этапы процесса Unit тестирования

1) Создание теста

2) Вкладка теста в VCS

3) Создание билда в
CI (Continuous
Integratio...
Этапы процесса Unit тестирования

4) Запуск Unit тестов в
нужном окружении.

5) Просмотр и анализ
результатов.

разработан...
Базовые соглашения

1. Тесты для класса DemoClass содержатся в классе
DemoClassTest.
2. DemoClassTest унаследован (чаще вс...
Межтестовые зависимости

Использвание аннотации @depends для описания
зависимостей
class DependencyFailureTest extends PHP...
Провайдеры данных

Метод провайдера данных должен быть public и возвращать
либо массив массивов либо объект реализующий ин...
Тестирование исключений

С помощью аннотации @expectedException можно
проверить было ли вызвано исключение в тестируемом
к...
Утверждения (Assertions)
assertArrayHasKey()
assertClassHasAttribute()
assertClassHasStaticAttribute()
assertContains()
as...
Утверждения (Assertions)

1.
2.
3.

assertEmpty(mixed $actual[, string $message = ''])
assertEquals(mixed $expected, mixed...
Пример результата теста
phpunit DataTest
class DataTest extends PHPUnit_Framework_TestCase{
PHPUnit 3.7.0 by Sebastian Ber...
Последовательный вызов
1.
2.
3.
4.
5.
6.
7.
8.

__construct
setUpBeforeClass
setUp
assertPreConditions
assertPostCondition...
class TemplateMethodsTest extends PHPUnit_Framework_TestCase{
public static function setUpBeforeClass() {
fwrite(STDOUT, _...
Последовательный вызов

Вывод:
TemplateMethodsTest::setUpBeforeClass
TemplateMethodsTest::setUp
TemplateMethodsTest::asser...
Примеры тестов
class ClsUtilsTest extends PHPUnit_Framework_TestCase {
/**
* @var Util
*/
protected $util;
protected funct...
Неожиданность

По умолчанию, PHPUnit выполняет тесты таким
образом, что изменение глобальных и суперглобальных
переменных:...
Передача параметров
Варианты:
1.
Статические атрибуты классов
2.
Подход "источник-приемник" с использованием аннотации @de...
Вопросы на проработку
1.
2.
3.
4.
5.

PHPUnit_Framework_TestSuite - класс позволяет организовать набор тестов в
иерархичес...
Полезные сылки
●
●
●

http://phpunit.de/manual/3.5/en/ - сайт разработчика
http://www.smartyit.ru/php/85 - перевод
http://...
Upcoming SlideShare
Loading in …5
×

Unit test быстрый старт

1,377 views

Published on

Практические основы тестирования на php Unit-test: понятия, тонкости, пути решения, вопросы для проработки.
PHPUnittest fast start
Разработано http://webgloss.ru

Published in: Technology
1 Comment
1 Like
Statistics
Notes
  • Разработано http://webgloss.ru
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
1,377
On SlideShare
0
From Embeds
0
Number of Embeds
158
Actions
Shares
0
Downloads
0
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

Unit test быстрый старт

  1. 1. Unit-test быстрый старт разработано WebGloss
  2. 2. Разработка и отладка тестов IDE Тест разрабатывается в IDE, затем по средствам IDE тест заливается на тестовый сервер ssh Пробные запуски тестов выполняются на сервере через ssh. разработано WebGloss
  3. 3. Термины ● ● сборка - слепок состония системы и тестов тесткейс (тест)- список действий, переводящих систему из одного состояния в другое, для получения результата, на основании которого можно сделать вывод о удовлетворении реализации, поставленным требованиям разработано WebGloss
  4. 4. Термины ● ● ● ● тестсюит - набор тесткейсов фикстура - начальный набор данных пограничные ситуации – случае, когда тестируемый код может работать неверно тестовое окружение (fixture) - параметры тестируемой среды называются разработано WebGloss
  5. 5. Структура репы /root src Тестируемый код test conf Конфиги для запуска тестов source Файлы с тестами. Внутри source файловая архитектура такаяже как и в src разработано WebGloss
  6. 6. Пример файловой архитектуры commandsutilsdatetimenext_working_day.php testssourcecommandsutilsdatetimeNext_workin g_dayTest.php Если на класс Next_working_day написать ещё один тест, то оба теста нужно полжить в папку Next_working_day: testssourcecommandsutilsdatetimeNext_working_day/Next_ working_dayTest1.php testssourcecommandsutilsdatetimeNext_working_day/Next_ working_dayTest2.php разработано WebGloss
  7. 7. Этапы процесса Unit тестирования 1) Создание теста 2) Вкладка теста в VCS 3) Создание билда в CI (Continuous Integration) разработано WebGloss
  8. 8. Этапы процесса Unit тестирования 4) Запуск Unit тестов в нужном окружении. 5) Просмотр и анализ результатов. разработано WebGloss
  9. 9. Базовые соглашения 1. Тесты для класса DemoClass содержатся в классе DemoClassTest. 2. DemoClassTest унаследован (чаще всего) от PHPUnit_Framework_TestCase. 3. Тесты это публичные методы с именами test* (кроме этого, можно использовать аннотацию @test в док-блоке чтобы пометить метод как тест) 4. Внутри тестовых методов для проверки того что реальные данные соответствуют ожидаемым используются методы-утверждения (assertion methods) разработано WebGloss
  10. 10. Межтестовые зависимости Использвание аннотации @depends для описания зависимостей class DependencyFailureTest extends PHPUnit_Framework_TestCase { public function testOne() { $this->assertTrue(FALSE); } /** * @depends testOne */ public function testTwo() { } } разработано WebGloss
  11. 11. Провайдеры данных Метод провайдера данных должен быть public и возвращать либо массив массивов либо объект реализующий интерфейс Iterator class DataTest extends PHPUnit_Framework_TestCase { /** * @dataProvider provider */ public function testAdd($a, $b, $c) { $this->assertEquals($c, $a + $b); } public function provider() { return array( array(0, 0, 0), array(0, 1, 1), array(1, 0, 1), array(1, 1, 3) ); } } разработано WebGloss
  12. 12. Тестирование исключений С помощью аннотации @expectedException можно проверить было ли вызвано исключение в тестируемом коде class ExceptionTest extends PHPUnit_Framework_TestCase { /** * @expectedException InvalidArgumentException */ public function testException() { } } Дополнительно можно использовать @expectedExceptionMessage и @expectedExceptionCode в сочетании с @expectedException для проверки сообщений и кодов исключений. разработано WebGloss
  13. 13. Утверждения (Assertions) assertArrayHasKey() assertClassHasAttribute() assertClassHasStaticAttribute() assertContains() assertContainsOnly() assertContainsOnlyInstancesOf() assertCount() assertEmpty() assertEqualXMLStructure() assertEquals() assertFalse() assertFileEquals() assertFileExists() assertGreaterThan() assertGreaterThanOrEqual() assertInstanceOf() assertInternalType() assertJsonFileEqualsJsonFile() assertJsonStringEqualsJsonFile() assertJsonStringEqualsJsonString() assertLessThan() assertLessThanOrEqual() assertNull() assertObjectHasAttribute() assertRegExp() assertStringMatchesFormat() assertStringMatchesFormatFile() assertSame() assertSelectCount() assertSelectEquals() assertSelectRegExp() assertStringEndsWith() assertStringEqualsFile() assertStringStartsWith() assertTag() assertThat() assertTrue() assertXmlFileEqualsXmlFile() assertXmlStringEqualsXmlFile() assertXmlStringEqualsXmlString()
  14. 14. Утверждения (Assertions) 1. 2. 3. assertEmpty(mixed $actual[, string $message = '']) assertEquals(mixed $expected, mixed $actual[, string $message = '']) assertCount($expectedCount, $haystack[, string $message = '']) Сообщает об ошибке $message если количество элементов в $haystack не равно $expectedCount. 4. assertArrayHasKey(mixed $key, array $array[, string $message = '']) Сообщает об ошибке $message если $array не содержит ключа $key. assertArrayNotHasKey() утверждает обратное и принимает тот же набор аргументов 5. assertXmlStringEqualsXmlString(string $expectedXml, string $actualXml[, string $message = '']) 6. ... разработано WebGloss
  15. 15. Пример результата теста phpunit DataTest class DataTest extends PHPUnit_Framework_TestCase{ PHPUnit 3.7.0 by Sebastian Bergmann. /** * @dataProvider provider ...F */ public function testAdd($a, $b, $c){ $this->assertEquals($c, $a + $b); Time: 0 seconds, Memory: 5.75Mb } public function provider(){ return array( array(0, 0, 0), array(0, 1, 1), array(1, 0, 1), array(1, 1, 3) ); } } There was 1 failure: 1) DataTest::testAdd with data set #3 (1, 1, 3) Failed asserting that 2 matches expected 3. /home/sb/DataTest.php:9 FAILURES! Tests: 4, Assertions: 4, Failures: 1.
  16. 16. Последовательный вызов 1. 2. 3. 4. 5. 6. 7. 8. __construct setUpBeforeClass setUp assertPreConditions assertPostConditions tearDown onNotSuccessfulTest tearDownAfterClass разработано WebGloss
  17. 17. class TemplateMethodsTest extends PHPUnit_Framework_TestCase{ public static function setUpBeforeClass() { fwrite(STDOUT, __METHOD__ . "n"); } protected function setUp() { fwrite(STDOUT, __METHOD__ . "n"); } protected function assertPreConditions() { fwrite(STDOUT, __METHOD__ . "n"); } public function testOne() { fwrite(STDOUT, __METHOD__ . "n"); $this->assertTrue(TRUE); } protected function assertPostConditions() { fwrite(STDOUT, __METHOD__ . "n"); } protected function tearDown() { fwrite(STDOUT, __METHOD__ . "n"); } public static function tearDownAfterClass() { fwrite(STDOUT, __METHOD__ . "n"); } protected function onNotSuccessfulTest(Exception $e) { fwrite(STDOUT, __METHOD__ . "n"); throw $e; } } разработано WebGloss
  18. 18. Последовательный вызов Вывод: TemplateMethodsTest::setUpBeforeClass TemplateMethodsTest::setUp TemplateMethodsTest::assertPreConditions TemplateMethodsTest::testOne TemplateMethodsTest::assertPostConditions TemplateMethodsTest::tearDown TemplateMethodsTest::setUp TemplateMethodsTest::assertPreConditions TemplateMethodsTest::testTwo TemplateMethodsTest::tearDown TemplateMethodsTest::onNotSuccessfulTest TemplateMethodsTest::tearDownAfterClass разработано WebGloss
  19. 19. Примеры тестов class ClsUtilsTest extends PHPUnit_Framework_TestCase { /** * @var Util */ protected $util; protected function setUp() { $this->util = Util(); } public function testToUpper() { $link = mysql_connect('', '', ''); $this->assertTrue($link, 'Ошибка соединения: ' . mysql_error()); mysql_close($link); $this->assertEquals($this->util->toUpper('абв'), 'АБВ'); } public function testToLower() { $this->assertEquals($this->util->toLower('ABC'), 'abc'); } public function testCheckEmail() { $this->assertEquals($this->util->checkEmail('gref@mail.ru'), 'gref@mail.ru'); } } разработано WebGloss
  20. 20. Неожиданность По умолчанию, PHPUnit выполняет тесты таким образом, что изменение глобальных и суперглобальных переменных: ● $GLOBALS ● $_ENV ● $_POST ● $_GET ● $_COOKIE ● $_SERVER ● $_FILES ● $_REQUEST не влияет на другие тесты (очищаються) разработано WebGloss
  21. 21. Передача параметров Варианты: 1. Статические атрибуты классов 2. Подход "источник-приемник" с использованием аннотации @depends public function testEmpty() return $stack; } /** * @depends testEmpty 3. */ public function testPush(array $stack) Атрибут $sharedFixture доступен во всех объектах классов разработано WebGloss
  22. 22. Вопросы на проработку 1. 2. 3. 4. 5. PHPUnit_Framework_TestSuite - класс позволяет организовать набор тестов в иерархическом порядке Assert`ы самые нужные Объекты: Mocks, Stubs, Fakes and Spies Приемочные и модульные тесты, снижение зависимостей TDD - программирование через тестирование разработано WebGloss
  23. 23. Полезные сылки ● ● ● http://phpunit.de/manual/3.5/en/ - сайт разработчика http://www.smartyit.ru/php/85 - перевод http://wiki.agiledev.ru/doku.php?id=tdd - про TDD разработано WebGloss

×