phpunit тестирование приватных методов, все типы assert`ов в phpunit

phpunit

Рассмотрим процесс тестирования приватного метода на простом примере. Нам нужно протестировать метод myPrivateMethod класса MyClass. Протестируем приватный метод класса с передачей в него параметров. Пусть наш тестируемый класс выглядит так:

Class MyClass()
{
    private myPrivateMethod($param1, $param2)
    {
        return $param1 * $param2;
    }
}

Тогда тест приватного метода с использованием рефлексии может быть написан следующим образом:

class MyClassTest extends PHPUnit_Extensions_Database_TestCase 
{
    public function testMyPrivateMethod()
    {
        $class = new ReflectionClass('MyClass');
        $method = $class->getMethod('myPrivateMethod');
        $method->setAccessible(true);
        $obj = new MyClass();

        $result = $method->invoke($obj, 2, 10);
        $this->assertEquals(20, $result);

        $result = $method->invoke($obj, 2, 0);
        $this->assertEquals(0, $result);
    }
}

Мы получили приватный метод класса с помощью reflection класса, сделали его публичным setAccessible(true). Затем вызываем этот метод (myPrivateMethod) с передачей в него параметров $result = $method->invoke($obj, 2, 10); В метод invoke первым параметром передаётся объект класса, а остальные параметры (2,10) – передадутся как параметры в метод $method.

Следующая строчка кода вызывает приватный метод myPrivateMethod класса MyClass с параметрами $param1=2 и $param2=10.

$result = $method->invoke($obj, 2, 10);

Все типы assert`ов в phpunit. 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()

 

Пример тестирование метода, который должен выкинуть Exception, ожидание определённого Exception:

/**
 * @expectedException Core_Exception
 * @expectedExceptionMessage Router hz_hz_hz not registered in container
 */
public function testGetUnregisteredRouterThrowException()
{
    $router = TaskQueue_Router_Container::getRouter('hz_hz_hz');
}

Как запретить phpunit тестировать конкретный метод (skip method test)?

public function testGetUnregisteredRouterThrowException()
{
    return $this->markTestSkipped();

    $router = TaskQueue_Router_Container::getRouter('hz_hz_hz');
}

Передача аргументов в тестируемый метод. Функция testActualIp будет вызвана столько раз, сколько наборов данных есть в функции, указанной с помощью ключевого слова @dataProvider:

/**
 * @dataProvider forwardedIpsProvider
 */
public function testActualIp($env, $server, $actualIp)
{
	$request = new Http_Request(array(), array(), array(), $server, $env);
	
	$this->assertEquals($actualIp, $request->getActualClientIP());
}

public function forwardedIpsProvider()
{
	return array(
		array(
			'ENV' 	=> array(
				'HTTP_X_REAL_IP' => '129.78.138.66',
			),
			'SERVER' => array(
				'REMOTE_ADDR' => '127.0.0.1',
			),
			'actualIp' 	=> '129.78.138.66',
		),
		array(
			'ENV' 	=> array(
				'HTTP_X_FORWARDED_FOR' => '129.78.138.66, 129.78.64.103, 129.78.64.182',
			),
			'SERVER' => array(
				'REMOTE_ADDR' => '127.0.0.1',
			),
			'actualIp' 	=> '129.78.138.66',
		),
	);
}

И последнее. Пишите код и тесты без ошибок, тогда ваши тесты будут проходить так:

eugene-PC:tests (b4.1) eugene$ phpunit Wi/Software/Detector/Signature/
PHPUnit 3.7.19 by Sebastian Bergmann.
 
Configuration read from /var/www/wi-backend/www/tests/phpunit.xml
 
.............................................................   61 / 1236 (  4%)
.............................................................  122 / 1236 (  9%)
.............................................................  183 / 1236 ( 14%)
.............................................................  244 / 1236 ( 19%)
.............................................................  305 / 1236 ( 24%)
.............................................................  366 / 1236 ( 29%)
.............................................................  427 / 1236 ( 34%)
.............................................................  488 / 1236 ( 39%)
.............................................................  549 / 1236 ( 44%)
.............................................................  610 / 1236 ( 49%)
.............................................................  671 / 1236 ( 54%)
.............................................................  732 / 1236 ( 59%)
.............................................................  793 / 1236 ( 64%)
.............................................................  854 / 1236 ( 69%)
.............................................................  915 / 1236 ( 74%)
.............................................................  976 / 1236 ( 78%)
............................................................. 1037 / 1236 ( 83%)
............................................................. 1098 / 1236 ( 88%)
............................................................. 1159 / 1236 ( 93%)
............................................................. 1220 / 1236 ( 98%)
................
 
Time: 4 seconds, Memory: 54.75Mb
 
OK (1236 tests, 1236 assertions)
 
 
 

icon Комментарии 80

 ggg 11 лет назад
Это, конечно, интересно, но как сделать тест приватного скользкого шланга?
 root 11 лет назад
Сначала покажи, как выглядит класс, который надо протестировать, тогда подумаем.
 suzanna 11 лет назад
хватит меня кикать!!!!
 suzanna 11 лет назад
> Сначала покажи, как выглядит класс, который надо протестировать, тогда подумаем.
о чем тут думть, протестируй меня, ребята говорят я классная
 suzanna 11 лет назад
root, ты не любишь женщин?
 root 11 лет назад
Suzanna, в этом посте мы занимаемся юнит тестированием.
Личные вопросы можете задавать на email или в skype http://jeka.by/feedback
Спасибо!
 suzanna 11 лет назад
а что такое юнит тестирование? займись лучше мной!
 soloduha 11 лет назад
Рут попробуй Сюзану, она та ещё
 suzanna 11 лет назад
Да, помню я как мы с тобой отжигали, может повторим и возьмём рута
 ggg 11 лет назад
root а Вы служили в армии?
 root 11 лет назад
Юнит-тестирование (или модульное тестирование) - процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Почитай википедию http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.
Судя по твоей аве и статусу, тебя больше интересует не программирование, скорее всего ты ошиблась сайтом.
 suzanna 11 лет назад
он походу цвета неба
 ggg 11 лет назад
> Сначала покажи, как выглядит класс, который надо протестировать, тогда подумаем.
class SkolzkiyShlang( kuda ){

}
 suzanna 11 лет назад
как некрасиво писать такое девушке
 suzanna 11 лет назад
root, где смайлы для комментов?
 suzanna 11 лет назад
________________________$$$$$$$$$$$$$$
____________________$$$$______________$$$$$
_______________$$$$$_______________________$$$$$
___________$$$$______$$$$$$$______$$$$$$$$______$$$
_________$$$_______$$______$$____$$______$$_______$$$
_______$$$________$$________$$__$$________$$________$$$
_____$$$_________$$__________$$$$__________$$_________$$$
____$$$__________$$__________$$$$__________$$__________$$$
___$$$__________$$____$$$$$$$_$$_$$$$$$$____$$__________$$$
__$$$___________$$___$$$$$$$$$$$$$$$$$$$$___$$___________$$$
_$$$____________$$__$$$$$$$$$$$$$$$$$$$$$$__$$____________$$$
$$$_____________$$__$$$$$$$$$$$$$$$$$$$$$$__$$_____________$$$
$$$_____________$$__$$$$$$$$$$$$$$$$$$$$$$__$$_____________$$$
$$$_____________$$___$$$$$$$$$$$$$$$$$$$$$__$$_____________$$$
$$$______$$______$$$$$$$$$$$$$$$$$$$$$$$$$$$$_______$$_____$$$
$$$___$$$$$_________________________________________$$$$___$$$
_$$$______$$_________________$$_$$__________________$$_____$$$
__$$$______$$$________________$_$_______________$$$______$$$
___$$$_______$$$_____________________________$$$________$$$
____$$$________$$$$$______________________$$$$$________$$$
_____$$$___________$$$$$$____________$$$$$$___________$$$
_______$$$______________$$$$$$$$$$$$$$$_____________$$$
_________$$$$____________________________________$$$$
____________$$$$______________________________$$$$
________________$$$$$_____________________$$$$$
____________________$$$$$$$_________$$$$$$$
___________________________$$$$$$$$$$
 suzanna 11 лет назад
__________________________|`_\/_\/_\,',_
_________________________;__________`_\/\,._
________________________:_______________`_\,/_
________________________|__________________/_
________________________;_________________:_
________________________:__________________;_
______________________|______,---.______/_
_____________________:_____,'_____`,-.__\_
_____________________;____(___o____\___`'_
_____________ _______:______.______,'__o_;_
___________________/,.`______`.__,'`-.__,_
___________________\___________________\_
__________________,'__/_`,__________`.,'_
_______________,'`-.__\_/_`,._________;_
___________;_,'______`-.`-'./_`--.____)_
______,-'____________,--\^-'_
____,:___________,-'_____\_
___(,'_____`--.__\;-._____;_
___:____Y______`-/____`,__:_
___:____:_______:_____/_;'_
___:____:_______|____:_
____\____\______:____:_
_____`-.__`-.__,_\____`._
________\___\__`._\_____`._
______,-;____\---)_\_,','/_
______\__`---'--'"_,'^-;'_
______(_`_____---'"_,-')_
______/_`--.__,._,-'____\_
__-____)-.__,--_||___,--'_`-._
_____/._______,|__________,'\_
_____`--.____,'|_________,-'_
 suzanna 11 лет назад
............./´¯/).................(\¯`\
............/....//..................\\....\
.........../....//....................\\....\
...../´¯/..../´¯\............../¯` \....\¯`\
.././.../..../..../.|_........_|.\....\....\...\.\..
(.(....(....(..../..)..)…...(..(.\....)....)....).)
.\................\/.../......\...\/................/
..\.................. /.........\................../
....\................(...........).............../
......\...............\........./............../
 Ghena 11 лет назад
Нормал
 suzanna 11 лет назад
Ghena где стих?
 Ghena 11 лет назад
Пись пись пись, заебись!
 Ghena 11 лет назад
suzanna, как ты себя чувствуешь?
 suzanna 11 лет назад
я вся горю
 suzanna 11 лет назад
я все мокрая
 suzanna 11 лет назад
Ghena го за грибами в лесок
 Ghena 11 лет назад
>я все мокрая
нормал
 Vladimir 11 лет назад
паранормал
 suzanna 11 лет назад
Ghena, где Сережа?
 suzanna 11 лет назад
Ghena, тут что одни гомики собрались?
 Ghena 11 лет назад
просто все увидели в детстве хуй и испугались
 suzanna 11 лет назад
Ghena, где касатик?
 Ghena 11 лет назад
в качалочке
 root 11 лет назад
Пздц, ребята, здесь не чат. Геныч, здарова.
А перепесывайтесь в skyp`е.
 Ghena 11 лет назад
Привет.
Женя, как ты себя чувствуешь?
 Ghena 11 лет назад
А что за сайт?
 skype 11 лет назад
я тут
 root 11 лет назад
Ghena, чувствую хорошо!
Придётся вас жэстчайшэ забанить, т.к. много спама в комментах.
 suzanna 11 лет назад
если забанишь, кто останется на сайте? зачем это тебе
 Ghena 11 лет назад
"жэстчайшэ" - так Вова говорит
 Ghena 11 лет назад
можешь банить, я так и не понял что это за сайт
 root 11 лет назад
Тут статьи по веб-разработке можно читать. Но есть и другие статьи, например, Как сделать самогонный аппарат своими руками.
 suzanna 11 лет назад
root что за chmod?
 suzanna 11 лет назад
root, хочешь поставить меня в неловкое положение?
 root 11 лет назад
Suzanna, Где в этом посте вы увидели упоминание про chmod?
Вообще chmod это unix команда, позволяет задавать права на файлы и каталоги.
Я бы вам рекомендовал почитать про основные команды в linux: http://jeka.by/post/1001/osnovnie-komandi-linux/
Suzanna, я тебя не хочу ставить, ты заблуждаешься.
 root 11 лет назад
Сюзана, у тебя походу на всё выставлен доступ 777, я угадал?
chmod -R 777 /
 suzanna 11 лет назад
> Suzanna, я тебя не хочу ставить, ты заблуждаешься.
совсем не хочешь меня поставить (
> Сюзана, у тебя походу на всё выставлен доступ 777, я угадал?
да, угадал, можешь меня рандомить везде и мэржыть.
 suzanna 11 лет назад
root у тебя стоит сэттаймаут?
 suzanna 11 лет назад
root какой у тебя размер?
 suzanna 11 лет назад
т.е. на сколько ты ставишь сеттаймаут?
 root 11 лет назад
Где сеттаймаут? В комментах нету setTimeout. Вот позырь: http://jeka.by/assets/js/post/post_view.js
 suzanna 11 лет назад
я имела ввиду ты меня рендерить будешь по таймауту?
 suzanna 11 лет назад
я уже такие слова знаю, спасибо жека.бай
 suzanna 11 лет назад
так тяжело модерировать или нет?
сколько обрабатываешь таких как я?
 root 11 лет назад
нет проблем.
 suzanna 11 лет назад
что к чему
 root 11 лет назад
таких как ты модерировать не тяжело. Мои модераторы пачками таких модерируют.
 suzanna 11 лет назад
root что тебя заводит?
 suzanna 11 лет назад
буду писать статью по верстке
root что такое пипетка и как ей пользоваться?
если не сложно дай свою потаскать
 root 11 лет назад
напиши статью по вёрстке, займись полезным делом. Будет круто!
Ты же будешь писать, вот и разберись что это такое и с чем едят.
 suzanna 11 лет назад
походу ты не умеешь пользоваться пипеткой
 suzanna 11 лет назад
тебе можно писать про анус, а мне нет?
 suzanna 11 лет назад
извращенец
 root 11 лет назад
Сюзаннаааа, ты копец жёсткий спамер. Турну тебя, если не остановишься и будешь продолжать постить не по теме.
 suzanna 11 лет назад
root, извини, была в экстазе
 root 11 лет назад
Suzanna, ок, для нас всех было очень важно знать это.
 suzanna 11 лет назад
root, ничего с собой поделать не могу, ты меня заводишь
 suzanna 11 лет назад
по теме:
class ШпилиВили
{
private function шпилиВили( root, suzanna ){
return (root + suzanna) * 10;
}
}

как протестировать?
 root 11 лет назад
Suzanna, что за херня?
В PHP русские буквы в именах классов и функций не могут быть. Странное название функции и класса.
Сначала проверяй хотя бы минимальную работоспособность, а потом пиши phpunit
 suzanna 11 лет назад
> В PHP русские буквы в именах классов и функций не могут быть.
почему, этож утф8?
 root 11 лет назад
Кодировка файла может быт utf8, а может быть не utf8, это не важно.
Ты можешь работать с данными в utf8, а имена методов строго латиница.
 root 11 лет назад
Сюзанна, сори. Кириллица, оказывается, может быть и в именах методов. Но я бы очень не рекомендовал её использовать! Надо всё на латинице.
 suzanna 11 лет назад
ok, ну так что будем делать со шпили-вили?
 suzanna 11 лет назад
смотрю ты устал, может массаж?
 suzanna 11 лет назад
 suzanna 11 лет назад




 suzanna 11 лет назад
root, нужно написать новый пост, здесь уже много комментов
 root 11 лет назад
Сюзанна, красава, классные смайлы ))))
 suzanna 11 лет назад
пиши новый пост, будет что обсудить
 suzanna 11 лет назад
Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ