Коли я пишу свої модулі, я намагаюся поставити їм одиничні тести для найважливіших частин програми. Однак на даний момент (Magento 2.1.3) існує кілька способів написання одиничних тестів:
Різні способи тестування
- Інтегруйте його
bin/magento dev:tests:run unit
та запустіть його над типовими параметрами phpunit, що в комплекті з Magento. - Пишіть їх окремо, запускайте їх
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
і знущайтесь над усім, що є Magento. - Пишіть їх окремо, знущайтеся над усім і використовуйте глобальну системну версію PHPUnit.
- Пишіть їх окремо, запускайте їх
vendor/bin/phpunit
, але все ж користуйтеся\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 і PHPUnit
Крім того, Magento 2 постачається в комплекті з PHPUnit 4.1.0, що не сумісно з PHP7. Уродженці типу натяку (типу string
та `int) та оголошення типу повернення у ваших підписах призведе до помилок. Наприклад, інтерфейс / клас із таким підписом методу:
public function foo(string $bar) : bool;
... не зможе знущатися PHPUnit 4.1.0. :-(
Моя нинішня ситуація
Через те, що зараз я переважно пишу свої одиничні тести третім способом (за допомогою виклику системно-глобальної версії PHPUnit).
У моїй установці у мене PHPUnit 5.6 встановлений у всьому світі, тож я можу вирішити написати належний PHP7-код, але мені доведеться зробити деякі налаштування. Наприклад:
phpunit.xml
має виглядати так, щоб я міг скористатися композитором автозавантажувача:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... і в усіх моїх setUp()
-методах у мене є така перевірка, щоб я могла написати свої тести з сумісністю вперед:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
Таким чином, коли мої тести виконуються вбудованим PHPUnit в Magentos, це не призводить до помилок.
Моє запитання
Тож ось моє запитання: це «здоровий» спосіб написання одиничних тестів? Тому що мені не здається правильним, що Magento поставляється в комплекті з цілою купою інструментів для тестування, і я не можу їх використовувати, оскільки я використовую PHP7. Я знаю, що на GitHub є квитки, які стосуються цього питання, але мені цікаво, як громада зараз пише тести.
Чи є спосіб написати одиничні тести в Magento 2, щоб мені не довелося «понижувати» код і все ще можу використовувати вбудовані помічники Magentos для знущання над усім, до чого торкається менеджер об’єктів? Або навіть погана практика використовувати диспетчер об'єктів навіть у ваших тестових підрозділах?
Мені не вистачає безлічі вказівок / прикладів щодо правильного способу тестування власних спеціальних модулів.