Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Unit-test
быстрый старт

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

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

ssh
Пробные запуски
тестов выполняются
на сервере через
ssh.

разработано WebGloss
Термины
●
●

сборка - слепок состония системы и тестов
тесткейс (тест)- список действий, переводящих систему из одного состояния в другое, для
получения результата, на основании которого можно сделать вывод о удовлетворении
реализации, поставленным требованиям

разработано WebGloss
Термины
●
●
●
●

тестсюит - набор тесткейсов
фикстура - начальный набор данных
пограничные ситуации – случае, когда тестируемый код может работать неверно
тестовое окружение (fixture) - параметры тестируемой среды называются

разработано WebGloss
Структура репы

/root
src

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

test
conf

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

source

Файлы с тестами. Внутри source
файловая архитектура такаяже как
и в src
разработано WebGloss
Пример файловой архитектуры

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
Этапы процесса Unit тестирования

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

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

3) Создание билда в
CI (Continuous
Integration)

разработано WebGloss
Этапы процесса Unit тестирования

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

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

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

1. Тесты для класса DemoClass содержатся в классе
DemoClassTest.
2. DemoClassTest унаследован (чаще всего) от
PHPUnit_Framework_TestCase.
3. Тесты это публичные методы с именами test* (кроме
этого, можно использовать аннотацию @test в
док-блоке чтобы пометить метод как тест)
4. Внутри тестовых методов для проверки того что
реальные данные соответствуют ожидаемым
используются методы-утверждения (assertion
methods)
разработано WebGloss
Межтестовые зависимости

Использвание аннотации @depends для описания
зависимостей
class DependencyFailureTest extends PHPUnit_Framework_TestCase
{
public function testOne()
{
$this->assertTrue(FALSE);
}
/**
* @depends testOne
*/
public function testTwo()
{ }
}
разработано WebGloss
Провайдеры данных

Метод провайдера данных должен быть 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
Тестирование исключений

С помощью аннотации @expectedException можно
проверить было ли вызвано исключение в тестируемом
коде
class ExceptionTest extends PHPUnit_Framework_TestCase
{
/**
* @expectedException InvalidArgumentException
*/
public function testException()
{
}
}
Дополнительно можно использовать @expectedExceptionMessage и
@expectedExceptionCode в сочетании с @expectedException для проверки
сообщений и кодов исключений.
разработано WebGloss
Утверждения (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()
Утверждения (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
Пример результата теста
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.
Последовательный вызов
1.
2.
3.
4.
5.
6.
7.
8.

__construct
setUpBeforeClass
setUp
assertPreConditions
assertPostConditions
tearDown
onNotSuccessfulTest
tearDownAfterClass

разработано WebGloss
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
Последовательный вызов

Вывод:
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
Примеры тестов
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
Неожиданность

По умолчанию, PHPUnit выполняет тесты таким
образом, что изменение глобальных и суперглобальных
переменных:
● $GLOBALS
● $_ENV
● $_POST
● $_GET
● $_COOKIE
● $_SERVER
● $_FILES
● $_REQUEST
не влияет на другие тесты (очищаються)
разработано WebGloss
Передача параметров
Варианты:
1.
Статические атрибуты классов
2.
Подход "источник-приемник" с использованием аннотации @depends
public function testEmpty()
return $stack;
}
/**
* @depends testEmpty

3.

*/

public function testPush(array $stack)

Атрибут $sharedFixture доступен во всех объектах классов

разработано WebGloss
Вопросы на проработку
1.
2.
3.
4.
5.

PHPUnit_Framework_TestSuite - класс позволяет организовать набор тестов в
иерархическом порядке
Assert`ы самые нужные
Объекты: Mocks, Stubs, Fakes and Spies
Приемочные и модульные тесты, снижение зависимостей
TDD - программирование через тестирование

разработано WebGloss
Полезные сылки
●
●
●

http://phpunit.de/manual/3.5/en/ - сайт разработчика
http://www.smartyit.ru/php/85 - перевод
http://wiki.agiledev.ru/doku.php?id=tdd - про TDD

разработано WebGloss

More Related Content

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