Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unit-тестирование что и как? Как написать простейший тест 
:(
    Опции темы
bananakokos
Дата 16.4.2016, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.7.2015

Репутация: нет
Всего: нет



Вот есть примитивный класс
Код

class empl
{
    function mth($name)
    {
        if(is_numeric($name)){
            return true;
        }
        else{
            return false;
        }
    }
}
 
$empl = new empl();
$empl->mth($_POST['name']);


Вопрос: как к нему написать unit-тест, куда положить тест, как запустить, протестировать, проверить результат теста?
PM MAIL   Вверх
ksnk
Дата 16.4.2016, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Если нет Pear - то все сложно. Нужно либо идти на https://pear.php.net/ читать что там написано, поставить pear, подключить к нему phpunit и убедится что все завелось.
Либо поставить node.js, потом composer, потом подключить пакет phpunit/phpunit. Обе дороги непросты, но по одной из них нужно пройти. Операции нетривиальны и надеюсь, что мне их объяснять тут не придется.  smile 

Дальше - нужно завести себе приличный IDE с поддержкой запуска phpunit. Например phpStorm. Там даже автоматизация создания юнит тестов есть. И визуализация тестового покрытия.

Дальше - проще.
Нужно выкинуть из файла строки 14 и 15, ибо нефиг, это класс или что?
Затем в корне проекта завести каталог `tests`. В этом каталоге завести файл testEmpl.php с примерно следующим содержимым

Код

<?php

include 'empl.php';

class emplTest extends PHPUnit_Framework_TestCase {

    function testExists(){
        $this->assertTrue(class_exists('empl'));
    }

    function testDataDebug(){
        $expected=true;$data='1';
        $empl= new empl();
        $this->assertEquals($expected,$empl->mth($data));
    }

    function testData(){
        $dat=[
            '1'=>true,
            '2'=>true,
            '1e+1'=>true,
            'Это число!'=>false,
        ];
        $empl= new empl();
        foreach($dat as $k=>$v)
            $this->assertEquals($k.'->'.$v,$k.'->'.$empl->mth($k));
    }
}


Во первЫх строках этого файла должна подключаться самая самая главная autoload-магия всего приложения. Ну или хотя бы как здесь - простой инклюд тестируемого файла.

Первая функция теста служит для проверки самого механизма запуска. Что у нас юнит тесты таки есть, таки завелись, и мы таки видим тестируемый класс. 

Вторая функция -  отладочный тест. Это основной инструмент при создании приложения с использованием Test Driven Development (TDD). Он должен находится как можно выше по тексту юнит теста. Характерной особенностью его будет воспроизведение "ситуации из жизни". Предназначение его в том, чтоб позволить разработчику встать точкой останова в функцию и отладчиком посмотреть что же там такое происходит. В нормальной жизни, после завершения отладки, такие тесты выкидываются или бережно укрываются комментариями на всякий случай. Их достают из комментариев, когда потоковый тест(или реальная жизнь) обнаруживает ошибку и нужно подставить данные и посмотреть таки в чем дело.

Ну и наконец - самая главная часть - потоковый тест. В принципе - его можно было бы представить как комплект функций - отладочных тестов, но лень очень сильно мешает.  Единственный неприятный момент - необходимо как то визуализировать входные параметры, по которым случился фейл, по этому там такая пляска со строковыми значениями. Продвинутые тестописатели по этому поводу даже пишут собственные классы тестирования  smile 

И да, сам класс может содержать любые функции, при условии, что они начинаются не на `test`. Те, что начинаются на test будут запускаться PHPUnit по очереди сверху вниз...

P.S. Надеюсь, не сильно упростил и не сильно запутал 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bananakokos
Дата 19.4.2016, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.7.2015

Репутация: нет
Всего: нет



Спасибо, идея и логика в целом понятна, но на этом этапе Pear и phpunit использовать не хочу, я ещё не особо силён в ООП.
Погуглил, нашёл на гитхабе довольно простую на мой взгляд библиотеку: https://github.com/tomkrush/unit на её примере хотелось бы сразу и ООП подтянуть и юнит-тестирование.

Для начала я так понимаю нам надо всего 3 файла:
unit.php
UnitTestSuite.php
UnitTestCase.php

В UnitTestSuite.php всё боле-менее понятно, там приводится сам тест по сути который пробегается по всему массиву случаев case, тестирует каждый и в конце сообщает сколько пройдено, провалено и всего.

В UnitTestCase.php видно что описаны возможные варианты тестирования, что бы вернул правду assertTrue что бы вернул ложь assertFalse но зачем это всё закатано в абстрактный класс, т.к. в остальных двух файлах я что-то не вижу упоминания UnitTestCase, или наследования, расширения этого абстрактного класса...

И самое главное: как использовать эти файлы для минимальной проверки чего-либо? Т.к. в первый файл unit я попробовал добавить строки:
Код

$b = _unit_micro_time();
var_dump($b);

На выходе он мне просто выдал число (сумму времени я так понял) и всё. А где сообщение о наличии, отсутствии ошибок?
PM MAIL   Вверх
ksnk
Дата 19.4.2016, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Вероятно, нужно спросить у автора. Хотя он забросил проект 5 лет назад. может и послать  smile 
Можно поискать применения класса в php проектах самого автора. 
Вроде bella на нем.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bananakokos
Дата 19.4.2016, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.7.2015

Репутация: нет
Всего: нет



Ок я вас понял. Меня интересует не конкретно эта библиотека, а как правильно написать простейший аналог теста самому? Может быть не из 3, а из 2 или одного файла (тестируемый класс и тест лежат в одном файле).
Т.е. понятно что надо вызывать в цикле класс и передавать туда разные параметры, результат если false фиксировать параметр на котором было false и куда-то логировать этот случай так?
PM MAIL   Вверх
ksnk
Дата 19.4.2016, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Нужно определить цель. Либо `я хочу сам написать класс тестирования и посмотеть что получится` либо `хочу научится писать юнит тесты и использовать их в дальнейшем`. Во втором случае НУЖНО поставить phpunit. Просто по тому, что все современные проекты для тестирования используют именно его. Это стандарт. Это поддерживается всеми подходящими IDE.
Разумнее всего поставить composer. Composer - еще один инструмент, который фактически становится стандартом. После этого подключить phpunit - одна команда компоузера.

В первом случае - вполне нормальный вариант - разобраться в том проекте.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bananakokos
Дата 19.4.2016, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.7.2015

Репутация: нет
Всего: нет



composer у меня есть, боюсь что в phpunit не написав ни одного своего класса тестирования разобраться будет сложновато...
PM MAIL   Вверх
ksnk
Дата 20.4.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Чтобы научиться ездить на велосипеде - нужно ездить на велосипеде. Можно, конечно, построить веломастерскую и строить свои модели, но научишься ли ездить?



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
_zorn_
Дата 4.9.2016, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 6
Всего: 12



Цитата(ksnk @  17.4.2016,  06:02 Найти цитируемый пост)
Если нет Pear - то все сложно

Пир прошлый век. Композер рулит ) Это для начала.
Ну а тесты - всегда хотел начать их писать, но руки постоянно не доходят smile
Как оно вообще - установите например какой нибудь компонент симфонии (главное чтобы вы понимали что он делает) и посмотрите его тесты.
Ну а PHPUnit вообще простой - просто классы с методами с префиксом test в отдаленном представлении.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.