Microservice Teststrategie mit Symfony2

3.228 Aufrufe

Veröffentlicht am

Was teste ich in einer Symfony2-Anwendung eigentlich wie? Sollte ich einen klassichen PHPUnit-Test, einen funktionalen Symfony2-WebTestCase oder vielleicht einen Behat-Test schreiben? Das Infodeck "Testing Strategies in a Microservice Architecture" von ThoughtWorks beschreibt eine sehr sinnvolle Strategie zum Testen von Microservice-Anwendungen, bietet aber auch gute Entscheidungshilfen zum Testen von Anwendungen im Allgemeinen. Mit diesem Vortrag möchte ich unseren Ansatz bei Chefkoch.de zeigen, die allgemeine Strategie von ThoughtWorks auf ein konkretes Symfony2 Projekt anzuwenden.

Veröffentlicht in: Software

Microservice Teststrategie mit Symfony2

  1. 1. Microservice-Teststrategie mit Symfony2 ein Vortrag von Per Bernhardt
  2. 2. Mein Name ist Per http://perprogramming.de Ich bin ein Chefkoch http://www.chefkoch.de
  3. 3. Agenda • Worum geht es? • Microservices • Testarten • Teststrategien • Zusammenfassung • Q & A
  4. 4. Worum geht es?
  5. 5. Erstmal vielen Dank an Toby Clemson! http://martinfowler.com/articles/microservice-testing/
  6. 6. Microservices!
  7. 7. Microservices! Teststrategie!
  8. 8. Microservices! Teststrategie! ?
  9. 9. Microservices! Teststrategie! ?!
  10. 10. Microservices! Teststrategie! ?!
  11. 11. Microservices! Teststrategie! ?!@
  12. 12. Microservices
  13. 13. A microservice architecture is […] the single responsibility principle at the architectural level. „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#definition
  14. 14. App Bundle Bundle Bundle
  15. 15. App Bundle Bundle Bundle App Bundle App Bundle App Bundle
  16. 16. @
  17. 17. @
  18. 18. Chefkoch @
  19. 19. Chefkoch Recipe User CMS Video Blog Image @
  20. 20. „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#anatomy-modules
  21. 21. Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle
  22. 22. Testarten
  23. 23. Unit Tests
  24. 24. Unit Tests „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#testing-unit-diagram
  25. 25. Unit Tests
  26. 26. Unit Tests
  27. 27. Unit Tests
  28. 28. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  29. 29. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  30. 30. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  31. 31. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  32. 32. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  33. 33. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  34. 34. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  35. 35. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  36. 36. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  37. 37. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  38. 38. Unit Tests Symfony Service Layer Entities Repositories Doctrine ORM Gateways Guzzle @
  39. 39. Integration Tests
  40. 40. Integration Tests „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#testing-integration-diagram
  41. 41. <?php
 
 $config = DoctrineORMToolsSetup::createAnnotationMetadataConfiguration(
 '/path/to/config/files'
 );
 
 $entityManager = DoctrineORMEntityManager::create(
 [
 'driver' => 'pdo_mysql',
 'host' => 'localhost',
 'user' => 'root',
 'password' => '',
 'dbname' => 'recipe'
 ],
 $config
 ); 
 $repository = $entityManager->getRepository(
 'ChefkochRecipeDomainModelRecipe'
 ); @
  42. 42. <?php
 
 $config = DoctrineORMToolsSetup::createAnnotationMetadataConfiguration(
 '/path/to/config/files'
 );
 
 $entityManager = DoctrineORMEntityManager::create(
 [
 'driver' => 'pdo_mysql',
 'host' => 'localhost',
 'user' => 'root',
 'password' => '',
 'dbname' => 'recipe'
 ],
 $config
 ); 
 $repository = $entityManager->getRepository(
 'ChefkochRecipeDomainModelRecipe'
 ); @
  43. 43. Component Tests
  44. 44. Component Tests „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#testing-component-in-process-diagram
  45. 45. Component Tests
  46. 46. Component Tests
  47. 47. Component Tests WebTestCase!
  48. 48. Component Tests WebTestCase! SQLite
  49. 49. Component Tests WebTestCase! SQLite Mock Handler
  50. 50. <?php
 
 namespace ChefkochBundleRecipeBundleTestsController;
 
 use SymfonyBundleFrameworkBundleTestWebTestCase;
 
 class RecipeStartpageControllerTest extends WebTestCase
 {
 
 public function testRecipeStartpage()
 {
 $client = self::createClient();
 $client->request('GET', '/rezepte');
 $this->assertContains('Rezepte', $client->getResponse()->getContent());
 }
 } @
  51. 51. # config_test.yml
 doctrine:
 dbal:
 driver: pdo_sqlite
 memory: true <?php
 
 namespace ChefkochBundleRecipeBundleTestController;
 use SymfonyBundleFrameworkBundleTestWebTestCase as BaseWebTestCase;
 use DoctrineORMEntityManager;
 use DoctrineORMToolsSchemaTool;
 
 abstract class WebTestCase extends BaseWebTestCase
 {
 public function setUp()
 {
 $entityManager = self::getClient()->getContainer()->get(
 'doctrine.orm.default_entity_manager'
 );
 $schemaTool = new SchemaTool($entityManager);
 $schemaTool->createSchema(
 $entityManager->getMetadataFactory()->getAllMetadata()
 );
 }
 }
  52. 52. <?php
 
 use GuzzleHttpClient;
 use GuzzleHttpHandlerMockHandler;
 use GuzzleHttpHandlerStack;
 use GuzzleHttpPsr7Response;
 
 $mock = new MockHandler([
 new Response(
 200,
 ['Content-Type' => 'application/json'],
 '{"id": "1", "title": "Suppe"}'
 )
 ]);
 
 $handler = HandlerStack::create($mock);
 
 $client = new Client(
 ['handler' => $handler]
 );
  53. 53. Component Tests „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#testing-component-out-of-process-diagram „Out of Process“
  54. 54. @
  55. 55. @ var casper = require('casper').create();
 
 casper.test.begin('Teste Rezeptsuche', 2, function suite(test) {
 casper.start("http://api/v2/recipes", function() {
 test.assertHttpStatus(200);
 test.assertEquals(10, JSON.parse(this.getPageContent()).results.length);
 });
 casper.run(function() {
 test.done();
 });
 });
  56. 56. Contract Tests
  57. 57. Contract Tests „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#testing-contract-diagram
  58. 58. End-To-End Tests
  59. 59. End-To-End Tests „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#testing-end-to-end-diagram
  60. 60. @
  61. 61. @
  62. 62. @
  63. 63. @ /
  64. 64. @ Feature: Admin Integration
 Als Salesmitarbeiter möchte ich das Wettbewerbsbackend
 über den normalen Admin verwenden können
 
 @mink:selenium2
 Scenario: Login über Admin
 Given A sales user "admin" with password "tester"
 Given I am on "https://admin-local/rezeptwettbewerbe/admin"
 Then I should see "Benutzername:"
 When I fill in "Benutzername:" with "admin"
 When I fill in "Passwort:" with "tester"
 When I press "Einloggen!"
 Then I should see "Liste der Rezeptwettbewerbe"
 And I should see "Logout"
 And I should see "Hallo admin!"
  65. 65. Teststrategien
  66. 66. „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#conclusion-test-pyramid
  67. 67. „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#conclusion-options
  68. 68. Zusammenfassung
  69. 69. Zusammenfassung „ “ Quelle: http://martinfowler.com/articles/microservice-testing/#conclusion-summary
  70. 70. Vielen
 Dank !
  71. 71. ?Fragen http://chefkoch.jobs - We are hiring ;) http://perprogramming.de info@perprogramming.de

×