TDD Pythonowych Mikroserwisów. Michał Bultrowicz

Podobne dokumenty
Program szkolenia: Test Driven Development (TDD) using Spock or JUnit 5

Programowanie Komponentowe WebAPI

Testy aplikacji webowych

Techniki efektywnego testowania kodu dla programistów Java (Spock

MeetingHelper. Aplikacja Android ułatwiająca przekazywanie materiałów pomiędzy uczestnikami spotkania. Instrukcja obsługi dla programisty

Automatyczne generowanie kodu. 4Developers, 26 marca 2010

Automatyczne generowanie testów z modeli. Bogdan Bereza Automatyczne generowanie testów z modeli

Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

Aplikacje WWW. Krzysztof Ciebiera. 3 kwietnia 2014

The Micro Way. czyli architektura mikroserwisów. Konrad Król

Całościowe podejście do testowania automatycznego dla programistów. (TDD, BDD, Spec. by Example, wzorce, narzędzia)

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Programowanie i projektowanie obiektowe

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Testowanie aplikacji mobilnych na platformie Android - architektura, wzorce, praktyki i narzędzia

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Podstawy programowania III WYKŁAD 6

Programowanie komponentowe 5

Spring Web MVC, Spring DI

Programowanie w Ruby

Kurs języka Python. Wykład 14. Marcin Młotkowski. 25 stycznia Python i Apache Pythonowe platformy aplikacyjne. Dystrybucja aplikacji w U*IX

Tworzenie raportów XML Publisher przy użyciu Data Templates

Całościowe podejście do testowania automatycznego dla programistów. /C#/PHP (TDD, BDD, Spec. by Example, wzorce, narzędzia)

Budowa aplikacji webowej w oparciu o Maven2 oraz przykłady testów jednostkowych. Wykonał Marcin Gadamer

Jak stworzyć system oparty o mikroserwisy Karol Buler

Logowanie zdarzeń w aplikacjach J2EE. 4Developers, 4 kwietnia 2011

Testowanie aplikacji. Kurs języka Ruby

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Programowanie obiektowe

CouchDB. Michał Nowikowski

Automatyzacja Testowania w WEB 2.0

Testowanie aplikacji Java Servlets

Architektura mikroserwisów na platformie Spring IO

SOAP i alternatywy. 1. WSDL. 2. Protokoły tekstowe XML-RPC. JSON-RPC. SOAPjr. 3. Protokoły binarne Google Protocol Bufers. Apache Thrift.

Programowanie w Internecie

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Test-Driven Development

Google Web Toolkit. Piotr Findeisen

TorqueBox. Moc Javy piękno Rubiego

W celu uruchomienia kontrolera należy w katalogu głównym kontrolera z wiersza poleceń wydać następujące polecenie: $ java -jar target/floodlight.

Oracle PL/SQL. Paweł Rajba.

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

AKADEMIA GÓRNICZO-HUTNICZA Wydział Elektrotechniki, Automatyki, Elektroniki i Informatyki

OpenPoland.net API Documentation

Wybrane działy Informatyki Stosowanej

PROCEDURA BACKUP & RECOVER Dokument opisuje procedurę backup u i odtwarzania dla bazy Oracle 11gR2

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Technologie Obiektowe PK WFMI 2010/2011

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Tworzenie i wykorzystanie usług

Zastosowanie komponentów EJB typu Session

Technologie Komponentowe. Piotr Łukasik p /

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Programowanie kontraktowe w Javie

Rozproszone systemy internetowe

Wywoływanie metod zdalnych

Hackowanie zamrożonych binariów

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Kontenery w Linux. Jakub Pieńkowski 10 maja, Jakub Pieńkowski Kontenery w Linux 10 maja, / 26

CI/CD - CO TO? PO CO? JAK?

HP Service Anywhere Uproszczenie zarządzania usługami IT

Oferta przetargu. Poland Tender. Nazwa. Miejscowość. Warszawa Numer ogłoszenia. Data zamieszczenia Typ ogłoszenia

Usługi sieciowe (Web Services)

Ćwiczenie dotyczące platformy Java EE zostało przygotowane z myślą o środowisku NetBeans w wersji 7.3 (do pobrania z

Testowanie oprogramowania w środowisku IBM Rational Software Architect

Sphinx - system dokumentacji dla Pythona

Automaty do zadań specjalnych. Olga Maciaszek-Sharma, Artur Kotow Wersja 1,

Microsoft Test Manager

Java Server Faces narzędzie do implementacji w wy prezentacji

Platformy Technologiczne

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Kurs rozszerzony języka Python

Wprowadzenie do testów jednostkowych. Marcin Dziedzic, Wiktor Żołnowski

REFERAT PRACY DYPLOMOWEJ

Automatyzacja testów aplikacji webowych w Selenium podstawy. Natalia Krawczyk

Quality in Clouds. Michał Dec

Fuzzing OWASP The OWASP Foundation Piotr Łaskawiec J2EE Developer/Pentester

PL/SQL. Zaawansowane tematy PL/SQL

Program szkolenia: REST i Microservices w PHP

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Mechanizmy refleksji w Javie i C# Autor: Aleksander Nałęczyński

PRZETWARZANIE ROZPROSZONE ZADAN` Mariusz Gil 4Developers 2012, Poznań

Deduplikacja danych. Zarządzanie jakością danych podstawowych

Dokumentacja kompilacji źródeł aplikacji 1.0

Dobre praktyki w doborze technologii rozwiązań informatycznych realizujących usługi publiczne

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Twisted. Silnik Twojego Internetu. Jan Urbański Ducksboard. PyWaw #25, Warszawa, 10 czerwca 2013

Application Layer Functionality and Protocols

BUDOWANIE APLIKACJI. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Definicja. Not Only SQL

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Aplikacje WWW - lab 11

Transkrypt:

TDD Pythonowych Mikroserwisów Michał Bultrowicz

O mnie Nazwisko: Michał Bultrowicz Poprzedni pracodawcy: Intel i to tyle Poprzednie stanowisko: techniczny team-leader w projekcie Trusted Analytics Platform Aktualne stanowisko: brak Strona: https://bultrowicz.com

Microservices: - serwisy - małe - niezależne - współpracujące

Twelve-Factor App (http://12factor.net/) 1. One codebase tracked in revision control, many deploys 2. Explicitly declare and isolate dependencies 3. Store config in the environment 4. Treat backing services as attached resources 5. Strictly separate build and run stages 6. Execute the app as one or more stateless processes 7. Export services via port binding 8. Scale out via the process model 9. Maximize robustness with fast startup and graceful shutdown 10. Keep development, staging, and production as similar as possible 11. Treat logs as event streams 12. Run admin/management tasks as one-off processes

Drobne ostrzeżenie Zaczynajcie od monolitu. Wydzielanie mikroserwisów powinno być naturalne.

TESTY!

Testy Obecne w moim serwisie (około 85% pokrycia). Nierzadko zagmatwane. Nie zapewniały, że aplikacja wstanie.

Testy JEDNOSTKOWE Obecne w moim serwisie (około 85% pokrycia). Nierzadko zagmatwane. Nie zapewniały, że aplikacja wstanie.

Testy całości aplikacji! Uruchamianie pełnego procesu aplikacji. Aplikacja nie wie, że nie jest na produkcji. Odpalane lokalnie, przed commitem. Duża pewność, że aplikacja wstanie na produkcji....wymagają zewnętrznych serwisów i baz danych...

Zewnętrzne serwisy lokalnie? Mockowanie (i tworzenie stubów ) serwisów: WireMock Pretenders (Python) Mountebank

Bazy danych (i inne systemy) lokalnie? Normalnie - żmudna instalacja Verified Fakes - rzadko dostępne Docker - po prostu stwórz wszystko, czego potrzeba

Ciut teorii

http://martinfowler.com/articles/microservice-testing/#conclusion-test-pyramid

Harry J.W. Percival, Test Driven Development with Python

TDD (tego właśnie potrzebowałem!) Korzyści Pewność przy zmianach. Automat sprawdza wszystko. Obrona przed złym designem. Wymagania: Dyscyplina Narzędzia

Implementacja

PyDAS Przepisany stary, problematyczny serwis (Java). TDD bardzo pomogło. Poligon doświadczalny....ostatecznie nie wyszedł idealny, ale dużo mnie nauczył https://github.com/butla/pydas

Pytest Zwięzły. Przejrzysta kompozycja fixture ów. Kontrola tej kompozycji (np. do skrócenia testów). Pomocne raporty błędów.

def test_something(our_service, db): db.put(test_db_entry) response = requests.get( our_service.url + '/something', headers={'authorization': TEST_AUTH_HEADER}) assert response.status_code == 200

import pytest, redis @pytest.yield_fixture(scope='function') def db(db_session): yield db_session db_session.flushdb() @pytest.fixture(scope='session') def db_session(redis_port): return redis.redis(port=redis_port, db=0)

import docker, pytest @pytest.yield_fixture(scope='session') def redis_port(): docker_client = docker.client(version='auto') download_image_if_missing(docker_client) container_id, redis_port = start_redis_container(docker_client) yield redis_port docker_client.remove_container(container_id, force=true)

@pytest.fixture(scope='function') def our_service(our_service_session, ext_service_impostor): return our_service_session

Mountepy Zarządza instancją Mountebanka. Zarządza procesami serwisów. https://github.com/butla/mountepy $ pip install mountepy

import mountepy @pytest.yield_fixture(scope='session') def our_service_session(): service_command = [ WAITRESS_BIN_PATH, '--port', '{port}', '--call', 'data_acquisition.app:get_app'] service = mountepy.httpservice( service_command, env={ 'SOME_CONFIG_VALUE': 'blabla', 'PORT': '{port}', 'PYTHONPATH': PROJECT_ROOT_PATH}) service.start() yield service service.stop()

@pytest.yield_fixture(scope='function') def ext_service_impostor(mountebank): impostor = mountebank.add_imposter_simple( port=ext_serv_stub_port, path=ext_serv_path, method='post') yield impostor impostor.destroy() @pytest.yield_fixture(scope='session') def mountebank(): mb = Mountebank() mb.start() yield mb mb.stop()

Test(y) serwisowe gotowe!

Uwagi o testach serwisowych Będą dawać duży log błędu. Zepsucie fixture a daje pokrętny log. Nie uchronią przed głupimi błędami (hardcode localhost)

Zmora commitów innych ludzi

Oręż Pomiar pokrycia testowego. Analiza statyczna (pylint, pyflakes, etc.). Testy kontraktowe.

.coveragerc (z PyDASa) [report] fail_under = 100 [run] source = data_acquisition parallel = true http://coverage.readthedocs.io/en/coverage-4.0.3/subprocess.html

Analiza statyczna tox.ini (simplified) [testenv] commands = coverage run -m py.test tests/ coverage report -m /bin/bash -c "pylint data_acquisition --rcfile=.pylintrc" https://tox.readthedocs.io

Testy kontraktowe: homonto na interfejs

swagger: '2.0' info: http://swagger.io/ version: "0.0.1" title: Some interface paths: /person/{id}: get: parameters: Kontrakt oddzielony od kodu! - name: id in: path required: true type: string format: uuid responses: '200': description: Successful response schema: title: Person type: object properties: name: type: string single: type: boolean

Bravado (https://github.com/yelp/bravado) Tworzy klienta serwisu ze Swaggera Weryfikuje Parametry Zwracane struktury danych Zwracane kody HTTP Kofnigurowalne (nie musi być tak surowe)

Zastosowanie Bravado W testach serwisowych: zamiast requests W testach jednostkowych: https://github.com/butla/bravado-falcon Jedne i drugie zyskuję funkcję testów kontraktowych.

from bravado.client import SwaggerClient from bravado_falcon import FalconHttpClient import yaml import tests # our tests package def test_contract_unit(swagger_spec): client = SwaggerClient.from_spec( swagger_spec, http_client=falconhttpclient(tests.service.api)) resp_object = client.v1.submitoperation( body={'name': 'make_sandwich', 'repeats': 3}, worker='mom').result() assert resp_object.status == 'whatever' @pytest.fixture() def swagger_spec(): with open('api_spec.yaml') as spec_file: return yaml.load(spec_file)

def test_contract_service(swagger_spec, our_service): client = SwaggerClient.from_spec( swagger_spec, origin_url=our_service.url)) request_options = { 'headers': {'authorization': A_VALID_TOKEN}, } resp_object = client.v1.submitoperation( body={'name': 'make_sandwich', 'repeats': 3}, worker='mom', _request_options=requet_options).result() assert resp_object.status == 'whatever'

Nasz ogródek ogarnięty...

???

Więcej o testach, mikroserwisach itp. Building Microservices, O'Reilly Test Driven Development with Python http://martinfowler.com/articles/microservice-testing/ Fast test, slow test (https://youtu.be/raxiirphs9k) Building Service interfaces with OpenAPI / Swagger (EP2016) System Testing with pytest and docker-py (EP2016)