В Каталог статей для программиста добавлена новая статья.
Пример вывода результатов SQL-запроса в формате XML при помощи стандартных средств Oracle.
Этот журнал создан для информационной поддержки моего сайта Smarty IT. Основу содержания будут составлять новости и анонсы статей сайта. Посты планирую делать в основном в автоматическом режиме.
В Каталог статей для программиста добавлена новая статья.
Пример вывода результатов SQL-запроса в формате XML при помощи стандартных средств Oracle.
В Каталог статей для программиста добавлена новая статья.
Краткий пример использования Oracle SQL*Plus
В Каталог статей для программиста добавлена новая статья.
В статье очень подробно рассказывается про механизм Layout'ов в Java библиотеке SWT. На примерах поясняются различные аспекты поведения и особенности использования стандартных Layout'ов, кроме того даются советы как написать свои классы.
Статья из SmartyIT - Каталога статей для программиста.
PHPUnit. Часть 06 Дополнительные возможности
v:1.0 01.04.2010
Перевод статьи Chapter 8. TestCase Extensions.
Автор: Sebastian Bergmann
Перевод: Петрелевич Сергей
Предисловие переводчика
Эта статья продолжает серию переводов официальной документации по PHPUnit на русский язык.
Часть 1, Часть 2, Часть 3, Часть 4, Часть 5,
PHPUnit предлагает ряд возможностей, которые расширяют функционал базовых классов.
Иногда, Вам может понадобиться проверить, что выполнение метода генерирует ожидаемый результат (например через echo или print).
Класс PHPUnit_Extensions_OutputTestCase предоставляет Вам эту возможность. Этот класс использует буферизацию вывода PHP.
Пример 8.1 демонстрирует как можно наследовать класс PHPUnit_Extensions_OutputTestCase и использовать его функцию expectOutputString(), чтобы задать ожидаемый вывод тестового метода. Если фактически полученный вывод не будет соответствовать ожиданиям, то тест будет отмечен как неудачный.
<?php
require_once 'PHPUnit/Extensions/OutputTestCase.php';
class OutputTest extends PHPUnit_Extensions_OutputTestCase
{
public function testExpectFooActualFoo()
{
$this->expectOutputString('foo');
print 'foo';
}
public function testExpectBarActualBaz()
{
$this->expectOutputString('bar');
print 'baz';
}
}
?>
* This source code was highlighted with Source Code Highlighter. phpunit OutputTest PHPUnit 3.4.2 by Sebastian Bergmann. .F Time: 0 seconds There was 1 failure: 1) OutputTest::testExpectBarActualBaz Failed asserting that two strings are equal. --- Expected +++ Actual @@ -1 +1 @@ -bar +baz FAILURES! Tests: 2, Assertions: 2, Failures: 1. В Таблице 8.1 приведены методы класса PHPUnit_Extensions_OutputTestCase.
Таблица 8.1 Методы OutputTestCase
| Метод | Назначение |
|---|---|
void expectOutputRegex(string $regularExpression) | Вывод должен соответствовать заданному регулярному выражению $regularExpression. |
void expectOutputString(string $expectedString) | Вывод должен совпадать с заданной строкой $expectedString. |
bool setOutputCallback(callable $callback) | Задает функцию, которая должна быть вызвана, например, для нормализации фактического результата. |
PHPUnit предлагает еще два расширения PHPUnit_Extensions_Database_TestCase и PHPUnit_Extensions_SeleniumTestCase, которые описаны в Главе 9 и Главе 18, соответственно.
Статья из SmartyIT - Каталога статей для программиста.
PHPUnit. Часть 05 Организация тестов
v:1.0 30.03.2010
Перевод статьи Chapter 7. Organizing Tests.
Автор: Sebastian Bergmann
Перевод: Петрелевич Сергей
Предисловие переводчика
Эта статья продолжает серию переводов официальной документации по PHPUnit на русский язык.
Часть 1, Часть 2, Часть 3, Часть 4,
Комбинируемость - это одна из целей PHPUnit (см. Цели PHPUnit).
Мы хотим иметь возможность запускать несколько тестов отдельно или все вместе, например, все тесты для всего проекта целиком или все тесты для всех классов только одного компонента, который является частью проекта или тесты только для одного класса.
PHPUnit поддерживает различные способы организации тестов и объединения их в тестовый набор. В этой статье рассматривается наиболее распространенный подход.
Пожалуй самый простой способ составить набор тестов заключается в хранении файлов всех исходных текстов в специальном каталоге для тестов. PHPUnit может автоматически найти и запустить тесты, рекурсивно обойдя такой каталог.
Давайте посмотрим набор тестов для библиотеки Object_Freezer. Посмотрев на структуру каталогов, мы заметим, что структура тестовых классов - System Under Test (SUT), к каталоге Tests полностью повторяет структуру классов в каталоге Object.
Object Tests |-- Freezer |-- Freezer | |-- HashGenerator | |-- HashGenerator | | `-- NonRecursiveSHA1.php | | `-- NonRecursiveSHA1Test.php | |-- HashGenerator.php | | | |-- IdGenerator | |-- IdGenerator | | `-- UUID.php | | `-- UUIDTest.php | |-- IdGenerator.php | | | |-- LazyProxy.php | | | |-- Storage | |-- Storage | | `-- CouchDB.php | | `-- CouchDB | | | | |-- WithLazyLoadTest.php | | | | `-- WithoutLazyLoadTest.php | |-- Storage.php | |-- StorageTest.php | `-- Util.php | `-- UtilTest.php `-- Freezer.php `-- FreezerTest.php
Чтобы запустить все тесты библиотеки, нам всего лишь надо перейти в каталог с тестами PHPUnit и выполнить команду запуска:
phpunit Tests PHPUnit 3.4.2 by Sebastian Bergmann. ............................................................ 60 / 75 ............... Time: 0 seconds OK (75 tests, 164 assertions) Чтобы выполнить все тесты, которые декларированы в классе Object_FreezerTest (Tests/FreezerTest.php), надо выполнить следующую команду:
phpunit Tests/FreezerTest PHPUnit 3.4.2 by Sebastian Bergmann. ............................ Time: 0 seconds OK (28 tests, 60 assertions) Для более точного управления тестами можно использовать переключатель --filter:
phpunit --filter testFreezingAnObjectWorks Tests PHPUnit 3.4.2 by Sebastian Bergmann. . Time: 0 seconds OK (1 test, 2 assertions) Недостаток этого подхода заключается в том, что мы не можем управлять последовательностью выполнения тестов. Это может привести к проблемам зависимости тестов, см. раздел "Зависимости тестов".
Конфигурационный XML-файл PHPUnit ( Приложение C) тоже может быть применен для составления тестового набора. Пример 7.1 показывает как добавить все классы *Test, которые будут найдены в файлах *Test.php во время рекурсивного обхода каталога Tests.
Пример 7.1: Составление тестового набора при помощи XML-конфигурации
<phpunit <testsuites> <testsuite name="Object_Freezer"> <directory>Tests</directory> </testsuite> </testsuites> </phpunit> У этого подхода тот же недостаток, что и в предыдущем способе - мы не можем управлять последовательностью выполнения тестов. Это может привести к проблемам зависимости тестов, см. раздел "Зависимости тестов".
В качестве альтернативы, мы можем четко прописать порядок запуска тестов:
Пример 7.2: Составление тестового набора при помощи XML-конфигурации
<phpunit <testsuites> <testsuite name="Object_Freezer"> <file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file> <file>Tests/Freezer/IdGenerator/UUIDTest.php</file> <file>Tests/Freezer/UtilTest.php</file> <file>Tests/FreezerTest.php</file> <file>Tests/Freezer/StorageTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file> </testsuite> </testsuites> </phpunit> В состав PHPUnit входит класс PHPUnit_Framework_TestSuite. Этот класс позволяет организовать набор тестов в иерархическом порядке.
Пример 7.3 демонстрирует класс AllTests, расположенный на вершине иерархии проекта, в состав которого входит пакет Package.
Пример 7.3: Родительский класс иерархии - AllTests
<?php
require_once 'PHPUnit/Framework.php';
require_once 'Package/AllTests.php';
// ...
class AllTests
{
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('Project');
$suite->addTest(Package_AllTests::suite());
// ...
return $suite;
}
}
?>
* This source code was highlighted with Source Code Highlighter. Класс AllTests включает классы пакета Package_AllTests, которые в свою очередь включают тестовые классы.
Пример 7.4: Класс Package_AllTests
<?php
require_once 'PHPUnit/Framework.php';
require_once 'Framework/ClassTest.php';
// ...
class Package_AllTests
{
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('Package');
$suite->addTestSuite('Package_ClassTest');
// ...
return $suite;
}
}
?>
* This source code was highlighted with Source Code Highlighter. Package_ClassTest - это типовой класс тестов, который наследует класс PHPUnit_Framework_TestCase.
phpunit AllTests в каталоге Tests приведет к запуску всех тестов. phpunit AllTests в каталоге Tests/Package приведет к запуску тестов классов Package_*. phpunit ClassTest в каталоге Tests/Package приведет к запуску тестов класса Package_Class (которые объявлены в классе Package_ClassTest). phpunit --filter testSomething ClassTest в каталоге Tests/Package приведет к запуску теста testSomething класса Package_ClassTest. Классы PHPUnit_Framework_TestSuite предлагают два шаблонных метода setUp() и tearDown(), которые вызываются до первого и после последнего теста тестового набора.
Пример 7.5: Класс MySuite
<?php
require_once 'MyTest.php';
class MySuite extends PHPUnit_Framework_TestSuite
{
public static function suite()
{
return new MySuite('MyTest');
}
protected function setUp()
{
print __METHOD__ . "\n";
}
protected function tearDown()
{
print __METHOD__ . "\n";
}
}
?>
* This source code was highlighted with Source Code Highlighter. Тестовый класс MyTest, добавленный в набор тестовых методов MySuite в Примере 7.5 содержит два тестовых метода testOne() и testTwo(). В результатах работы теста видно в каком порядке вызываются функции testOne() и testTwo(), setUp() и tearDown().
MySuite::setUp() MyTest::setUp() MyTest::testOne() MyTest::tearDown() MyTest::setUp() MyTest::testTwo() MyTest::tearDown() MySuite::tearDown()
Метод setUp() класса PHPUnit_Framework_TestSuite сохраняет переменные в $this->sharedFixture. Эти данные доступны во всех тестах этого набора как $this->sharedFixture (см. раздел "Совместное использование тестового окружения").
Методы класса TestSuite setUp() и tearDown() будут вызваны даже если набор тестов не содержит тесты.