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 3 года назад
Это, конечно, интересно, но как сделать тест приватного скользкого шланга?
 root 3 года назад
Сначала покажи, как выглядит класс, который надо протестировать, тогда подумаем.
 suzanna 3 года назад
хватит меня кикать!!!!
 suzanna 3 года назад
> Сначала покажи, как выглядит класс, который надо протестировать, тогда подумаем.
о чем тут думть, протестируй меня, ребята говорят я классная
 suzanna 3 года назад
root, ты не любишь женщин?
 root 3 года назад
Suzanna, в этом посте мы занимаемся юнит тестированием.
Личные вопросы можете задавать на email или в skype http://jeka.by/feedback
Спасибо!
 suzanna 3 года назад
а что такое юнит тестирование? займись лучше мной!
 soloduha 3 года назад
Рут попробуй Сюзану, она та ещё
 suzanna 3 года назад
Да, помню я как мы с тобой отжигали, может повторим и возьмём рута
 ggg 3 года назад
root а Вы служили в армии?
 root 3 года назад
Юнит-тестирование (или модульное тестирование) - процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Почитай википедию 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 3 года назад
он походу цвета неба
 ggg 3 года назад
> Сначала покажи, как выглядит класс, который надо протестировать, тогда подумаем.
class SkolzkiyShlang( kuda ){

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

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




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

ctrl+enter

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

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