кодесурса
«PHPUnit

Подробнее о светильниках

script1adsense2code
script1adsense3code

Вступление

# Больше setUp (), чем tearDown ()

В PHPUnit `setUp ()` и `tearDown ()` используются симметрично в теории, но не на практике. На практике `tearDown ()` становится действительно необходимым для реализации, когда мы выделяем ресурсы, такие как файлы и сокеты, в функции `setUp ()`.

В случае, когда содержимое нашего `setup ()` является просто обычными объектами PHP, функцию `tearDown ()` обычно можно игнорировать. Однако в ситуации, когда в функции `setUp ()` было создано много объектов, мы могли бы также захотеть расстроить некоторые из этих переменных, указывающих на эти объекты в функции `tearDown ()`, чтобы они могли быть собраны сборщиком мусора.

Следует отметить, что сборка мусора объектов тестового примера не предсказуема.

#variations

Что происходит в ситуации, когда у нас есть два или более тестов, настройки которых немного различаются? PHPUnit предлагает два возможных решения для этого типа сценария, которые

  • Что происходит в ситуации, когда у нас есть два или более тестов, настройки которых немного различаются? PHPUnit предлагает два возможных решения для этого типа сценария, которые
  • Когда настройка действительно отличается, нам нужен другой класс тестовых примеров. PHPUnit предлагает, чтобы мы назвали класс после различия в настройке.

#Sharing Fixture

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

Соединение с базами данных является хорошим примером приспособления, которое имеет смысл разделять между несколькими тестами: вы входите в базу данных один раз и повторно используете соединение с базой данных вместо создания нового соединения для каждого теста. Это заставит наши тесты работать быстрее.

Пример ниже иллюстрирует совместное использование соединения с базой данных в нескольких тестах. Он использует методы шаблона `setUpBeforeClass ()` и `tearDownAfterClass ()` для подключения к базе данных перед первым тестом класса тестового набора 'и для отключения от базы данных после последнего теста тестового примера, соответственно.

<?php
use PHPUnit\Framework\TestCase;
class DatabaseTest extends TestCase
{
    protected static $dbh;
    public static function setUpBeforeClass(): void
    {
        self::$dbh = new PDO('sqlite::memory:');
    }
    public static function tearDownAfterClass(): void
    {
        self::$dbh = null;
    }
}
?>

В PHPUnit подчеркивается, что совместное использование приборов между тестами снижает ценность этих тестов. Это подчеркивает необходимость слабой связи объектов, так как совместное использование устройств способствует плохой разработке программ. Он поощряет написание тестов с заглушками и хорошим дизайном программ, ориентированных на слабосвязанные программы.

#Global State

Было исследовано, что трудно тестировать код, который использует синглтоны. Эта трудность также относится к коду, который использует глобальные переменные. Как правило, код, который мы хотим протестировать, тесно связан с глобальной переменной, и мы не можем контролировать ее создание. Дополнительной проблемой является тот факт, что изменение одного теста на глобальную переменную может нарушить другой тест.

Глобальные переменные в PHP работают так:

  • Глобальная переменная `$ foo = 'bah';` хранится как `$ GLOBALS ['foo'] = 'bah';`.
  • Переменная $ GLOBALS является так называемой суперглобальной переменной.
  • Суперглобальные переменные - это встроенные переменные, которые всегда доступны во всех областях.
  • В области действия функции или метода вы можете получить доступ к глобальной переменной $ foo, напрямую обращаясь к $ GLOBALS ['foo'] или используя `global $ foo;` для создания локальной переменной со ссылкой на глобальную переменную.

Помимо глобальных переменных, статические атрибуты классов также являются частью глобального состояния.

В более ранних версиях PHP по умолчанию PHPUnit запускает тесты таким образом, что изменяется на глобальные и суперглобальные переменные ($ GLOBALS, $ _ENV, $ _POST, $ _GET, $ _COOKIE, $ _SERVER, $ _FILES, $ _REQUEST) не влияют на другие тесты.

Но начиная с версии 6 PHP, операция резервного копирования и восстановления глобальных и суперглобальных переменных больше не выполняется PHPUnit по умолчанию. Теперь его можно активировать, используя параметр --globals-backup или установив backupGlobals = "true" в файле конфигурации XML.

Используя параметр --static-backup или параметр backupStaticAttributes = "true" в файле конфигурации XML, эту изоляцию можно распространить на статические атрибуты классов.

Замечания:

Методы serialize () и unserialize () используются в резервной копии для глобальной переменной и статических атрибутов класса.

Некоторые классы, такие как `PDO`, не поддерживают сериализацию своих объектов. Таким образом, операция резервного копирования прерывается, когда такие объекты хранятся в массиве $ GLOBAL.

Операциями резервного копирования и восстановления глобальных переменных можно управлять с помощью аннотации @backupGlobals, которая обсуждается в разделе @backupGlobals. С другой стороны,

Глобальные переменные могут быть помещены в черный список и, таким образом, будут исключены из операций резервного копирования и восстановления, просто предоставив список, как показано ниже:

class MyTest extends TestCase
{
    protected $backupGlobalsBlacklist = ['globalVariable'];
    // ...
}

Заметка

Установка свойства `$ backupGlobalsBlacklist` в примере с методом` setUp () `не имеет никакого эффекта.

Аннотация `@ backupStaticAttributes`, которая будет обсуждаться в @backupStaticAttributes, может использоваться для резервного копирования всех значений статических свойств во всех объявленных классах перед каждым тестом и их восстановления после этого.

Он обрабатывает все классы, объявленные во время запуска теста, а не только сам класс теста. Это относится только к статическим свойствам класса, а не к статическим переменным внутри функций.

Заметка

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

То же самое относится и к статическим свойствам классов, которые были недавно загружены / объявлены в тесте. Они не могут быть сброшены до их первоначального объявленного значения по умолчанию после теста, так как это значение неизвестно. Какое бы значение не было установлено, оно попадет в последующие тесты.

Для модульных тестов рекомендуется явно сбрасывать значения тестируемых статических свойств в вашем коде setUp () (и в идеале также tearDown (), чтобы не влиять на последующие выполненные тесты).

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

class MyTest extends TestCase
{
    protected $backupStaticAttributesBlacklist = [
        'className' => ['attributeName']
    ];
    // ...
}

Установка свойства $ backupStaticAttributesBlacklist внутри, например, метода setUp (), также не имеет никакого эффекта.

Предыдущий: Светильники
Далее: Организация тестов в phpunit

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code