Правильное тестирование в Yii

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Serov
Сообщения: 16
Зарегистрирован: 2011.01.06, 16:14

Правильное тестирование в Yii

Сообщение Serov »

Это тема где я бы хотел увидет примеры или советы правильного (кашерного) тестирования в Yii.

Похожие темы
тестирование в модулях: viewtopic.php?f=3&t=1423&p=8753&hilit=% ... 0%B5#p8753
тестирование в контроллерах - viewtopic.php?f=3&t=991&p=6183&hilit=%D ... 1%8B#p6183
документация по тестированию - http://yiiframework.ru/doc/guide/ru/test.unit

Так же оф.документация от PHPUnit (на английском) http://www.phpunit.de/manual/3.6/en/org ... tests.html

Я пишу тесты в первые, и начальная настройка у меня заняла дня 3. (по настройке - http://www.zagirov.name/configure-netbe ... nit-tests/ и google в помощь) В этом посте, я хочу обобщить все свои наработки, может кому то (кто тоже впревые тестирует) это понадобится.

У меня стоит linux, netbeans и yii 1.1.5, поэтому все что будет написанно относится к моей конфигурации, но я думаю что и для любых других тоже пойдет.

Тестирую я модель protected/model/Matrix.php
Название моего домена mlm.

Заполняется входной скрипт, надо внимательно и правильно заполнить пути до нужный файлов.
/protected/tests/boostrap.php:

Код: Выделить всё

$yiit=dirname(__FILE__).'/../../framework/yiit.php';
$config=dirname(__FILE__).'/../config/test.php';

require_once($yiit);
require_once(dirname(__FILE__).'/WebTestCase.php');

Yii::createWebApplication($config);
 
Задается имя вашего домен и индексный файл для тестов: index-test.php
/protected/tests/WebCaseTest.php:

Код: Выделить всё

define('TEST_BASE_URL','http://mlm/index-test.php/'); //[b]где mlm - имя вашего домена[/b]

class WebTestCase extends CWebTestCase
{
    protected function setUp()
    {
        parent::setUp();
        $this->setBrowserUrl(TEST_BASE_URL);
    }
}
 
Файл конфигурации для тестов. Я подключаю отдельную БД для тестирования - mlmtest - полная копия БД mlm, но без значений. Все значения будут заполенны по фикстурам.
/protected/config/test.php:

Код: Выделить всё

return CMap::mergeArray(
        require(dirname(__FILE__).'/main.php'),
        array(
        'components'=>array(
                'fixture'=>array(
                        'class'=>'system.test.CDbFixtureManager',
                ),

                'db'=>array(
                        'connectionString' => 'mysql:host=localhost;dbname=mlmtest', //mlmtest база созданная специально для тестирования
                        'emulatePrepare' => true,
                        'username' => 'user',
                        'password' => 'pass',
                        'charset' => 'utf8',
                        'tablePrefix' => 'mlm_',
                ),

        ),
        )
);
 
Задаются значение фикстуры. (начальные данные). Данные из этого массива будут занесены в таблицу mlm_matrix базы mlmtest. И эти данные будут перезаписывать таблицу поосле каждого теста.
/protected/tests/fixtures/mlm_matrix.php:

Код: Выделить всё

return array(
    'sample1'=>array(
        'parent'=>'0',
        'lft'=>"1",
        'rght'=>'4',
        'level'=>'0',
        'id_user'=>'1',
        'referral'=>'0',
    ),
        'sample2'=>array(
        'parent'=>'1',
        'lft'=>"2",
        'rght'=>'3',
        'level'=>'1',
        'id_user'=>'2',
        'referral'=>'1',
    ),
); 
Данный тест просто демонстрирует работу тестов в принципе и проверяет, что поле rght=4 у элемента с id=1
/protected/tests/unit/MatrixTest.php:

Код: Выделить всё

class MatrixTest extends CDbTestCase
{
    public $fixtures=array(
        'matrix'=>'Matrix',
    );

    public function testShow()
    {
        $matrix = new Matrix;
        $res = $matrix->findByPK(1);
        $this->assertEquals($res->rght,4);
    }

}
 
Если запустить данный тест (shift+F6 в netbeans)

Код: Выделить всё

phpunit unit/MatrixTest.php


то будет получен ответ OK

Код: Выделить всё

PHPUnit 3.4.5 by Sebastian Bergmann.

.

Time: 1 second, Memory: 8.75Mb

OK (1 test, 1 assertion) 
В принципе все то что описанно выше - это помощь для тех кто впервые (как я) принялся за тестирование в Yii.
А для тех кто уже разобрался в этой теме есть парочка вопросов:
Как запустить все тесты в netbeans, alt+F6 не работает, говорит что не выбранно не одного теста.
Как работает unitphp.xml, лучше с реальным примером для теста выше.
Какие у меня есть ошибки?
Ну конечно побольше примеров правильного тестирования.
Аватара пользователя
Stamm
Сообщения: 407
Зарегистрирован: 2010.03.14, 18:59
Откуда: Россия, Москва
Контактная информация:

Re: Правильное тестирование в Yii

Сообщение Stamm »

Уже линкуют на мои статейки - радует =)
В настройках проекта в разделе PHPUnit не стоит галки у Use Custom Test Suite?
Я вообще phpunit.xml почти не трогал, только добавлял браузеры для тестов через selenium. Можно почитать доку: http://www.phpunit.de/manual/3.5/en/app ... ation.html
idrozd
Сообщения: 8
Зарегистрирован: 2011.02.23, 08:23

Re: Правильное тестирование в Yii

Сообщение idrozd »

Не подскажете, как заставить брейкпоинты срабатывать внутри теста? ))
flam
Сообщения: 129
Зарегистрирован: 2011.04.10, 11:23

Re: Правильное тестирование в Yii

Сообщение flam »

Тоже решил приобщаться к правильным методам, но пока со скрипом...
Суть такова:
Перелопатил кучу информации, установил phpunit, selenium - проверил на тестовых файлах - все работает.
Но как только пробую тестировать yii-проект получаю Fatal error: Class 'WebTestCase' not found in ....

Пути проверил, вроде все ок, в чем может быть проблема?! :oops:

Использую windows, denwer, netbeans...
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Правильное тестирование в Yii

Сообщение samdark »

Класс 'WebTestCase' имеется?
flam
Сообщения: 129
Зарегистрирован: 2011.04.10, 11:23

Re: Правильное тестирование в Yii

Сообщение flam »

Ага...
В общем после бесчисленного количества манипуляций методом перебора, теперь ругается:

Warning: include(CWebTestCase.php): failed to open stream: No such file or directory in X:\home\yii-1.1.7.ru\www\framework\YiiBase.php on line 396
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script><!--error-->
Warning: include(): Failed opening 'CWebTestCase.php' for inclusion (include_path='.;X:\usr\local\php5\PEAR\pear;/usr/local/php5/PEAR') in X:\home\yii-1.1.7.ru\www\framework\YiiBase.php on line 396
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script><!--error-->
Fatal error: Class 'CWebTestCase' not found in X:\home\demo.ru\www\protected\tests\WebTestCase.php on line 15
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script>


в строке 15 объявляется класс class WebTestCase extends CWebTestCase

Eсли не затруднит, подскажите на свежую голову какие пути и в каких файлах нужно указать при таком расположении папок: (home денвера)
Изображение
Отметил красной палкой папки с тестовым проектом (demo.ru) и папку с yii (yii-1.1.7.ru)
Аватара пользователя
Stamm
Сообщения: 407
Зарегистрирован: 2010.03.14, 18:59
Откуда: Россия, Москва
Контактная информация:

Re: Правильное тестирование в Yii

Сообщение Stamm »

В bootstrap.php правильный путь у $yiit?
flam
Сообщения: 129
Зарегистрирован: 2011.04.10, 11:23

Re: Правильное тестирование в Yii

Сообщение flam »

вот такой

Код: Выделить всё

<?php

// change the following paths if necessary
$yiit=dirname(__FILE__).'/../../../../yii-1.1.7.ru/www/framework/yii.php';
$config=dirname(__FILE__).'/../config/test.php';

require_once($yiit);
require_once(dirname(__FILE__).'/WebTestCase.php');

Yii::createWebApplication($config); 


вот index-test.php

Код: Выделить всё

<?php
$yii=dirname(__FILE__).'/../../yii-1.1.7.ru/www/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/test.php';

// remove the following line when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);

require_once($yii);
Yii::createWebApplication($config)->run(); 
вот WebTestCase.php

Код: Выделить всё

<?php
define('TEST_BASE_URL','http://demo.ru/index-test.php/');
class WebTestCase extends CWebTestCase
{
    protected function setUp()
    {
                    parent::setUp();
                    $this->setBrowser('*firefox');
                    $this->setBrowserUrl(TEST_BASE_URL);

    }
} 
вот свойства проекта в NB
Изображение
Аватара пользователя
Stamm
Сообщения: 407
Зарегистрирован: 2010.03.14, 18:59
Откуда: Россия, Москва
Контактная информация:

Re: Правильное тестирование в Yii

Сообщение Stamm »

А указали в netbeans директорию для тестов? http://www.zagirov.name/wp-content/uplo ... _yii-8.png
flam
Сообщения: 129
Зарегистрирован: 2011.04.10, 11:23

Re: Правильное тестирование в Yii

Сообщение flam »

Ага, пробовал и tests и tests/unit
flam
Сообщения: 129
Зарегистрирован: 2011.04.10, 11:23

Re: Правильное тестирование в Yii

Сообщение flam »

Я решил свою проблему!
Оказывается я создавал тестовый проект еще в yii 1.6, потом, после выхода 1.7, блогополучно обновился и забыл про это :oops:
После того, как создал новый проект изначально в 1.7 selenium заработал
Аватара пользователя
Stamm
Сообщения: 407
Зарегистрирован: 2010.03.14, 18:59
Откуда: Россия, Москва
Контактная информация:

Re: Правильное тестирование в Yii

Сообщение Stamm »

Вроде, там ещё phpunit свежий требуется
vladimircape
Сообщения: 339
Зарегистрирован: 2012.05.29, 16:31

Re: Правильное тестирование в Yii

Сообщение vladimircape »

flam писал(а):Я решил свою проблему!
Оказывается я создавал тестовый проект еще в yii 1.6, потом, после выхода 1.7, блогополучно обновился и забыл про это :oops:
После того, как создал новый проект изначально в 1.7 selenium заработал
Повезло ,а у меня эта проблема и осталась
Maxim
Сообщения: 13
Зарегистрирован: 2012.05.02, 19:15

Re: Правильное тестирование в Yii

Сообщение Maxim »

vladimircape писал(а): Повезло ,а у меня эта проблема и осталась
была такая же беда. У меня, как оказалось, нетбинс не видел файл phpunit.xml. как следствие он не грузил bootstrap.php. попробуйте скопировать xml в папку unit
melyfaro
Сообщения: 34
Зарегистрирован: 2012.04.14, 14:52

Re: Правильное тестирование в Yii

Сообщение melyfaro »

Ребята подскажите пожалуйста, почему могут не подцепляться фикстуры?

Код: Выделить всё

<?
class PostTest extends CDbTestCase{
    public $fixtures = array('posts'=>'Post'); 
    public function testRead()
    {
        $post = $this->posts('sample1');
        $this->assertTrue($post  instanceof Post);
       
    }
}
 
Ошибка :
Exception: Unknown method 'posts' for class 'PostTest'.
/home/anton/vhosts/framework/test/CDbTestCase.php:77
/home/anton/vhosts/ddm.loc/protected/tests/functional/PostTest.php:21
/home/anton/vhosts/ddm.loc/protected/tests/functional/PostTest.php:21

Файл фикстуры доступен для чтения fixtures/Post.php

Код: Выделить всё

return array(
    'sample1'=>array(
        'title'=>'Тестовая запись 1',
        'text'=>'Содержимое тестовой записи 1',
        'dt_create'=>function(){$dt = new DateTime(); return $dt->format('Y-m-d H:i:s');},
        'create_by'=>1,
        'active'=>1
    ),
    'sample2'=>array(
        'title'=>'Тестовая запись 2',
        'text'=>'Содержимое тестовой записи 2',
        'dt_create'=>function(){$dt = new DateTime(); return $dt->format('Y-m-d H:i:s');},
        'create_by'=>1,
        'active'=>1
    ),
);
 
Юрий
Сообщения: 11
Зарегистрирован: 2013.10.10, 09:01

Re: Правильное тестирование в Yii

Сообщение Юрий »

Всем привет!
Проблемы с тестированием. Запускаю тест, а он мне в ответ:

Код: Выделить всё

PHP Warning:  require_once(PHPUnit/Extensions/SeleniumTestCase.php): failed to open stream: No such file or directory in /Users/yuriimarchuk/Сайты/framework/test/CWebTestCase.php on line 12
PHP Stack trace:
PHP   1. {main}() /usr/local/php5/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/local/php5/bin/phpunit:46
PHP   3. PHPUnit_TextUI_Command->run() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:129
PHP   4. PHPUnit_TextUI_Command->handleArguments() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:138
PHP   5. PHPUnit_TextUI_Command->handleBootstrap() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:606
PHP   6. PHPUnit_Util_Fileloader::checkAndLoad() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:778
PHP   7. PHPUnit_Util_Fileloader::load() /usr/local/php5/lib/php/PHPUnit/Util/Fileloader.php:76
PHP   8. include_once() /usr/local/php5/lib/php/PHPUnit/Util/Fileloader.php:92
PHP   9. require_once() /Users/yuriimarchuk/Сайты/mysite/protected/tests/bootstrap.php:8
PHP  10. YiiBase::autoload() /Users/yuriimarchuk/Сайты/mysite/protected/tests/bootstrap.php:0
PHP  11. include() /Users/yuriimarchuk/Сайты/framework/YiiBase.php:401

Warning: require_once(PHPUnit/Extensions/SeleniumTestCase.php): failed to open stream: No such file or directory in /Users/yuriimarchuk/Сайты/framework/test/CWebTestCase.php on line 12

Call Stack:
    0.0007     226520   1. {main}() /usr/local/php5/bin/phpunit:0
    0.0045     508544   2. PHPUnit_TextUI_Command::main() /usr/local/php5/bin/phpunit:46
    0.0045     508776   3. PHPUnit_TextUI_Command->run() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:129
    0.0045     509208   4. PHPUnit_TextUI_Command->handleArguments() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:138
    0.0088     857096   5. PHPUnit_TextUI_Command->handleBootstrap() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:606
    0.0090     865520   6. PHPUnit_Util_Fileloader::checkAndLoad() /usr/local/php5/lib/php/PHPUnit/TextUI/Command.php:778
    0.0091     865720   7. PHPUnit_Util_Fileloader::load() /usr/local/php5/lib/php/PHPUnit/Util/Fileloader.php:76
    0.0091     869336   8. include_once('/Users/yuriimarchuk/Сайты/mysite/protected/tests/bootstrap.php') /usr/local/php5/lib/php/PHPUnit/Util/Fileloader.php:92
    0.0113    1123128   9. require_once('/Users/yuriimarchuk/Сайты/mysite/protected/tests/WebTestCase.php') /Users/yuriimarchuk/Сайты/mysite/protected/tests/bootstrap.php:8
    0.0114    1124136  10. YiiBase::autoload() /Users/yuriimarchuk/Сайты/mysite/protected/tests/bootstrap.php:0
    0.0116    1143024  11. include('/Users/yuriimarchuk/Сайты/framework/test/CWebTestCase.php') /Users/yuriimarchuk/Сайты/framework/YiiBase.php:401
В чем моя ошибка?
Спасибо.
Ответить