Рейтинг:0

Запуск тестов модуля без полной установки сайта

флаг in

Я создаю собственный модуль (для использования в нескольких проектах) с кодом, который опирается на материалы из ядра Drupal и сторонних модулей (например, расширяющие классы, реализацию интерфейсов, аннотирование в виде плагинов и т. д.). Я хотел бы начать писать для них тесты, для начала с юнит-тестов.Но до сих пор все ресурсы указывают на размещение модуля в установке Drupal и тестирование в этой настройке, как если бы я запускал полный сайт Drupal - даже для модульного теста.

Я скорее представлял себе, что мой модуль будет иметь исполняющую программу, зависимости и ядро ​​Drupal, которые будут зависимыми (или зависимыми от разработчиков) — точно так же, как обычно пишутся тесты JavaScript, будь то модульные тесты или безголовые браузерные тесты. То есть тестирование JavaScript не требует, чтобы ваш код вставлялся в какой-либо другой код, прежде чем вы сможете начать тестирование.

Можно ли этого достичь? Или размещение кода моих модулей в установке Drupal действительно единственный способ протестировать модули Drupal?

Jaypan avatar
флаг de
Модульные тесты не загружают всю систему и работают очень быстро.Тесты ядра, функциональные тесты и тесты JavaScript требуют начальной загрузки системы и занимают больше времени.
флаг in
@Jaypan Да, я знаю о видах тестов и о том, как они работают. Вопрос больше похож на «могут ли ядра Drupal и сторонние модули быть «зависимостями разработчиков», чтобы я мог удовлетворять зависимости своих модулей во время тестирования и запускать свои модульные тесты без настройки Drupal в стиле сайта?»
Jaypan avatar
флаг de
Не совсем, так как тогда вы будете тестировать внешний код, а не свой собственный код. В этом случае вместо этого вы создаете макеты/заглушки, которые имитируют службу, которую вы пытаетесь вызвать: https://www.drupal.org/docs/automated-testing/phpunit-in-drupal/mocking-entities-and-services- с phpunit-и-моками
Jaypan avatar
флаг de
Я объединил эти последние два комментария в более полный ответ на исходный вопрос.
Рейтинг:2
флаг de

Модульные тесты не загружают всю систему и работают очень быстро. Тесты ядра, функциональные тесты и тесты JavaScript требуют начальной загрузки системы и занимают больше времени.

При модульном тестировании вы не объявляете зависимости от стороннего кода. Это связано с тем, что модульные тесты тестируют часть кода, а не внешний код. Если во внешний код была внесена ошибка, а тестируемый код зависел от этого кода, тесты завершались неудачно, даже если тестируемый код оставался правильным. Это будет ложный сбой, и разработчик, вероятно, потратит время, пытаясь выяснить, почему его код не сработал, даже если это не так.

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

флаг in
Я понимаю, что могу имитировать зависимости (например, службы, аргументы и т. д.).Меня больше интересовало, что происходит с классами, объявленными в `use`, или с классом, который я расширяю, или с интерфейсом, который я реализую, или с трейтами, которые я применяю. Например, я создаю плагин _extending_ ядра `PluginBase`. Нужно ли мне делать что-то особенное для моего теста в отношении `PluginBase`? Ищет ли тест «PluginBase»? Нужна ли мне настоящая `PluginBase`? Или мне нужно использовать фальшивую «PluginBase»? Я просто тестирую некоторую базовую логику в этом плагине, а не весь механизм плагина.
Jaypan avatar
флаг de
Я бы посоветовал посмотреть некоторые примеры в ядре или открыть новые билеты для ваших вопросов, поскольку я чувствую, что на исходный вопрос был дан ответ, а именно на то, что вы используете макеты для работы с зависимостями в модульных тестах. И поскольку основные модули делают это, да, объявления `use` будут работать нормально.

Ответить или комментировать

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