Pisząc moje moduły, próbuję dostarczyć im testy jednostkowe dla najbardziej krytycznych części aplikacji. Istnieje jednak obecnie (Magento 2.1.3) kilka sposobów pisania testów jednostkowych:
Różne sposoby testowania
- Zintegruj go
bin/magento dev:tests:run unit
i uruchom na domyślnych ustawieniach phpunit dołączonych do Magento. - Napisz je osobno, uruchom je
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
i kpij z wszystkiego, co jest Magento. - Napisz je osobno, wyśmiewaj wszystko i użyj systemowej wersji PHPUnit.
- Napisz je osobno, uruchom je
vendor/bin/phpunit
, ale nadal korzystaj z\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 i PHPUnit
Poza tym Magento 2 jest dostarczany w pakiecie z PHPUnit 4.1.0, który nie jest kompatybilny z PHP7. Podpisywanie typów tubylców (jak string
i `int) i deklarowanie typów zwrotów w twoich podpisach spowoduje zgłaszanie błędów. Na przykład interfejs / klasa z takim podpisem metody:
public function foo(string $bar) : bool;
... nie będzie można kpić z PHPUnit 4.1.0. :-(
Moja obecna sytuacja
Wynika to z tego, że teraz głównie piszę testy jednostkowe w trzeci sposób (wywołując globalną wersję PHPUnit).
W moim ustawieniu mam PHPUnit 5.6 zainstalowany globalnie, więc mogę rozwiązać pisanie właściwego kodu PHP7, ale muszę wprowadzić kilka poprawek. Na przykład:
phpunit.xml
musi wyglądać tak, aby móc skorzystać z autoloadera kompozytora:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... i we wszystkich moich setUp()
metodach mam następującą kontrolę, aby móc pisać testy z kompatybilnością do przodu:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
W ten sposób, gdy moje testy są uruchamiane przez PHPUnit wbudowanego w Magentos, nie generuje to błędu.
Moje pytanie
Oto moje pytanie: czy to „zdrowy” sposób pisania testów jednostkowych? Ponieważ nie wydaje mi się właściwe, aby Magento zawierało całą gamę narzędzi pomocnych w testowaniu i nie mogę ich używać, ponieważ używam PHP7. Wiem, że na GitHub są bilety, które rozwiązują ten problem, ale zastanawiam się, jak społeczność obecnie pisze testy.
Czy istnieje sposób na pisanie testów jednostkowych w Magento 2, więc nie muszę „obniżać” kodu i nadal mogę korzystać z wbudowanych pomocników Magentos do kpienia z wszystkiego, czego dotknie menedżer obiektów? Czy może nawet złą praktyką jest używanie menedżera obiektów nawet w testach jednostkowych?
Brakuje mi wielu wskazówek / przykładów, w jaki sposób testować jednostki własnych modułów niestandardowych.