Testen mit TYPO3 für Fortgeschrittene

Testen mit TYPO3 für Fortgeschrittene

610644ae9328059c33a272d08b90c75d?s=128

Oliver Klee

May 30, 2018
Tweet

Transcript

  1. Testen mit TYPO3 (advanced) Oliver Klee, 2018-05 @oliklee | typo3-coding@oliverklee.de

    Cartoon: www.fuchskind.de
  2. Test-Level http://filipdefar.com/2015/06/tested-be-thy-name.html

  3. Unit-Tests sind klein und schnell

  4. Integrationstests testen das Zusammenspiel von Komponenten in TYPO3:
 „Functional Tests“

  5. Systemtests testen das große Ganze

  6. Test-Typen

  7. Blackbox-Tests testen das nach außen Sichtbare

  8. Whitebox-Tests wie genau es innen funktioniert testen,

  9. Functional
 Tests

  10. Akzeptanztests

  11. Anti-
 Zombie-
 Tests-

  12. Regressionstests

  13. Smoketests

  14. Smoketests

  15. Story-Tests für Behavior-Driven Development (BDD)

  16. None
  17. Was
 bisher
 geschah

  18. None
  19. Deprecated seit PHPUnit 5.4.0 $this->backEndUser = $this->getMock( BackendUserAuthentication::class ); Empfohlen

    seit PHPUnit 5.4.0 $this->backEndUser = $this->createMock( BackendUserAuthentication::class ); Änderungen bei Mocks $this->backEndUser = $this->getMockBuilder( BackendUserAuthentication::class )->disableOriginalConstructor() ->disableOriginalClone();
  20. Prophecy: Empfohlen für Stubs (vollständige Mocks) Änderungen bei Mocks $this->viewProphecy

    = $this->prophesize(TemplateView::class); $this->view = $this->viewProphecy->reveal(); … $this->viewProphecy->assign('tea', $tea)->shouldBeCalled(); PHPUnit-Mocks: Weiterhin empfohlen für partielle Mocks $this->controller = $this->getMockBuilder(TeaController::class) ->setMethods(['forward', 'redirect']);
  21. Testing-Frameworks Testing-Framework der PHPUnit-Extension typo3/testing-framework nimut/testing-framework

  22. Testing-Frameworks Testing-Framework der PHPUnit-Extension typo3/testing-framework nimut/testing-framework erhält keine neuen Features

    mehr kompatibel bis TYPO3 CMS 8.7 benutzt eine echte TYPO3-Instanz
  23. Testing-Frameworks Testing-Framework der PHPUnit-Extension typo3/testing-framework nimut/testing-framework läuft auf Linux und

    Mac, nicht unter Windows API variiert zwischen TYPO3-Versionen wird vom Core-Team gepflegt
  24. Testing-Frameworks Testing-Framework der PHPUnit-Extension typo3/testing-framework nimut/testing-framework läuft auf Linux, Mac

    und Windows API ist identisch zwischen TYPO3-Versionen wird von Nicole und Helmut gepflegt
  25. Testing-Frameworks Testing-Framework der PHPUnit-Extension typo3/testing-framework nimut/testing-framework nicht für neue Projekte

    benutzen für Projekte unter genau einer TYPO3-Version für Extensions über mehrere TYPO3-Versionen
  26. PhantomJS ist tot stattdessen empfohlen: Chromedriver Änderungen bei Akzeptanztests PHPUnit-Selenium

    wird nicht mehr brauchbar gewartet hat keine aktuelle Dokumentation Benutzung ist weiterhin umständlich Codeception bietet High-Level-Browser-Tests mit und ohne Selenium unterstützt u.a. Chromedriver und PhpBrowser
  27. None
  28. Infrastruktur

  29. https://github.com/oliverklee/tea

  30. composer.json "require-dev": { "typo3/cms-fluid-styled-content": "^7.6.23 || ^8.7.10", "helhum/typo3-composer-setup": "^0.5.1", "helmich/typo3-typoscript-lint":

    "^1.4.4", "nimut/testing-framework": "^3.0", "roave/security-advisories": "dev-master" },
  31. Konfiguration in PhpStorm

  32. Konfiguration in PhpStorm Unit-Tests Funktionale Tests

  33. None
  34. Funktionale Repository- Tests

  35. TeaRepositoryTest.php class TeaRepositoryTest extends FunctionalTestCase { /** * @var string[]

    */ protected $testExtensionsToLoad = ['typo3conf/ext/tea'];
  36. TeaRepositoryTest.php protected function setUp() { parent::setUp(); $this->persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class); /**

    @var ObjectManager $objectManager */ $objectManager = GeneralUtility::makeInstance(ObjectManager::class); $this->subject = $objectManager->get(TeaRepository::class); } /** * @test */ public function findAllForNoRecordsReturnsEmptyContainer() { $container = $this->subject->findAll(); static::assertCount(0, $container); }
  37. TeaRepositoryTest.php /** * @test */ public function findAllWithRecordsFindsRecordsFromAllPages() { $this->importDataSet(

    __DIR__ . '/../Fixtures/Product/Tea.xml' ); $container = $this->subject->findAll(); static::assertGreaterThanOrEqual(1, \count($container)); }
  38. Fixtures/Product/Tea.xml <?xml version="1.0" encoding="utf-8"?> <dataset> <tx_tea_domain_model_product_tea> <uid>1</uid> <pid>1</pid> <title>Earl Grey</title>

    <description>Fresh and hot.</description> </tx_tea_domain_model_product_tea> … <sys_file_reference> <uid>1</uid> <pid>1</pid> <uid_foreign>3</uid_foreign> <tablenames>tx_tea_domain_model_product_tea</tablenames> <fieldname>image</fieldname> <l10n_diffsource></l10n_diffsource> </sys_file_reference> </dataset>
  39. TeaRepositoryTest.php /** * @test */ public function findByUidForExistingRecordReturnsModelWithData() { $this->importDataSet(

    __DIR__ . '/../Fixtures/Product/Tea.xml' ); $uid = 1; /** @var Tea $model */ $model = $this->subject->findByUid($uid); static::assertNotNull($model); static::assertSame('Earl Grey', $model->getTitle()); static::assertSame( 'Fresh and hot.’, $model->getDescription() ); }
  40. TeaRepositoryTest.php /** * @test */ public function fillsImageRelation() { $this->importDataSet(

    __DIR__ . '/../Fixtures/Product/Tea.xml' ); $uid = 3; /** @var Tea $model */ $model = $this->subject->findByUid($uid); $image = $model->getImage(); static::assertInstanceOf(FileReference::class, $image); static::assertSame(1, $image->getUid()); }
  41. TeaRepositoryTest.php /** * @test */ public function addAndPersistAllCreatesNewRecord() { $title

    = 'Godesberger Burgtee'; $model = new Tea(); $model->setTitle($title); $this->subject->add($model); $this->persistenceManager->persistAll(); $databaseRow = $this->getDatabaseConnection() ->selectSingleRow( '*', 'tx_tea_domain_model_product_tea', 'uid = ' . $model->getUid() ); static::assertSame($title, $databaseRow['title']); }
  42. Legacy- Projekte

  43. Wo anfangen?

  44. Ein Test-Grundgerüst schaffen Testing- Framework einbinden Starter-Test assertSame(1,1); Unit-Tests Model-Tests

    auf AbstractEntity Functional Tests Repository-Tests für das Laden von Models
  45. „Low-hanging fruit“ pflücken Model-Tests für Getter/Setter (Live-Templates) Utility-Klassen Unit-Tests oder

    funktionale Tests Controller-Tests Forwards und Redirects mit partiellen Mocks Repositories funktionale Tests fürs das Mappen von Feldern Controller-Tests Datenfluss:
 Views <=> Repositories
  46. Wichtige Tests schreiben Hohes Risiko Was darf auf gar keinen

    Fall kaputtgehen? Fragilität Was geht öfter mal kaputt? Beweglichkeit Welchen Code verändern wir oft?
  47. Wenn man ohnehin schraubt … Bugfixes neue Features Refactoring Zuerst

    Tests schreiben!
  48. None