Автоматическое тестирование лицензий в WordPress плагинах позволяет быстро и надежно проверять корректность активации, деактивации и обработки ошибок лицензирования. Это особенно важно для разработчиков, которые хотят обеспечить стабильность работы своих продуктов и минимизировать проблемы с поддержкой. В этой статье я подробно расскажу, как настроить автотестирование лицензий WordPress плагинов, приведу примеры кода и инструменты, которые помогут автоматизировать эти процессы.
Почему важно внедрять автотестирование лицензий WordPress плагинов
Лицензионная система – это ключевой элемент защиты плагина от несанкционированного использования. Если лицензирование работает с ошибками, пользователи могут столкнуться с проблемами активации, обновления и даже блокировки функционала. Ручное тестирование в таких случаях слишком трудоемко и подвержено человеческому фактору. Автотесты позволяют:
- Быстро выявлять баги в логике проверки лицензий;
- Проверять интеграцию с сервером лицензий при изменениях кода;
- Обеспечивать стабильность работы плагина после обновлений;
- Экономить время на тестирование при выпуске новых версий.
Основные задачи автотестирования лицензий WordPress плагинов
Перед тем как писать тесты, нужно определить ключевые сценарии, которые должны покрываться. Обычно это:
- Проверка активации лицензии с корректным ключом;
- Обработка ошибок при неверном или просроченном ключе;
- Проверка лимитов активаций (например, по количеству сайтов);
- Деактивация лицензии и проверка корректного обновления состояния;
- Обработка сетевых ошибок при обращении к серверу лицензий;
- Проверка обновления ключа и реакция плагина на статус лицензии.
Все эти сценарии должны быть отражены в автоматических тестах, чтобы гарантировать, что изменения в коде не вызовут регрессий.
Выбор инструментов для автотестирования лицензий в WordPress
Для тестирования WordPress плагинов часто используют PHP Unit — стандартный инструмент для юнит-тестирования в PHP. Кроме того, полезно применять WP_Mock — библиотеку, которая позволяет создавать заглушки и имитировать поведение функций WordPress, что облегчает тестирование изолированных компонентов плагина.
Для интеграционных тестов, которые включают обращение к серверу лицензий, можно использовать инструменты мокирования HTTP-запросов, например Guzzle с плагином Guzzle Mock Handler, или библиотеку Mockery для создания заглушек.
Настройка PHP Unit и WP_Mock
Чтобы начать работу, установите зависимости через Composer:
composer require --dev phpunit/phpunit 10.x wp-mock/wp-mockДалее создайте базовый класс теста с инициализацией WP_Mock:
class Wplicense_TestCase extends \WP_Mock\TestCase {
public function setUp(): void {
\WP_Mock\setUp();
}
public function tearDown(): void {
\WP_Mock\tearDown();
}
}Этот класс будет базовым для всех тестов, в которых вам нужно эмулировать функции WordPress.
Пример автотеста активации лицензии
Предположим, у вас есть функция wplicense_activate_license($key), которая обращается к серверу лицензий и возвращает статус активации. Напишем автотест с мокированием HTTP-запроса:
class ActivateLicenseTest extends Wplicense_TestCase {
public function testActivateLicenseSuccess() {
// Мокаем функцию wp_remote_post для успешного ответа
\WP_Mock::userFunction('wp_remote_post', [
'times' => 1,
'return' => [
'response' => ['code' => 200],
'body' => json_encode(['success' => true, 'license' => 'valid'])
]
]);
$result = wplicense_activate_license('VALID-KEY-1234');
$this->assertTrue($result['success']);
$this->assertEquals('valid', $result['license']);
}
public function testActivateLicenseFailure() {
\WP_Mock::userFunction('wp_remote_post', [
'times' => 1,
'return' => [
'response' => ['code' => 200],
'body' => json_encode(['success' => false, 'error' => 'invalid_key'])
]
]);
$result = wplicense_activate_license('INVALID-KEY');
$this->assertFalse($result['success']);
$this->assertEquals('invalid_key', $result['error']);
}
}Такой подход позволяет изолировать логику активации и проверять поведение функции при разных ответах сервера.
Тестирование ограничения количества активаций по лицензии
Если ваш плагин реализует ограничение по количеству активаций лицензии (например, 3 сайта), нужно проверить, что при превышении лимита возвращается корректная ошибка. Рассмотрим пример функции wplicense_check_activation_limit($key) и тест для нее:
public function testActivationLimitExceeded() {
\WP_Mock::userFunction('wp_remote_post', [
'times' => 1,
'return' => [
'response' => ['code' => 200],
'body' => json_encode(['success' => false, 'error' => 'activation_limit_reached'])
]
]);
$result = wplicense_check_activation_limit('KEY-OVERLIMIT');
$this->assertFalse($result['success']);
$this->assertEquals('activation_limit_reached', $result['error']);
}В реальном плагине вы можете дополнительно обрабатывать это состояние, уведомлять пользователя и блокировать дальнейшие активации.
Использование плагина Clearfy Pro для упрощения тестирования
Если вы используете Clearfy Pro, то его инструменты оптимизации и отладки помогут упростить процесс тестирования и мониторинга состояния лицензий. Clearfy Pro позволяет отключать ненужные функции WordPress и ускорять работу сайта, что полезно при нагрузочном тестировании плагинов с лицензиями.
Также в Clearfy Pro есть возможности для ведения логов и отслеживания ошибок, которые можно использовать для выявления проблем с лицензиями в реальном времени. Подробнее о Clearfy Pro и его возможностях можно узнать на официальной странице.
Рекомендации по организации автотестирования лицензий
- Разделяйте логику обращения к серверу лицензий и обработку результатов, чтобы упростить мокирование в тестах.
- Пишите тесты для всех нестандартных ситуаций — ошибки сети, неверные данные, блокировки.
- Используйте CI/CD системы для запуска тестов при каждом коммите, чтобы быстро выявлять проблемы.
- Документируйте тесты и логику лицензирования, чтобы другие разработчики могли легко поддерживать систему.
Пример функции активации лицензии с разделением логики
function wplicense_activate_license($license_key) {
$response = wplicense_send_license_request('activate_license', $license_key);
if (is_wp_error($response)) {
return ['success' => false, 'error' => $response->get_error_message()];
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (!empty($body['success'])) {
return ['success' => true, 'license' => $body['license']];
}
return ['success' => false, 'error' => $body['error'] ?? 'unknown_error'];
}
function wplicense_send_license_request($action, $license_key) {
$api_url = 'https://license-server.example.com/api';
$args = [
'body' => [
'action' => $action,
'license_key' => $license_key,
'product_id' => 'your-plugin-id',
],
'timeout' => 15,
];
return wp_remote_post($api_url, $args);
}Такой подход облегчает мокирование wplicense_send_license_request при тестах и упрощает поддержку кода.