Статьи

Беспроблемная работа файловой системы во время тестирования? Да, пожалуйста!

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

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

Примечание. Этот пост требует базового понимания модульного тестирования и PHPUnit .

Чтобы что-то протестировать, мы напишем простой класс для создания файлов:

<?php namespace App\Tests; class FileCreator extends PHPUnit_Framework_TestCase { public static function create($path, $name, $content) { $file_name = rtrim($path, '/') . '/' . $name; if (file_put_contents($filename, $content)) { return true; } return false; } } 

Внутри класса у нас есть метод create() , который принимает имя файла, содержимое и путь для его сохранения.

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

Традиционный подход

 <?php namespace App\Tests; class FileCreatorTest extends PHPUnit_Framework_TestCase { protected $path; public function setUp() { $this->path = sys_get_temp_dir(); } public function tearDown() { if (file_exists($this->path . '/test.txt')) { unlink($this->path . '/test.txt'); } } public function testCreate() { $this->assertTrue(FileCreator::create($this->path, 'test.txt', 'Lorem ipsum dolor sit amet')); $this->assertFileExists($this->path . '/test.txt'); } } 

Выше мы определяем временный каталог (в setUp() ), который мы будем использовать для наших временных файлов, используя PHP sys_get_temp_dir() . Функция возвращает системный путь к каталогу для временных файлов.

Затем мы проверяем функциональность нашего класса, делая два утверждения и, наконец, tearDown() среду (в tearDown() ) для следующего набора тестов.

Там нет ничего плохого с этим кодом в его текущем состоянии. Но что если нам нужно работать с большим количеством файлов в каждом тесте? Что если код сломается, прежде чем мы получим возможность удалить временные файлы? У vfsStream есть ответы на эти вопросы.

Использование vfsStream

В этом разделе мы перепишем FileCreatorTest с помощью vfsStream.

Для его установки мы используем Composer:

 composer require mikey179/vfsStream 

Вот тестовый класс с vfsStream:

 <?php use org\bovigo\vfs\vfsStream; class FileCreatorTest extends PHPUnit_Framework_TestCase { /** * @var org\bovigo\vfs\vfsStreamDirectory */ protected $vfs; public function setUp() { // Setting up vfsStream in our test class $this->vfs = vfsStream::setup('testDirectory'); } public function testCreate() { $this->assertTrue(FileCreator::create(vfsStream::url('testDirectory'), 'test.txt', 'Lorem ipsum dolor sit amet')); $this->assertFileExists($this->vfs->getChild('test.txt')->url()); } } 

В setUp() мы настраиваем vfsStream, вызывая vfsStream::setup() . Этот метод устанавливает vfsStream и возвращает экземпляр vfsStreamDirectory . Это наш каталог контейнеров .

Контейнер каталогов на самом деле представляет собой макет файловой системы с одним основным каталогом, называемым testDirectory .

В первом утверждении мы передаем основной виртуальный путь (используя vfsStream::url() ) в FileCreator::create() вместе с именем файла и его содержимым:

 <?php // ... $this->assertTrue(FileCreator::create(vfsStream::url('testDirectory'), 'test.txt', 'Lorem ipsum dolor sit amet')); 

В следующем утверждении мы проверяем существование test.txt . Для этого мы извлекаем объект файла ( test.txt ) из контейнера каталога и получаем его полный путь:

 <?php // ... $this->assertFileExists($this->vfs->getChild('test.txt')->url()); 

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

Вывод

Помимо того, что мы видели здесь, vfsStream может предложить гораздо больше, в том числе обработку разрешений, владение, обработку больших файлов и сложных структур каталогов и т. Д. Чтобы узнать больше об этом, ознакомьтесь с их официальной документацией или дождитесь некоторые предстоящие продвинутые учебники на SitePoint!

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