Как стать автором
Обновить

Комментарии 23

в php всего 8 типов данных, не хватает еще 2х:
1. float
2. resource

Второй можно рандомизировать тоже достаточно просто — tmpfile()/fclose()
Ну еще можно callback тогда добвить
callback — псевдотип, да и он вроде есть в этом тестовом классе.
Ой незаметил
метод getFunction на самом деле возвращает строку.

var_dump(create_function('$a,$b', 'return «ln($a) + ln($b) = ». log($a * $b);'));
выведет: string(9) «lambda_1»

Что бы вернуть функцию нужно написать чтото типа:

public static function getFunction()
{
    return function ($a, $b) { return "ln($a) + ln($b) = ".log($a * $b); };
}


Но это работает с версии 5.3
А это вернет объект класса Closure.
Кстати да, признаю, насчет Closure не прав, поторопился.
public static $allowedTytes = array(0,1);

Антипаттерн «Magic numbers» же.
Почему бы не использовать константы класса?


const T_INTEGER      = 0;
const T_STRING       = 1;
const T_ARRAY        = 2;
const T_OBJECT       = 3;
const T_BOOLEAN      = 4;
const T_FUNCTION     = 5;
const T_NULL         = 6;

public static $allowedTytes = array(self::T_INTEGER, self::T_STRING);
Да Вы что! Это же так длинно получается.
Сарказм засчитан :)
тогда уж заодно значения степени двойки, чтобы можно было логическими операциями пользоваться

Спасибо, учту при рефакторинге.
1) Поставленная задача решается совсем не Fuzzing'ом. А честным написанием тестов на типы входных данных. Без какого либо «рандомного» поведения. Fuzzing нужен для обнаружения ошибок, которые сложно поймать статическим тестами.

2) Если задача все таки Fuzzing, то генерировать нужно рандомные значение, которые могут генерировать весь спектр значений. Так, например, строка, генерируемая через uniqid будет содержать только ограниченный набор символов и иметь постоянную длину, тем самым не покрывая огромное множество вариантов

3) Задание параметров через наследование — не лучший вариант.

4) Если использовать getRand() в getArray() без ограничения на тип, то можно легко упасть в очень длинный цикл при $allowedTytes = array(0,1,2);
Было бы неплохо вдовесок к этому сделать генератор тестов — который определял бы список методов класса или обычных функций, с помощью рефлексии или doc-блоков определял бы требуемое кол-во передаваемых параметров и генерировал код теста.
Сделано. Класс собирает все публичные методы и вызывает их.
> Все, кто разрабатывает на php, да и вообще на любом другом языке программирования с нечеткой типизацией, сталкивались с подобной проблемой:
> PHP Notice: Undefined index: test in /var/www/Testing.php on line 171

Проблема тут в чем? В сочетании 2 факторов: 1) низкой теоретической подготовки разработчиков (есть люди которые не читали даже начало мануала на php.net) и 2) тем, что по дефолту в PHP error_reporting != -1 и показываются не все ошибки. А, есть еще люди, которые не умеют использовать команду tail или аналогичное автоматическое средство мониторинга, но их мы за разработчиков даже не будем считать. Так вот, по моему проще стараться писать аккуратно и мониторить ошибки, чем этим непонятны классом тестировать все методы (как? кто код будет писать?) и ставить ненужные проверки в приватных методах например. Как говорится, пользователь — лучший тестер.

В общем, крайне сомнительное решение. Лучше все же поправьте error_reporting, настройте мониторинг и почитайте php.net — времени меньше уйдет.

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

Вообще, необходимость тестов — сложный вопрос, особенно в вебе, где крайне важна скорость написание и модификации кода.
Поясню задачу которая стояла пере домной.
Был проект, было много программистов. Программистам не осложняли жизнь чтоб они писали все эти проверки (да, ошибка), ибо в параллельно разрабатывалась система контрактов для всех классов(сервисов в проекте).
Мне потребовалось протестировать свой класс и контракт который я к нему написал.
Своим скриптом я прибил двух зайцев, первый это я протестировал то что я написал, второй — я протестировал работу контрактов и вообще всей системы которую мы разрабатывали. При первом запуске все сломалось, были варнинги и куча фатал ероров один за одним, которые же всем другим пришлось исправлять.
Ок, возможно в вашем частном случае это действительно оптимальное решение.
> Вообще, необходимость тестов — сложный вопрос, особенно в вебе, где крайне важна скорость написание и модификации кода

Странное утверждение. Тестирование важно везде оно не влияет на скорость разработки (это скорее качества языка и разработчика). В вэбе важна безопасность прежде всего, а она как раз страдает от недостатка тестирования параметров
/**
* получение null
* @static
* @return null
*/
public static function getNull()
{
return null;
}



если бы я мог предложить вам вакансию java-разработчика, клянусь честью, я бы предложил её такому достойному господину, как вы.
abstract class NullFactory implements ITypeFactory
НЛО прилетело и опубликовало эту надпись здесь
$functions = get_defined_functions();
 
foreach($functions['user'] as $k=>$v){
     $info = new ReflectionFunction($v);
     $numberOfArgs = $info->getNumberOfParameters(); 
     $numberOfRequiredArgs = $info->getNumberOfRequiredParameters(); 
     $args = array();
     for($i=0;$i<$numberOfArgs;$i++){
        $args[] = tester::getRand();
     }
     call_user_func_array($v, $args);
}



Автотестинг всех объявленных функций )
Раз в пятилетку в одном из проектов у меня появляется функция DeleteAll
И не дай бог она будет вызвана с неверными параметрами…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации