Подобряване с Codeception

Когато за пръв път започнах работа с codeception се сблъсках с някои неизбежни проблеми. Ще се опитам да ги покажа за да оцените приимуществото на тази система, както и тестовете като цяло.

Ето ги и тях:

  1. Първото нещо, което ми разкри codeception е файловата ми структура и начина по които е организирана. Важно е какви файлове се зареждат от всяка една част на апликацията и ако са преплетени един в друг може да усложни много тестването. Настройките, които първоначално нагласям трябва да са изолирани и да не пречат на тестовете. Това ми даде възможност да тествам с различни параметри всяка една част от системата. Най-лесния начин за добавяне на други параметри за мен беше да подам .env.testing файл преди .env на Codeception, което ми гарантира, че всичко може да се замени.
  2. Повечето неща при мен преминаваха през DI контейнер и това много улесни и тестването. Но за другите зависимости веднага си личи кое не си е на мястото. Най-много при unit тестването.. когато не можете да тествате определен вариант или да mock-нете някой клас. Точно в тези случаи трябва всичко да се изчисти за да работите по-добре за в бъдеще и тестовете да се пишат по-лесно.
  3. Докато пиша тестовете аз на практика си проверявах кода сам. На няколко пъти ми се е случвало да си показвам кода на колеги, да обеснявам какво прави и тогава винаги съм откривал някои грешки или съм се сещал за по-добри решения – принципа на гуменото пате. Не е толкова важно какво ще каже другия човек, но самото усилие да се предаде някаква информация ни настройва да мислим различно и да си открием проблеми или решения. Имам и реално гумено пате, но нещо не върши добра работа и не работи при мен. Това което работи почти по същия начин е писането на тестове. Тогава минавам кода повторно да обмисля логически какво трябва да тествам, както и дали не съм изпуснал нещо, но вече като мисля в перспектива. Тогава откривам най-много бъгове и ги хващам в преди дори да пусна и един тест.

Това са едни от най-сериозните ми приимущества при писането на тестове. Те помагат още преди да се пуснат за проверка.

, , ,

Няма коментари

Codeception

Лесен и достъпен начин за тестване на вашият код. Предимно за PHP приложения, но не е задължително.

Ако използвате Codeception може да покриете по всякакъв начин вашия код с unit, functional или acceptance тестове.

Документацията им е добре написана и лесно можете да започнете с първите си тестове.

Само като пример (с Composer) бих дал няколко команди които ще създадът всичко необходимо за създаване и изпълнение на Codeceptio тестове:

composer require codeception/codeception --dev
vendor/bin/codecept bootstrap
codecept generate:cept acceptance First
vendor/bin/codecept run

Това ще ви добави библиотеката, чрез Composer.
След това ще създаде стартова версия с unit, functional и acceptance тестови конфигурации.
Генерираме тестов файл с формат Cept за acceptance suit и име First.
Накрая пускаме проверка за всички тестове, които нямат никакви проверки, но все пак всички основни файлове са създадени и може да започнете доректно с покриването на вашия код.

След лекцията ми на RuseConf 2017, реших да дам малко повече публичност на начините за тестове. С тази публикация започвам серия от най-добри практики при писане не стандартни тестове.

Codeception има примерни тестове за много видове проекти, както и за фреймуърковете, които поддържат – Zend, Yii, Phalcon, Doctrene, Laravel, Simpfony, Silex..
Избрах да направя разширена версия на тестовете им на Laravel, за да покажа добри практики за по-напреднали тестове. Можете да я намерите в Github: https://github.com/ibpavlov/codeception-laravel5-advanced

, , , , ,

Няма коментари

Читалище Шумен CMS

Това е един проект направен по време на Code4.Tech в Шумен състезание 2016 г. Цели подготвяне на ученици, студенти и професионалисти за интервю. С тази платформа може да получите информация за читалищата в област Шумен, да допринесете с информация за събития, новини, снимки и да бъдете част от една локална общност.

Това е един малко по-различен CMS, за който идеята е публично да може да се дава информация и всеки който иска да публикува информация. Не са използвани готови компоненти, а редакцията и авторизацията е правена само с Phalcon.

Все още като прототип и има много незавършена фукционалност, но базовите неща може да ги видите като си заредите платформата като следвате стъпките в хранилището.

Ето и линк към пълния код:

https://github.com/ibpavlov/chitalishte-shumen

, , , , , ,

Няма коментари

Interview-U (подготовка за интервю)

Това е един публичен проект направен по време на Code4.Tech в Русе състезание 2016 г. Цели подготвяне на ученици, студенти и професионалисти за интервю. С тази платформа може да получите полезни съвети, да направите IQ тест (в разработка), да се подготвите с въпросник, който се оценява (в разработка) и видео интервю (за лична подготовка). Възможно е да управлявате записаните видеа, както и всички въпроси на сайта.

Използвани технологии:

  • PHP 5.5+
  • Phalcon 2+
  • Composer
  • Mysql server

Link: https://github.com/ibpavlov/Interview-U

 

 

, , , ,

Няма коментари

JSON_NUMERIC_CHECK round-fix

Ако искате автоматично да преобразувате низове в числа при json_encode тогава един от начините е с JSON_NUMERIC_CHECK.

Но при него има доста често срещани проблеми като изрязването на телефоните и големите числа.

Това се отнася най-вече за запазени в някакъв обект, база от данни, или други които са пресметнати и са представени в консистентен формат. Например: при запазване на числата +123, 0123, 123 винаги ще се запазят като 123. Когато взимаме тези данни ние знаем, че подадените ни данни ще са вече изчислени, обработени и +123 не може да срещнем ако числото наистина не е низ от символи.

Ето една реализация на същата функционалност както при JSON_NUMERIC_CHECK, която не създава такива проблеми. Числата се заменят само ако не са толкова големи и ако не започват с „+“ или „0“ (т.е. са изчислени числа).


Опростената версия на кода:

function stringToNumeric(&$element)
{
    if(is_string($element) && is_numeric($element)) {
        //Check if normal int or float and change format
        if (ctype_digit($element) && strval(intval($element)) === $element) {
            $element = intval($element);
        } elseif(strval(doubleval($element)) === $element) {
            $element = doubleval($element);
        }
    }
}

function arrayStringsToNumeric(&$array) 
{
    array_walk_recursive($array, "stringToNumeric");
}

function jsonNumericEncode($data, $options = 0, $depth = 512)
{
    //if Has Numberic check and is_array do proper check
    if(($options & JSON_NUMERIC_CHECK) == JSON_NUMERIC_CHECK && is_array($data)) {
        //Remove numeric check
        $options = $options ^ JSON_NUMERIC_CHECK;
        //Make proper type
        array_walk_recursive($data, "stringToNumeric");
    }
    json_encode($data, $options, $depth);
}
jsonNumericEncode

Функцията замества използването на JSON_NUMERIC_CHECK, но може и да се ползва директно като премахнете тази проверка.

function prepareJsonData($data)
{
    //if Has Numberic check and is_array do proper check
    if((is_array($data) && !empty($data)) {
        //Make proper type
        array_walk_recursive($data, "stringToNumeric");
    }
}
$data = prepareJsonData($data);
json_encode($data);

Така накрая в данните може да получите

{
    "phone": "+525526262",
    "number: 12512521, 
    "phone2": "0025542424252",
    "money": 22.23
}

вместо

{
    "phone": 525526262,
    "number: 12512521, 
    "phone2": 25542424252,
    "money": 22.23
}

Има и друго решение, което според мен не е толкова ефективно. Можете да продължите с използването на JSON_NUMERIC_CHECK, но да промените малко данните за да се запазят все пак като низ от символи:

function prepareJsonWithNumberCheck(&$data) {
array_walk_recursive($data, function(&$element) {
    //Check if big int or number and add space
    $same = strval(intval($element)) == $element;
    if (ctype_digit($element) && !$same) {
        $element = "" . $element . " ";
    } elseif(!$same && !preg_match('/^(\+|0)[0-9]+$/', $element)) {
        $element = "" . $element . " ";
    }
});
}

, , ,

Няма коментари

  • Страница 1 от 46
  • 1
  • 2
  • 3
  • 4
  • ...
  • 46
  • >

Лични проекти

Мои проекти или такива в които съм взимал активно участие

Читалище Шумен CMS

На 22.12.2016
Phalcon, Важни, Проекти, Сайтове

, , , , , ,

Interview-U (подготовка за интервю)

На 07.08.2016
Phalcon, Важни, Проекти, Публичен код, Сайтове

, , , ,

Menu Android Апликация

На 10.05.2014
Android, Java, Важни, Проекти

Bebeshko.com

На 10.03.2014
Проекти, Сайтове

Компютърна графика Javascript

На 21.01.2014
Java-Script Код, JavaScript, Код

Imotiko.com

На 13.01.2013
JavaScript, Проекти, Сайтове

, , ,




Код

Примерни фрагменти, функции, модули за различни програмни езици

Codeception

На 18.01.2018
Codeception Код, PHP Код, Важни, Код, Програмиране, Сайтове, Технологии

, , , , ,

JSON_NUMERIC_CHECK round-fix

На 01.08.2016
PHP Код, Важни, Код

, , ,

Разделяне на локация в 2 отделни полета

На 16.12.2015
MySQL/SQL, Код

Bootstrap качване на файл

На 17.03.2015
Bootstrap, Java-Script Код, Код

, ,

Активна навигация

На 05.05.2014
PHP Код, Код

Проверка за съществуване на Google Play Services – Android

На 02.03.2014
Android Код, Код