У кого стоит фремворк mzz? Дайте временный доступ на хост :)

DiMA

php.spb.ru
Команда форума
У кого стоит фремворк mzz? Дайте временный доступ на хост :)

Полчаса назад ради смеха скачал mzz и уже нашел 3 бага. Но надо бы их в деле проверить, чтобы не п...ть зря. Самому ставить ой как лениво, дома под винду... Кто может дать доступ к установленной копии? Ничего ломать не буду, ограничусь записью в лог и юниттестами :)

Кстати, говоря, тесты нихрена не тестируют. Например, некоторые аналогичные модули у меня в проекте и таких ровно же тестах имеют по 500-700 assert'ов на 100 Кб исходного пхп-кода модуля :)
 

DiMA

php.spb.ru
Команда форума
не могу по тех. причинам

И зачем? в моем коде при незначительном изменении любой строки тут же тесты свалятся. А в этом коде - делай че хочешь, тесты не заменят. И подозрение на явные баги есть, что вообще не затронуто тестированием. Да и что 20-30 проверок могут-то, когда я делаю реально 500-700? Я маньяк?
 

whirlwind

TDD infected, paranoid
Мля, ну что за форум. Один говорит, нифига ты не понимаешь в проектировании. Ему - покажи проектную документацию, он сливается по "очевидным причинам". Другой говорит нифига ты больших проектов не писал. Ему - назови критерии больших проектов и он пропадает. Третьему покажи тесты - не могу по техническим причинам. Как тут можно чему либо научиться?
 

Smelo

Новичок
фремворк mzz<<
это не тот у которого на Хп, на генерацию гл. страницы уходит около сек

-~{}~ 06.09.09 15:52:

а воо, точно, видел это чудо =)

Время: 1.4386 сек. Запросов к БД 23+14: 0.3549 сек.
 

DiMA

php.spb.ru
Команда форума
whirlwind

тебе назвать одно место, куда следует идти с такими заявлениями? .-) Я - не могу показать, чисто физически, хотя и хочу :)

А с тестами все элементарно. Если говорить по простому, раз ты бедный не можешь ничему научится... Тест должен заставить тестируемый класс зайти в каждую языковую конструкцию (каждый if, while и т.д.), заставить выполнить каждую предусмотренную проверку на ошибки, исключения и т.д. Пока пишешь тест, дополнительно придумываешь методы заглючить класс, вставляешь и туда проверки, и их тестирование.

Показательный пример я уже назвал: измени любую строку в коде (типа != на === замени или закомментируй) - тесты сразу это покажут.

Покажи свой код, я тебе отвечу про недостаточность тестов.
 

zerkms

TDD infected
Команда форума
Smelo
уже сейчас на линуксе мы имеем на демо-приложении 50r/s

собственно это не тема обсуждения. тема - найденные баги.

-~{}~ 06.09.09 22:54:

DiMA
баги покажешь или как?

-~{}~ 06.09.09 22:54:

Smelo
там очень старая версия. сейчас всё уже сильно лучше.
 

Smelo

Новичок
zerkms
ну надесь, потому как такие скорости никуда не канают..
 

DiMA

php.spb.ru
Команда форума
Я же их не проверил, т.к. не ставил софтину, могу и ошибаться. Разве что ты обещаешь честно их сам проверить и ответить, а не поливать меня потом г-м в ответ =)
 

zerkms

TDD infected
Команда форума
DiMA
мде.... пздц....
т.е. полить говном не проверив сначала - это по-гусарски, ага?
 

DiMA

php.spb.ru
Команда форума
мля, тебя никто не трогал вообще

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

whirlwind

TDD infected, paranoid
Автор оригинала: DiMA
whirlwind

тебе назвать одно место, куда следует идти с такими заявлениями? .-) Я - не могу показать, чисто физически, хотя и хочу :)

А с тестами все элементарно. Если говорить по простому, раз ты бедный не можешь ничему научится... Тест должен заставить тестируемый класс зайти в каждую языковую конструкцию (каждый if, while и т.д.), заставить выполнить каждую предусмотренную проверку на ошибки, исключения и т.д. Пока пишешь тест, дополнительно придумываешь методы заглючить класс, вставляешь и туда проверки, и их тестирование.

Показательный пример я уже назвал: измени любую строку в коде (типа != на === замени или закомментируй) - тесты сразу это покажут.

Покажи свой код, я тебе отвечу про недостаточность тестов.
Честно говоря, я вообще смутно понял что ты написал "тест должен выполнить каждую предусмотренную проверку" и т.п. Если тест это требования к классу, то было бы странно, если он не выполняет соответствующую проверку. То есть я вообразить себе такого не могу. Но будем считать что я туп и недопонял почему тебе нужен код класса вместо теста. Изволь например http://phpclub.ru/paste/index.php?show=2334
 

Smelo

Новичок
сударь, представьтесь?<<

дык, Иван я,
Иван Васильевич Грозный
 

DiMA

php.spb.ru
Команда форума
Вот те подозрение на баги. Если я не прав - не обессудь.


Для разминки - acl.php, после ?> идет пустая строка. А доке ты же сам просил не ставить до или после <? ?> пробелов, по известным причинам :) Ну, это так, улыбнуло тока. Чтобы не глючить, не нужно вообще закрыть пхп тег.


1. (?:view|edit|list|create|delete|createFolder|editFolder|moveFolder|deleteFolder|move)

Ошибка в регах.

Выливается ли он в БАГ - не знаю, без запуска не понять. Надо сделать запись в лог конечного отрендеренного рега и код рядом посмотреть, тогда я точно отвечу.

Если ты используешь preg_match и условия или (в скобочках), то обязательно сначала перечисляй самые длинные условия, т.е. сначала "createFolder", а потом более короткий "create". PRCE в данной части крайне ленив. Если исходная команда "createFolder", то найдя в шаблоне "create", PRCE бросит проверять остальные варианты. Т.е. createFolder писать вообще бессмысленно.

Ошибка проявится, если пытаться выделить в переменную \\1 найденный блок. Если идет просто проверка вариантов - ошибки логики не будет.


2. acl.php

Полнейшая чушь работы с кешем. Помнишь, я неделю назад "писал" о другом мега фреймворке? Осветил работу с кешом. Ты меня не слушал. Ну, во-первых, при использовании кеша ты делаешь лишнюю языковую конструкцию "Если кеш есть - один код, если нет - другой" и лишнюю вложенность кода. Это не баг, а просто сложность. Во-вторых, ни намека на мультитеги, чтобы разом можно было кучу кешированных объектов уничтожать. Это - детский сад.


3. В-третьих, самое главное в кеше - его вовремя удалить. Здесь то и баги.

public function get($param = null, $clean = false, $full = false)
public function getForGroup($gid, $full = false)

Две функции проверки наличия кеша, вычисления по SQL таблице sys_access, и его установка.

public function deleteGroup($gid)
public function deleteGroupDefault($gid)
public function deleteDefault()
public function deleteUser($uid)

И куча функций по удалянию/модификации чего-то из той же SQL таблицы sys_access. А кеш не удаляется!

Ну и так далее по коду - часть функций что-то кеширует (из базы), а те функции, которые МОДИФИЦИРУЮТ это "что-то" (базу) и не думали кеш уничтожать.

Это системный баг. По ВСЕМУ КОДУ $cache->delete вообще ни разу не встречается.

Увидел только эту слабую попытку:

// удаляем кэш
$this->cache->set($this->obj_id, null);

Через SET тоже не видно, чтобы хоть где-то принялось, кроме этого места, которое видно тебя достало багами.


4. Тесты к acl.php сделаны через жопу. Там получение информации идет из функций класса, которые только пишут в кеш, т.е. нормально class->get. А вот удаление, почему-то, в тестах идет не через соотв. функции class->delete (и остальные с ними) - а напрямую через SQL! Это бред! Половину класса тестить функциями, половину - через прямой доступ к SQL.


пример теста:
$this->assertEqual(2, $this->db->getOne('SELECT COUNT(*) FROM `sys_access` WHERE `uid` = 1'));
$this->acl->deleteUser(1);
$this->assertEqual(0, $this->db->getOne('SELECT COUNT(*) FROM `sys_access` WHERE `uid` = 1'));


Тест категорически не должен использовать SQL, кроме очень-очень редких случаев. Если бы сделал тест грамотно:

class->get (вернули из базы, т.к. кеш пуст)
class->set (записали в кеш)
class->delete (нихрена кеш не удалили)
class->get (вернули что-то из кеша, где устаревшая инфа, хотя в базе все ок)

то сам бы и понял свои баги с кешем. Но ты видимо столкнулся с глюками теста и вместо второго вызова CLASS->GET(), который обломится об кеш, напрямую читаешь с базы. И типа идешь спать спокойно - тест же пройден.

Короче... решение твоих проблем такое:

а) Вынеси ВЕСЬ SQL код в дополнительный класс модели (для каждой таблицы или объекта - своя модель). Может я и излишне опять таки придераюсь, но PHP-контроллер с SQL кодом вперемешку сам по себе уже говнокод.
б) Применяй кеширование только в модели. Класс не должен знать ничего о кешировании. И тесты, разумеется тоже. Но тесты должны всегда пытаться заглючить класс именно на кеше.
в) В каждой функции модели нужно либо:
- проверять кеш, и если его нет - вычислять, сохранять (SELECT методы)
- уничтожать кеш (методы UPDATE, DELETE и т.д.)
 

zerkms

TDD infected
Команда форума
Для разминки - acl.php, после ?> идет пустая строка. А доке ты же сам просил не ставить до или после <? ?> пробелов, по известным причинам Ну, это так, улыбнуло тока. Чтобы не глючить, не нужно вообще закрыть пхп тег.
угу, опечатка

Если исходная команда "createFolder", то найдя в шаблоне "create", PRCE бросит проверять остальные варианты. Т.е. createFolder писать вообще бессмысленно.
а не важно - мне важно, чтобы роутер сработал. на какой именно из них он наступит - здесь не имеет значения.

Ошибка проявится, если пытаться выделить в переменную \\1 найденный блок.
(?:view|edit|list|create|delete|createFolder|editFolder|moveFolder|deleteFolder|move)
обрати внимание на выделенное.

3. В-третьих, самое главное в кеше - его вовремя удалить. Здесь то и баги.
сейчас всё кешируется в память. поэтому - снова мима кассы.
4. Тесты к acl.php сделаны через жопу. Там получение информации идет из функций класса, которые только пишут в кеш, т.е. нормально class->get. А вот удаление, почему-то, в тестах идет не через соотв. функции class->delete (и остальные с ними) - а напрямую через SQL! Это бред! Половину класса тестить функциями, половину - через прямой доступ к SQL. Тест категорически не должен использовать SQL, кроме очень-очень редких случаев. Если бы сделал тест грамотно:
не понимаю. можно с конкретным примером из теста?
 

DiMA

php.spb.ru
Команда форума
Этот код

$this->assertEqual(2, $this->db->getOne('SELECT COUNT(*) FROM `sys_access` WHERE `uid` = 1'));
$this->acl->deleteUser(1);
$this->assertEqual(0, $this->db->getOne('SELECT COUNT(*) FROM `sys_access` WHERE `uid` = 1'));

замени на

$x=$this->acl->getCount(1); // вернули 1
assertEqual(1, $x);
$this->acl->deleteUser(1);
$x=$this->acl->getCount(1); // вернули по прежнему 1 объект из кеша, т.к. deleteUser и не думал кеш чистить
assertEqual(0, $x); // тут то и вылезет ошибка, изза кривого кеширования
 
Сверху