Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Testen mit TYPO3 für Fortgeschrittene

Testen mit TYPO3 für Fortgeschrittene

Oliver Klee

May 30, 2018
Tweet

More Decks by Oliver Klee

Other Decks in Technology

Transcript

  1. Testen mit TYPO3 (advanced)
    Oliver Klee, 2018-05
    @oliklee | [email protected]
    Cartoon:
    www.fuchskind.de

    View Slide

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

    View Slide

  3. Unit-Tests sind
    klein und schnell

    View Slide

  4. Integrationstests
    testen das Zusammenspiel
    von Komponenten
    in TYPO3:

    „Functional Tests“

    View Slide

  5. Systemtests testen
    das große Ganze

    View Slide

  6. Test-Typen

    View Slide

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

    View Slide

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

    View Slide

  9. Functional

    Tests

    View Slide

  10. Akzeptanztests

    View Slide

  11. Anti-

    Zombie-

    Tests-

    View Slide

  12. Regressionstests

    View Slide

  13. Smoketests

    View Slide

  14. Smoketests

    View Slide

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

    View Slide

  16. View Slide

  17. Was

    bisher

    geschah

    View Slide

  18. View Slide

  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();

    View Slide

  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']);

    View Slide

  21. Testing-Frameworks
    Testing-Framework der PHPUnit-Extension
    typo3/testing-framework
    nimut/testing-framework

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  27. View Slide

  28. Infrastruktur

    View Slide

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

    View Slide

  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"
    },

    View Slide

  31. Konfiguration in PhpStorm

    View Slide

  32. Konfiguration in PhpStorm
    Unit-Tests
    Funktionale Tests

    View Slide

  33. View Slide

  34. Funktionale
    Repository-
    Tests

    View Slide

  35. TeaRepositoryTest.php
    class TeaRepositoryTest extends FunctionalTestCase
    {
    /**
    * @var string[]
    */
    protected $testExtensionsToLoad = ['typo3conf/ext/tea'];

    View Slide

  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);
    }

    View Slide

  37. TeaRepositoryTest.php
    /**
    * @test
    */
    public function findAllWithRecordsFindsRecordsFromAllPages()
    {
    $this->importDataSet(
    __DIR__ . '/../Fixtures/Product/Tea.xml'
    );
    $container = $this->subject->findAll();
    static::assertGreaterThanOrEqual(1, \count($container));
    }

    View Slide

  38. Fixtures/Product/Tea.xml



    1
    1
    Earl Grey
    Fresh and hot.



    1
    1
    3
    tx_tea_domain_model_product_tea
    image



    View Slide

  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()
    );
    }

    View Slide

  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());
    }

    View Slide

  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']);
    }

    View Slide

  42. Legacy-
    Projekte

    View Slide

  43. Wo anfangen?

    View Slide

  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

    View Slide

  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

    View Slide

  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?

    View Slide

  47. Wenn man ohnehin schraubt …
    Bugfixes
    neue Features
    Refactoring
    Zuerst Tests
    schreiben!

    View Slide

  48. View Slide