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

Testumgebungen automatisiert und reproduzierbar erstellen

Testumgebungen automatisiert und reproduzierbar erstellen

Der Vortrag zeigt, wie mit Vagrant virtualisierte Testumgebungen automatisiert erstellt werden können. Die Umgebungen können von Entwicklern als Sandbox für exploratives Testen verwendet werden. Außerdem stellen sie automatisierten Builds die benötigten Dienste für Integrationstests zur Verfügung.

30132ea065e550e8ec20ac951b4368f6?s=128

Jörg Rathlev

May 13, 2014
Tweet

Transcript

  1. Jörg Rathlev | shopping24 Testumgebungen automatisiert und reproduzierbar erstellen

  2. shopping24 internet group

  3. ‣ Testsysteme automatisiert erstellen
 mit Vagrant und Maven ‣ Überblick

    über die Tool-Landschaft ‣ Tipps und Tricks aus der Praxis Inhalt
  4. Wie testet man ein
 Data Warehouse? Image © Larry Johnson,

    https://www.flickr.com/photos/drljohnson/4917215160
  5. public class ExampleDaoTest { private EmbeddedDatabase db; @Before
 public void

    setUp() throws Exception {
 db = new EmbeddedDatabaseBuilder()
 .setType(EmbeddedDatabaseType.HSQL)
 .addScript("jdbc/schema.sql")
 .build();
 } Was bisher geschah …
  6. public class ExampleDaoTest { private EmbeddedDatabase db; @Before
 public void

    setUp() throws Exception {
 db = new EmbeddedDatabaseBuilder()
 .setType(EmbeddedDatabaseType.HSQL)
 .addScript("jdbc/schema.sql")
 .build();
 } Was bisher geschah … Aber: Datenbank in Produktion
 ist PostgreSQL
  7. http://12factor.net

  8. Vagrant Vagrant ist ein Werkzeug, mit dem automatisiert virtuelle Maschinen

    erzeugt und konfiguriert werden. ! http://www.vagrantup.com/
  9. Demo!

  10. None
  11. None
  12. None
  13. ‣ Öffnet SSH-Verbindung zur virtuellen Maschine ‣ Default: User „vagrant“,

    Anmeldung mit in Vagrant hinterlegtem SSH-Schlüssel ‣ Achtung: „privater“ Schlüssel wird mit Vagrant ausgeliefert. Nicht verwenden für öffentlich zugängliche Maschinen! ‣ Alternative Schlüssel können konfiguriert werden vagrant ssh
  14. Vagrantfile Vagrant.configure("2") do |config| ! config.vm.box = "centos6-6.4" config.vm.box_url =

    "http://..." config.vm.network :forwarded_port, guest: 5432, host: 5432 config.vm.network :forwarded_port, guest: 8080, host: 8080 config.vm.synced_folder "src/main/resources/database/", "/database" ! config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] end ! config.vm.provision "puppet_server" do |puppet| ... end end
  15. Vagrantfile: Base Box Vagrant.configure("2") do |config| ! config.vm.box = "centos6-6.4"

    config.vm.box_url = "http://..." config.vm.network :forwarded_port, guest: 5432, host: 5432 config.vm.network :forwarded_port, guest: 8080, host: 8080 config.vm.synced_folder "src/main/resources/database/", "/database" ! config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] end ! config.vm.provision "puppet_server" do |puppet| ... end end
  16. Vagrantfile: Provisioning Vagrant.configure("2") do |config| ! config.vm.box = "centos6-6.4" config.vm.box_url

    = "http://..." config.vm.network :forwarded_port, guest: 5432, host: 5432 config.vm.network :forwarded_port, guest: 8080, host: 8080 config.vm.synced_folder "src/main/resources/database/", "/database" ! config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] end ! config.vm.provision "puppet_server" do |puppet| ... end end
  17. Vagrantfile: Provisioning Vagrant.configure("2") do |config| ! config.vm.box = "centos6-6.4" config.vm.box_url

    = "http://..." config.vm.network :forwarded_port, guest: 5432, host: 5432 config.vm.network :forwarded_port, guest: 8080, host: 8080 config.vm.synced_folder "src/main/resources/database/", "/database" ! config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] end ! config.vm.provision "puppet_server" do |puppet| ... end end ‣ Puppet ‣ Chef ‣ Shell-Skripte ‣ Ansible ‣ CFEngine ‣ …
  18. Vagrantfile: Port Forwarding Vagrant.configure("2") do |config| ! config.vm.box = "centos6-6.4"

    config.vm.box_url = "http://..." config.vm.network :forwarded_port, guest: 5432, host: 5432 config.vm.network :forwarded_port, guest: 8080, host: 8080 config.vm.synced_folder "src/main/resources/database/", "/database" ! config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] end ! config.vm.provision "puppet_server" do |puppet| ... end end
  19. Vagrantfile: Synced Folders Vagrant.configure("2") do |config| ! config.vm.box = "centos6-6.4"

    config.vm.box_url = "http://..." config.vm.network :forwarded_port, guest: 5432, host: 5432 config.vm.network :forwarded_port, guest: 8080, host: 8080 config.vm.synced_folder "src/main/resources/database/", "/database" ! config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] end ! config.vm.provision "puppet_server" do |puppet| ... end end
  20. Puppet-Manifest class s24::roles::sea_controlling { class { 'java': vendor => 'oracle',

    } ! class { 'postgresql::server': listen_addresses => '*', postgres_password => 'secret', } ! ! # memory settings (not in vagrant) if (!$::is_vagrant) { postgresql::server::config_entry { 'shared_buffers': value => '180GB', } } ! ...
  21. Flyway src/main/resources/database/ v1__Initial_Scheme.sql v2__Add_Column_Example.sql v3__Add_Index_Example.sql … $ mvn flyway:migrate

  22. Flyway als Maven-Plugin <plugin> <groupId>com.googlecode.flyway</groupId> <artifactId>flyway-maven-plugin</artifactId> <version>2.3.1</version> <configuration> <locations> <location>

    filesystem:${basedir}/src/main/resources/database </location> </locations> <url>${database-url}</url> </configuration> <dependencies> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.1-901.jdbc4</version> </dependency> </dependencies> </plugin>
  23. Maven: Flyway konfigurieren <plugin> <groupId>com.googlecode.flyway</groupId> <artifactId>flyway-maven-plugin</artifactId> <version>2.3.1</version> <configuration> <locations> <location>

    filesystem:${basedir}/src/main/resources/database </location> </locations> <url>${database-url}</url> </configuration> <dependencies> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.1-901.jdbc4</version> </dependency> </dependencies> </plugin> Wird über ein Maven-Profil gesetzt (live / test)
  24. Maven: Flyway konfigurieren <profile> <!-- Run integration tests against the

    integration test database --> <id>integration-test</id> <properties> <database-url>jdbc:postgresql://localhost:5432/...</database-url> </properties> <build> <plugins> <plugin> <groupId>com.googlecode.flyway</groupId> <artifactId>flyway-maven-plugin</artifactId> <executions> <execution> <goals> <goal>clean</goal> <goal>migrate</goal> </goals> ...
  25. Maven: Testausführung mit Flyway <profile> <!-- Run integration tests against

    the integration test database --> <id>integration-test</id> <properties> <database-url>jdbc:postgresql://localhost:5432/...</database-url> </properties> <build> <plugins> <plugin> <groupId>com.googlecode.flyway</groupId> <artifactId>flyway-maven-plugin</artifactId> <executions> <execution> <goals> <goal>clean</goal> <goal>migrate</goal> </goals> ...
  26. Testumgebung in der Cloud $ vagrant up --provider=aws ‣ Virtualbox

    ‣ AWS ‣ VMWare ‣ Hyper-V ‣ Docker ‣ …
  27. Testsystem richtet Datenbank für Test ein Vagrant erzeugt startet richtet

    System ein ‣ PostgreSQL ‣ Tomcat ‣ … Tests verwenden Maven startet
  28. Tipps & Tricks Image © Steven Depolo, https://www.flickr.com/photos/stevendepolo/3517227492

  29. vagrant ssh-config

  30. vagrant ssh-config $ vagrant ssh-config > tmpfile $ ssh -F

    tmpfile In Deployment-Skripten verwenden
  31. Puppetmaster & Zertifikate Image © Dennis Wong, https://www.flickr.com/photos/denniswong/2406135310

  32. Image © Leonardo Aguiar, https://www.flickr.com/photos/sensechange/523200676 Einstieg ohne Puppet: Provisioning mit

    Shell-Skripten
  33. “One of the nice things about being on the cloooooooooooud

    is that, if you've got your infrastructure managed right, a developer who wants a sandbox – for any reason – should be able to get one with about as much difficulty as getting office paper, and be able to bin it with about as much regret.” ! Patrick McKenzie
  34. „Keine Überraschungen mehr“ Image © Pascal, https://www.flickr.com/photos/pasukaru76/5218621316

  35. Fragen? Anregungen? ! joerg.rathlev@s24.com @joergrathlev
 developer.s24.com we’re hiring!

  36. ‣ Torsten Bøgh Köster: Provisioning Vagrant using a Puppet master

    - the reliable way
 https://developer.s24.com/blog/11-14-2013/vagrant_with_puppetmaster.html
 Erklärt, wie man in einer Vagrant-Umgebung die Zertifikate für eine Authentifizierung am Puppetmaster einrichtet. ‣ Jörg Rathlev: Database Integration Tests with Vagrant and Maven
 https://developer.s24.com/blog/02-21-2014/database-integration-tests-vagrant-maven.html ‣ Daniel Lucks: Tutorial: Create a development environment using Vagrant and Puppet
 https://developer.s24.com/blog/12-22-2013/development-environment-with-vagrant-and-puppet.html
 Testumgebungen mit Vagrant für die Web-Entwicklung erstellen. ‣ Adam Wiggins: The Twelve-Factor App
 http://12factor.net/
 Empfehlungen für Architektur und Entwicklungsprozess, um „Cloud-fähige“ Anwendungen zu entwickeln. ‣ Tools
 Vagrant: http://www.vagrantup.com/
 Virtualbox: https://www.virtualbox.org/
 Puppet: http://puppetlabs.com/
 Maven: http://maven.apache.org/
 Flyway: http://flywaydb.org/
 Packer: http://www.packer.io/ (Tool zum Erstellen von Vagrant-Baseboxen, AMIs etc.)
 Quellen & Lesetipps