Richtig testen - · PDF file Richtig testen 21.02.2019 | Sebastian Bergmann Die richtige...

Click here to load reader

  • date post

    12-Oct-2020
  • Category

    Documents

  • view

    1
  • download

    0

Embed Size (px)

Transcript of Richtig testen - · PDF file Richtig testen 21.02.2019 | Sebastian Bergmann Die richtige...

  • Richtig testen

    Sebastian Bergmann

    21. Februar 2019 | München

  •  

    Sebastian Bergmann

  • Interessengemeinscha� PHP e.V.

    Als gemeinnütziger Verein möchten wir die Akzeptanz, Verbreitung und

    Weiterentwicklung der Programmiersprache PHP und das Wissen um die

    Programmiersprache PHP in Wissenscha�, Forschung und Ausbildung

    �ördern.

     https://igphp.de/

     @igphp

    https://igphp.de/ https://twitter.com/igphp

  • Richtig testen

    21.02.2019 | Sebastian Bergmann

    Die richtige So�ware entwickeln. Das Richtige testen. Zum richtigen Zeitpunkt.

    Mit dem passenden Werkzeug sowie den richtigen Kni�en, wie man es e�ektiv und e�zient

    einsetzt. In diesem Vortrag gehen wir unter anderem den folgenden Fragen nach:

    Was will ich testen? In welchem Rahmen muss ich es testen? Wie formuliere ich den Test?

    https://thephp.cc/termine/2019/02/tech-and-drinks-at-myposter/richtig-testen

  • Richtig testen

    21.02.2019 | Sebastian Bergmann

    Die richtige So�ware entwickeln. Das Richtige testen. Zum richtigen Zeitpunkt.

    Mit dem passenden Werkzeug sowie den richtigen Kni�en, wie man es e�ektiv und e�zient

    einsetzt. In diesem Vortrag gehen wir unter anderem den folgenden Fragen nach:

    Was will ich testen? In welchem Rahmen muss ich es testen? Wie formuliere ich den Test?

    https://thephp.cc/termine/2019/02/tech-and-drinks-at-myposter/richtig-testen

  • Die �ünf W des Testens

  • Was wollen wir mit dem Test erreichen?

  • Was wollen wir mit dem Test erreichen?

    Wieviel Code müssen wir aus�ühren?

  • Was wollen wir mit dem Test erreichen?

    Wieviel Code müssen wir aus�ühren?

    Wie formulieren wir den Test?

  • Was wollen wir mit dem Test erreichen?

    Wieviel Code müssen wir aus�ühren?

    Wie formulieren wir den Test?

    Wann schreiben wir den Test?

  • Was wollen wir mit dem Test erreichen?

    Wieviel Code müssen wir aus�ühren?

    Wie formulieren wir den Test?

    Wann schreiben wir den Test?

    Wann �ühren wir den Test aus?

  • Unit Test

  • Unit Test

    Funktionieren die kleinsten Einheiten der So�ware isoliert

    voneinander?

  • Unit Test

    Funktionieren die kleinsten Einheiten der So�ware isoliert

    voneinander?

    Sind die kleinsten Einheiten der So�ware einfach zu testen?

  • Unit Test

    Funktionieren die kleinsten Einheiten der So�ware isoliert

    voneinander?

    Sind die kleinsten Einheiten der So�ware einfach zu testen?

    Sind die kleinsten Einheiten der So�ware einfach zu verwenden?

  • Unit Test

    Funktionieren die kleinsten Einheiten der So�ware isoliert

    voneinander?

    Sind die kleinsten Einheiten der So�ware einfach zu testen?

    Sind die kleinsten Einheiten der So�ware einfach zu verwenden?

    Ist die So�ware handwerklich sauber implementiert?

  • "Sauberer Code kann von anderen Entwicklern gelesen und verbessert

    werden. Er ver�ügt über Unit- und Acceptance-Tests. Er enthält

    bedeutungsvolle Namen. Er stellt zur Lösung einer Aufgabe nicht

    mehrere, sondern eine Lösung zur Ver�ügung. Er enthält minimale

    Abhängigkeiten, die ausdrücklich de�niert sind, und stellt ein klares

    und minimales API zur Ver�ügung."

    — Dave Thomas

  • "For a class to be easy to unit-test, the class must have explicit

    dependencies that can easily be substituted and clear responsibilities

    that can easily be invoked and veri�ed. In so�ware-engineering

    terms, that means that the code must be loosely coupled and highly

    cohesive — in other words, well-designed."

    — Steve Freeman und Nat Pryce

  • Unit Test

    public function testIsInitiallyEmpty(): void { $cart = new ShoppingCart;

    $this->assertEmpty($cart->items()); }

  • Unit Test

    public function testTotalForEmptyShoppingCartIs0(): void { $cart = new ShoppingCart;

    $this->assertEquals(EUR::fromCents(0), $cart->total()); }

  • Unit Test

    public function testItemCanBeAdded(): void { $item = $this->createMock(ShoppingCartItem::class);

    $cart = new ShoppingCart; $cart->addItem($item);

    $this->assertCount(1, $cart->items()); $this->assertContains($item, $cart->items()); }

  • Integrationstest

  • Integrationstest

    Funktioniert die Kommunikation zwischen den Komponenten?

  • Integrationstest

    Funktioniert die Kommunikation zwischen den Komponenten?

    Funktioniert die Kommunikation mit anderen Systemen?

  • Integrationstest

    Funktioniert die Kommunikation zwischen den Komponenten?

    Funktioniert die Kommunikation mit anderen Systemen?

    Ist die So�ware richtig integriert?

  • Akzeptanztest

  • Akzeptanztest

    Er�üllt die So�ware die Akzeptanzkriterien?

  • Akzeptanztest

    Er�üllt die So�ware die Akzeptanzkriterien?

    Funktioniert die So�ware als Ganzes?

  • Akzeptanztest (End-to-End)

    public function testShoppingCartPageCanBeDisplayed(): void { $page = $this->visit('https://my.shop/cart');

    $this->assertCount(1, $page->findAll('css', '.cart_item')); $this->assertEquals('Foo', $page->find('css', '.cart_item_name')->getHtml()); $this->assertEquals('1,23 EUR', $page->find('css', '.cart_item_unit_price')->getHtml()); $this->assertEquals('2,46 EUR', $page->find('css', '.cart_item_total_price')->getHtml()); }

  • Akzeptanztest (Edge-to-Edge)

    public function testShoppingCartPageCanBeDisplayed(): void { $_SERVER['REQUEST_METHOD'] = 'GET'; $_SERVER['REQUEST_URI'] = '/cart'; $_GET = [];

    $factory = new Factory; $application = $factory->createApplication(); $request = Request::fromSuperGlobals(); $response = $application->run($request); $content = $response->getContent();

    $this->assertShoppingCartItemCount(1, $content); $this->assertShoppingCartTotal('1,23 EUR', $content);

    // ... }

  • Akzeptanztest (Edge-to-Edge)

    public function testShoppingCartPageCanBeDisplayed(): void { $this->getRequest('/cart');

    $content = $this->run();

    $this->assertShoppingCartItemCount(1, $content); $this->assertShoppingCartTotal('1,23 EUR', $content);

    // ... }

  • https://thephp.cc/termine/2017/11/php-ruhr/domain-speci�c-assertions

    https://www.youtube.com/watch?v=FC7Sz8gwbuc

    https://thephp.cc/termine/2017/11/php-ruhr/domain-specific-assertions https://www.youtube.com/watch?v=FC7Sz8gwbuc

  • Systemtest

  • Systemtest

    Sind die Qualitätsziele erreicht?

  • "�unning end-to-end tests tells us about the the external quality of

    our system, and writing them tells us something about how well we

    [. . .] understand the domain, but end-to-end tests don't tell us how

    well we've written the code. Writing unit tests gives us a lot of

    feedback about the quality of our code, and running them tell us that

    we haven't broken any classes [. . .]"

    — Steve Freeman und Nat Pryce

  • Richtig testen

    21.02.2019 | Sebastian Bergmann

    Die richtige So�ware entwickeln. Das Richtige testen. Zum richtigen Zeitpunkt.

    Mit dem passenden Werkzeug sowie den richtigen Kni�en, wie man es e�ektiv und e�zient

    einsetzt. In diesem Vortrag gehen wir unter anderem den folgenden Fragen nach:

    Was will ich testen? In welchem Rahmen muss ich es testen? Wie formuliere ich den Test?

    https://thephp.cc/termine/2019/02/tech-and-drinks-at-myposter/richtig-testen

  • Richtig testen

    21.02.2019 | Sebastian Bergmann

    Die richtige So�ware entwickeln. Das Richtige testen. Zum richtigen Zeitpunkt.

    Mit dem passenden Werkzeug sowie den richtigen Kni�en, wie man es e�ektiv und e�zient

    einsetzt. In diesem Vortrag gehen wir unter anderem den folgenden Fragen nach:

    Was will ich testen? In welchem Rahmen muss ich es testen? Wie formuliere ich den Test?

    https://thephp.cc/termine/2019/02/tech-and-drinks-at-myposter/richtig-testen

  • $ phive install --copy phpunit Phive 0.11.0 - Copyright (C) 2015-2019 by Arne Blankerts, Sebastian Heuer and Contributors Copying phpunit-8.0.4.phar to /home/sb/project/tools/phpunit $ ./tools/phpunit --version PHPUnit 8.0.4 by Sebastian Bergmann and contributors.

  • PHA�? Phive? Warum nicht Composer?

  • https://twitter.com/s_bergmann/status/999635212723212288

    https://twitter.com/s_bergmann/status/999635212723212288

  • $ tree . ├── phive.xml ├── src │ ├── autoload.php │ ├── BillingAddress.php │ ├── CreditCard.php │