unit тесты для фреймворка

profan

Новичок
unit тесты для фреймворка

Привет

Задача: написать юнит тесты для сайта использующего фреймворк и для самих библиотек фреймворка.

Проблема: в связи с тем что каждый отдельный клас сайта или библиотека фреймворка является зависимым от классов ядра фреймворка, поэтому для вызова их из тестов необходимо или подключать к тестам ядро фреймворка или создавать для тестов заглушки эмулирующие ядро фреймворка, т.е чтобы тесты были независимыми от самого фремворка.

Вопрос: как правильно организовать юнит тесты для фреймворка, в связи с указанной проблемой.
Конечно я не совсем корректно изложил суть, это от того что не все для меня очевидно, но думаю что тот кто сталкивался с проблемой - меня поймет.
Также хочется услышать мнение syfisher о том как это реализовано в Limb PHP Framework. К сожалению еще не его смотрел, решил сначала задать вопрос :)

И еще буду признателен за документацию или статьи о phpunit или junit на русском
(ту что на http://phpclub.ru/detail/article/phpunit предлагать не нужно).
 

profan

Новичок
мок объекты, объясни как этим пользоваться

-~{}~ 06.04.08 06:32:

HraKK только сейчас понял что это ответ, в начале показалось что насмешка над моей формулировкой...

респект, и не обращай внимания на мой первый ответ

-~{}~ 06.04.08 07:13:

приведите пример использования мок объекта пожалуйста, допустим нужно протестировать someMethod

PHP:
class Database extends Database_Core {

	public function __construct()
	{
		parent::__construct();
	}

	public function someMethod()
	{
		$this->driver  ........
	}
}
в someMethod используется $this->driver кот определяется в кострукторе Database_Core. $this->driver содержит массив, элементами кот являются в том числе объекты. Как эмулировать этот $this->driver ???
так же в конструкторе Database_Core используются другие внешние объекты
И еще наверное файл с классом Database_Core подключать не нужно, что соответственно нужно указать phpunit...

-~{}~ 06.04.08 20:34:

Ну тогда скажите хоть, возможно ли моделировать наследование в юнит тестах или если объект имеет родителей то классы с ними бязательно нужно в тесте подключать???
Если да то буду признателен за пример.
 

profan

Новичок
спасибо, хороший материал

но я там увидел только случаи когда объект передается через конструктор или через фабрику
а про наследование не видел

ткните носом плиз, если слепой
 

whirlwind

TDD infected, paranoid
Что означает - моделировать наследование? Наследование - это образование нового типа, как его можно моделировать?

Насколько я понял, ты уже столкнулся с проблемой монолитности. У тебя сейчас 2 пути:

1. Пытаться избавиться от взаимосвязей между классами.
2. Использовать стабы.

Первое подразумевает что ты будешь выполнять рефакторинг существующих классов, добавляя в них мутаторы/акцессоры и заменять зависимость от реализации на зависимость от интерфейса. Если ты не использовал type hinting, то будет проще.

Второе подразумевает, что ты будешь создавать частичные моки и перекрывать определенные методы тестируемого класса, тем самым в тесте ракрывая реализацию класса. Это чревато тем, что в случае изменения кода тестируемого класса тесты могут срабатывать ложно.

Про phpunit не совсем понятно что там читать на русском. Если ты встаешь на путь TDD, то учись схватывать нужную информацию из прототипов. Поверь, товарищи там на символах в именах не экономили - все прозрачно ясно.

ЗЫ. Только что дошло что здесь написано:

> наверное файл с классом Database_Core подключать не нужно, что соответственно нужно указать phpunit

Думаю, ты несколько преждевременно взялся за юнит тестирование. Сначала стоит разобраться с классами.
 

profan

Новичок
>Думаю, ты несколько преждевременно взялся за юнит тестирование. Сначала стоит разобраться с классами.

Не скажу что это не так, но жизнь заставила ))


Действительно очень туго идет процес, не хватает пинка от более опытного пользователя.

-~{}~ 07.04.08 18:00:

Я не буту много умничать, вот первая проблема кот возникает:

Еще до реализации TestCase класса и создания волшебных мок объектов я получаю fatal error при подключении тестируемого класса, так как он не видит родительский класс.

Нужно начинать с азов)) Что мне нужно сделать, скажите плиз
 

whirlwind

TDD infected, paranoid
Ну лично я для тестов каждого проекта как минимум создаю конфиг

PHP:
set_include_path(get_include_path() . PATH_SEPARATOR .
    dirname(__FILE__) . '/..');
require_once 'PHPUnit/Framework.php';
Который подключаю первым делом в кажом файле с кейсом. Примерно так получается

PHP:
require_once dirname(__FILE__).'/testConfig.php';
require_once 'PPCI/Mutator/Extended.php';
require_once 'PPCI/IMutator.php';
// другие require

class PPCI_Mutator_ExtendedTest extends PHPUnit_Framework_TestCase {
    
 // test 

}
Смысл конфига я думаю понятен - сделать доступным все файлы проекта.

ЗЫ. открой файл с классом Database и посмотри есть ли там require файла с классом Database_Core. Если нет, то нужно добавить. На момент подключения файла с классом, класс должен 100% иметь доступ ко всем необходимым ресурсам (другим классам) без пинка со стороны. Проще всего этого добиться через require в начале файла класса.
 

profan

Новичок
ну как классы подключать я уже научился ))

Собственно говоря вопрос в том и состоял, чтобы выяснить необходимо ли создавать конфиг для всего тестируемого проекта.

Это конечно логично, но кто его знает как оно там написано...

Спасибо
 
Сверху