тестировать php-функции (не классы) с netbeans и PHPUnit - PullRequest
6 голосов
/ 25 декабря 2009

Я бы хотел запустить модульный тест для файла библиотеки функций ...

то есть у меня нет класса, это просто файл с вспомогательными функциями ...

например, я создал проект php в ~ / www / test

и файл ~ / www / test / lib / format.php

<?php

function toUpper( $text ) {
  return strtoupper( $text );
}

function toLower( $text ) {
  return strtolower( $text );
}

function toProper( $text ) {
  return toUpper( substr( $text, 0, 1 ) ) .  toLower( substr( $text, 1) );
}
?>

tools -> создание тестов PHPUnit выдает следующую ошибку:

PHPUnit 3.4.5 от Себастьяна Бергманна.

Не удалось найти класс "format" в «/home/sas/www/test/lib/format.php".

Теперь, если я закодирую (вручную!) Файл ~ / WWW / тест / тесты / Библиотека / FormatTest.php

<?php
require_once 'PHPUnit/Framework.php';
require_once dirname(__FILE__).'/../../lib/format.php';

class FormatTest extends PHPUnit_Framework_TestCase {

  protected function setUp() {}

  protected function tearDown() {}

  public function testToProper() {
    $this->assertEquals(
            'Sebastian',
            toProper( 'sebastian' )
    );
  }
}
?>

работает нормально, могу запустить ...

но если я выберу тестовый файл из format.php, я получу

Тестовый файл для выбранного исходного файла не был найден

есть идеи?

Saludos

1033 * SAS *

ps: другой вопрос, есть ли способ обновить сгенерированные тесты, не удаляя их вручную ???

ps2: использование netbeans 2.8 dev

1 Ответ

5 голосов
/ 22 января 2010

То, как вы написали свой тестовый блок, на 100% правильно. Проблема заключается в общем соглашении и в том, как PHPUnit и Netbeans зависят от них.

Лучшая практика в наши дни - писать весь ваш код объектно-ориентированным способом. Таким образом, вместо того, чтобы иметь PHP-файл, полный таких полезных функций, как у вас, вы заключаете эти функции в класс и получаете их как статические функции. Вот пример использования вашего кода выше,

<?php

class Format
{
    public static function toUpper($text)
    {
        return strtoupper($text);
    }

    public static function toLower($text)
    {
        return strtolower($text);
    }

    public static function toProper($text)
    {
        return self::toUpper(substr($text, 0, 1 )) .  self::toLower(substr($text, 1));
    }
}

Вы бы теперь использовали свои функции так,

Format::toProper('something');

PHPUnit и Netbeans зависят от этой объектно-ориентированной философии. Когда вы пытаетесь автоматически сгенерировать тестовый пример PHPUnit, PHPUnit ищет в вашем файле класс. Затем он создает тестовый пример на основе этого класса и его открытого API и вызывает его ClassNameTest, где ClassName - имя тестируемого класса.

Neatbeans также следует этому соглашению и знает, что ClassNameTest является тестовым примером PHPUnit для ClassName, поэтому создает связь между ними в IDE.

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

Примечание: Я бы избавился от ваших двух функций toUpper() и toLower(). Там нет необходимости оборачивать встроенные функции PHP, когда в этом нет необходимости. Также нет необходимости проверять их, так как они тщательно проверены.

Примечание к сайту 2: Существует своего рода встроенный в PHP эквивалент вашей функции toProper(), называемый ucfirst().

...