-Testen verteilter Anwendungen



Ähnliche Dokumente
Java-Programmierung. Remote Method Invocation - RMI

Mobile und Verteilte Datenbanken

Remote Method Invocation

Java RMI Remote Method Invocation

Remote Method Invocation

Remote Method Invocation

Der lokale und verteilte Fall

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Mobile und Verteilte Datenbanken

7.1.5 Java RMI Remote Method Invocation ( (

Musterlösung Übungsblatt 2 Netzprogrammierung WS 05/06

CORBA-Konzept. Ziele. Common Object Request Broker Architecture CORBA. Plattformunabhängige Kommunikation Transparente Verteilung von Objekten

Übungen zu Softwaretechnik

CORBA. Systemprogrammierung WS

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Themen. Web Service - Clients. Kommunikation zw. Web Services

9. Remote Method Invocation Grundlagen der Programmierung II (Java)

Client/Server-Programmierung

Client/Server-Programmierung

Warum EJB Technologie (1)?

CORBA. Eine kurze Einführung. Common Object Request Broker Architecture. Ying Lu

Konzepte von Betriebssystem-Komponenten Middleware RMI

Programmieren II. Remote Method Invocation (RMI) Heusch -- Ratz. Institut für Angewandte Informatik

Java RMI, CORBA und Firewalls

Prinzipien Objektorientierter Programmierung

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

COMMON OBJECT REQUEST BROKER ARCHITECTURE. Dmytro Pyvovar Otto-von-Guericke Universität Magdeburg

Applet Firewall und Freigabe der Objekte

Einführung in die Programmierung

Web Services stellen eine Integrationsarchitektur dar, die die Kommunikation zwischen verschiedenen Anwendungen

Programmieren in Java

8.1.5 Java RMI Remote Method Invocation

Schedulingund Thread-Ausführer

CORBA. Beispiel einer Middleware-Plattform. Christian Fass WS 2013/14 Software Engineering: Basistechnologien

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Java: Vererbung. Teil 3: super()

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

Enterprise Java Beans

Remote Methode Invocation (RMI) ETIS SS05

Java Remote Method Invocation (RMI)

Typumwandlungen bei Referenztypen

Szenario 3: Service mit erweiterter Schnittstelle

Multiuser Client/Server Systeme

Java Einführung Collections

SE2-10-Entwurfsmuster-2 15

Java Enterprise Architekturen Willkommen in der Realität

Grundlagen verteilter Systeme

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Objektorientierte Programmierung

am Beispiel von JUnit

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

3 Objektorientierte Konzepte in Java

Test-Driven Design: Ein einfaches Beispiel

Factory Method (Virtual Constructor)

Verteilte Systeme. Verteilte Objektorientierte Systeme I. Prof. Dr. Oliver Haase

Java Einführung Abstrakte Klassen und Interfaces

Client/Server-Programmierung WS2007/08. EJB/JSP: Schritt-für-Schritt Anleitung

J2EEKurs. Enterprise JavaBeans Einführung. Peter Thiemann. Sommercampus J2EEKurs, Freiburg, Germany, Universität Freiburg, Germany

Gebundene Typparameter

Objektorientierte Programmierung. Kapitel 12: Interfaces

Client/Server-Systeme

Testen von graphischen Benutzeroberflächen. 24. Juni 2015

Klausur zur Vorlesung Verteilte Systeme im SS 2007 Prof. Dr. Odej Kao 24. Juli 2007

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Algorithmen und Datenstrukturen

ObjectBridge Java Edition

Software Engineering Klassendiagramme Assoziationen

Java Einführung Packages

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Internetanbindung von Datenbanken

Neue Funktionen in Innovator 11 R5

Innere Klassen in Java

EJB jar.xml und Name Service (JNDI)

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Objektorientierte Programmierung

Übung: Verwendung von Java-Threads

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Java 2, Enterprise Edition Einführung und Überblick

Erstellung eines Frameworks für Shop Systeme im Internet auf Basis von Java

Java Kurs für Anfänger Einheit 5 Methoden

DCOM??? Seite 1

Benutzerhandbuch MedHQ-App

E.1 Object Request Brokers

Online Banking System

IEEE 802.1x Authentifizierung. IEEE 802.1x Authentifizierung IACBOX.COM. Version Deutsch

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Software-Lizenzierung und Aktivierung: Verteilen von Software mit Apple Remote Desktop

Client-Server-Beziehungen

Kommunikationsübersicht XIMA FORMCYCLE Inhaltsverzeichnis

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Java und XML 2. Java und XML

Anwendung eines Enterprise Java Beans

Konfigurationsanleitung Access Control Lists (ACL) Funkwerk. Copyright Stefan Dahler Oktober 2008 Version 1.0.

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

Scheduling Mechanisms for the Grid

Einführung in Javadoc

Transkript:

-Testen verteilter Anwendungen Seminar Simulation und Bildanalyse mit Java im SS04 Konstantin Tjo, Urs Pricking Testen verteilter Anwendungen 1

Übersicht Einführung in verteilte Anwendungen RMI (Remote Method Invocation) CORBA (Common Object Request Broker Architecture) EJB (Enterprise JavaBean) Testen verteilter Anwendungen 2

Einführung in verteilte Anwendungen Verteilung ist die logische oder physikalische räumliche Entfernung von Objekten zueinander. Zwei Objekte, die zur gemeinsamen Kommunikation nicht den gewöhnliche Methodenaufruf verwenden können, sondern Mechanismen der entfernten Kommunikation nutzen müssen, sind zueinander verteilt. Testen verteilter Anwendungen 3

Einführung in verteilte Anwendungen Realisierung über Client-Server-Architektur Server stellt Dienste zur Verfügung (Daten, Funktionen,...) sollte bekannt geben, welche Funktionalität er bietet erhält Daten, wendet Funktionen an und gibt Ergebnis zurück Client benötigt Dienste muss mit dem Server Kontakt aufnehmen können Testen verteilter Anwendungen 4

Einführung in verteilte Anwendungen Verteilungsmechanismen Sockets Remote Procedure Calls RMI CORBA EJB Testen verteilter Anwendungen 5

Einführung in verteilte Anwendungen Ziel Transparenz der Verteilung von Objekten Ort und Aufrufmechanismus des entfernten Objekts sollen für den Aufrufer verborgen bleiben entfernte Objekte sollten wie lokale Objekte behandelt werden Testen verteilter Anwendungen 6

Einführung in verteilte Anwendungen Probleme aus Testersicht Probleme der Nebenläufigkeit Auffinden anderer Objekte im Netzwerk (Naming Service) Unsicherheit der Kommunikation Testen verteilter Anwendungen 7

Was ist RMI? Remote Method Invocation = Entfernter Methoden Aufruf bzw. Entfernte Methoden Ausführung RMI stellt den Mechanismus zur Verfügung, mit dem Server und Client miteinander kommunizieren und Informationen austauschen können auf Java beschränkt und erfordert die Kenntnis über den Ort des entfernten Objekts Testen verteilter Anwendungen 8

Eine RMI-Anwendung besteht aus drei Teilen: Einem Server, welcher Methoden zu Verfügung stellt, die von entfernten Objekten nutzbar sind Mindestens einem Client, welcher die Methoden des Servers aufruft Einem Register, welches zwischen Client und Server vermittelt (rmiregistry) Testen verteilter Anwendungen 9

Testen verteilter Anwendungen 10

Ablauf: Client ruft Methode eines entfernten Objekts auf Argumente werden von einem Stub (Client-Vertreter) in ein transportfähiges Format umgewandelt (Marshalling) und an den Server gesendet Ein Skeleton (Server-Vertreter) nimmt den Aufruf entgegen, decodiert ihn (Unmarshalling) und ruft die Methode des Zielobjekts auf. Rückgabewerte werden ebenso zurückgeschickt Testen verteilter Anwendungen 11

Testen verteilter Anwendungen 12

Testvoraussetzungen: Stubs und Skeletons müssen erzeugt worden sein (z. B. mit Hilfe von rmic) RMI-Registry muss laufen (z. B. durch einen Kommandozeilenstart mit rmiregistry ) Testen verteilter Anwendungen 13

Folgende Aspekte werden überprüft : Server: Implementierung von callservice() Korrekte Verwendung von rebind() und unbind() RMI-Fähigkeit Client: Korrekte Verwendung von lookup() beim Client Implementierung von calltwice() beim Client Error-Handling RMI-Fähigkeit Testen verteilter Anwendungen 14

Test-First-Entwicklung eines Servers: Interface (Schnittstelle): import java.rmi.*; public interface MyRemoteServer extends Remote { String LOOKUP_NAME = MyRemoteServer ; String callservice() throws RemoteException; Testen verteilter Anwendungen 15

erster lokaler Test public class MyRemoteServerTest extends TestCase { public MyRemoteServerTest(String name) {... public void testcallservice() { MyRemoteServer server = new MyRemoteServerImpl(); assertequals( OK, server.callservice()); Testen verteilter Anwendungen 16

Auslagerung der statischen Naming-Schnittstelle in ein Interface: import java.rmi.*; import java.net.*; public interface MyNaming { void rebind(string name, Remote obj) throws RemoteException, MalformedURLException; void unbind(string name) throws RemoteException, NotBoundException, MalformedURLException; Testen verteilter Anwendungen 17

Wiederholung zu Mock-Objekten: Objektattrappen legen erwartetes Verhalten fest verifizieren korrektes Verhalten Testen verteilter Anwendungen 18

Mock-Implementierung der Schnittstelle: import java.rmi.*: public class MockNaming implements MyNaming { public void rebind(string name, Remote obj) {... public void unbind(string name) {... public void expectrebind(string name, Class RemoteType) {... public void expectunbind(string name) {... public void verify() {... Testen verteilter Anwendungen 19

Test unter Verwendung des Naming-Objekts: public void testcallservice() throws Exception { MockNaming mocknaming = new MockNaming(); mocknaming.expectrebind( MyRemoteServer.LOOKUP_NAME, MyRemoteServerImpl.class); MyRemoteServer server = MyRemoteServerImpl.createServer(mockNaming); assertequals( OK, server.callservice()); mocknaming.verify(); Testen verteilter Anwendungen 20

das korrekte Freigeben des Servers prüfen: public void testreleaseservice() throws Exception { mocknaming.expectrebind( MyRemoteServer.LOOKUP_NAME, MyRemoteServerImpl.class); mocknaming.expectunbind( MyRemoteServer.LOOKUP_NAME); server = MyRemoteServerImpl.createServer(mockNaming); ((MyRemoteServerImpl)server).release(); mocknaming.verify(); Testen verteilter Anwendungen 21

MyNaming-Implementierung unter Verwendung von java.rmi.naming: import java.rmi.*; import java.net.*; public class RMINaming implements MyNaming { public void rebind(string name, Remote obj) throws RemoteException, MalformedURLException { Naming.rebind(name, obj); public void unbind(string name) throws RemoteException, NotBoundException, MalformedURLException { Naming.unbind(name); Testen verteilter Anwendungen 22

Testfall für die Verwendung von RMI: public void testrealservice() throws Exception { RMINaming naming = new RMINaming(); server = MyRemoteServerImpl.createServer(naming); MyRemoteServer client = (MyRemoteServer)Naming.lookup (MyRemoteServer.LOOKUP_NAME); assertequals( OK, client.callservice()); (MyRemoteServerImpl)server).release(); Testen verteilter Anwendungen 23

Server-Implementierung (1): import java.net.*; import java.rmi.*; import java.rmi.server.*; public class MyRemoteServerImpl extends UnicastRemoteObject implements MyRemoteServer { private MyNaming naming; private MyRemoteServerImpl(MyNaming naming) throws RemoteException { super(); this.naming = naming; public String callservice() { return OK ; Testen verteilter Anwendungen 24

Server-Implementierung (2): public static MyRemoteServer createserver (MyNaming naming) throws RemoteException, MalformedURLException { MyRemoteServer server = new MyRemoteServerImpl (naming); naming.rebind(lookup_name, server); return server; public void release() throws RemoteException, MalformedURLException, NotBoundException { naming.unbind(lookup_name); Testen verteilter Anwendungen 25

Aufgaben beim Testen des Clients: korrekte Verwendung des Naming-Dienst zum Auffinden der entfernten Serverinstanz korrekte Verwendung des entfernten Serverobjekts Testen verteilter Anwendungen 26

Test-First-Entwicklung: Erweiterung der MyNaming-Schnittstelle um eine lookup()- Methode: import java.rmi.*; import java.net.*; public interface MyNaming {... Remote lookup(string name) throws NotBoundException, MalformedURLException, RemoteException; Testen verteilter Anwendungen 27

Entsprechend bei MockNaming: import java.rmi.*; public class MockNaming implements MyNaming {... public void expectlookup(string name, Remote lookup {... public Remote lookup(string name) {... Testen verteilter Anwendungen 28

Testen der lookup()-methode (1): public class MyRemoteClientTest extends TestCase { public MyRemoteClientTest(String name){... public void testlookup() throws Exception { MyRemoteServer remote = new MyRemoteServer() { public String callservice() { return ; ; Testen verteilter Anwendungen 29

Testen der lookup()-methode (2): MockNaming namingclient = new MockNaming(); namingclient.expectlookup(myremoteserver.lookup_name, remote); MyRemoteClient client = new MyRemoteClient(namingClient); namingclient.verify(); Testen verteilter Anwendungen 30

Test einer einfachen calltwice()-methode (1): public class MyRemoteClientTest extends TestCase { private MockNaming naming; public MyRemoteClientTest(String name) {... protected void setup() { naming = new MockNaming(); Testen verteilter Anwendungen 31

Test einer einfachen calltwice()-methode (2): public void testlookup() throws Exception {... public void testcalltwice() throws Exception { MyRemoteServer remote1 = this.createremoteserver( Test ); naming.expectlookup(myremoteserver.lookup_name, remote1); MyRemoteClient client1 = new MyRemoteClient(naming); assertequals( TestTest, client1.calltwice()); Testen verteilter Anwendungen 32

Test einer einfachen calltwice()-methode (3): MyRemoteServer remote2 = this.createremoteserver( Xyz ); naming.expectlookup(myremoteserver.lookup_name, remote2); MyRemoteClient client2 = new MyRemoteClient(naming); assertequals( XyzXyz, client2.calltwice()); Testen verteilter Anwendungen 33

Test einer einfachen calltwice()-methode (4): private MyRemoteServer createremoteserver(final String returnstring) { return new MyRemoteServer() { ; public String callservice() { return returnstring; Testen verteilter Anwendungen 34

Test bei Verteilungsproblemen (hier: Reaktion des Clients, falls das Serverobjekt nicht registriert ist): public void testfailinglookup() throws Exception { naming.expectlookupthrowexception( MyRemoteServer.LOOKUP_NAME, new NotBoundException( test )); try { MyRemoteClient client = new MyRemoteClient(naming); fail ( NotBoundException expected ); catch (NotBoundException expected) { Testen verteilter Anwendungen 35

Test mit echtem Server: public void testwithrealserver() throws Exception { MyNaming naming = new RMINaming(); MyRemoteServer server = MyRemoteServerImpl.createServer(naming); MyRemoteClient client = new MyRemoteClient(naming); assertequals( OKOK, client.calltwice()); ((MyRemoteServerImpl) server).release(); Testen verteilter Anwendungen 36

Bemerkung: Probleme beim Deployment im Netz werden nicht abgedeckt (Verfügbarkeit der Registry, Vermeidung von Namenskonflikten, Sicherheit,...) Î Akzeptanz- und Deploymenttests Probleme der Nebenläufigkeit werden nicht berücksichtigt Testen verteilter Anwendungen 37

CORBA Kurzer Überblick: CORBA = Common Objekt Request Broker Architecture offener Standard der Open Management Group (OMG) erlaubt beliebige Implementierungssprache Testen verteilter Anwendungen 38

CORBA Realisierung verteilter Anwendungen ähnlich wie bei RMI Definition der Schnittstelle aber in IDL (Interface Definition Language) Keine neue Programmiersprache Muss in die jeweilige Implementierungssprache übersetzt werden (z.b. durch idltojava) Kommunikation übernimmt der Object Request Broker (ORB) Testen verteilter Anwendungen 39

CORBA Testen verteilter Anwendungen 40

vs. CORBA RMI Einsatz in reinen Java- Umgebungen Plattformunabhängigkeit durch Java leicht einzusetzen CORBA Einsatz in heterogenen Umgebungen Plattformunabhängigkeit durch Sprachenunabhängigkeit komplizierter, aber flexibler Testen verteilter Anwendungen 41

EJB Was sind Enterprise JavaBeans (EJBs)? serverseitige Java-Komponenten benötigen eine eigene Laufzeitumgebung, dem sogenannten EJB-Container Der Container ist verantwortlich für den Lebenszyklus der Komponenten, das Transaktionsverhalten, die Persistenz, Lastverteilung und Sicherheit Der EJB-Server kann mehrere Container aufnehmen und bietet ihnen den Zugriff auf Systemressourcen Testen verteilter Anwendungen 42

EJB Client EJB Server Container 1 Container 2 EJB 1 EJB 4 EJB 2 EJB 3 EJB 5 Testen verteilter Anwendungen 43

EJB Aufbau einer EJB-Komponente: Remote-Interface: Nutzung der EJB-Funktionalität über diese Schnittstelle Home-Interface: Erzeugen, Auffinden und Löschen der Beans Bean-Implementierung: Implementiert die im Remote-Interface spezifizierten Methoden Deployment-Deskriptor: Informationen und Anpassungen zum betrachteten Bean Testen verteilter Anwendungen 44

EJB Testen verteilter Anwendungen 45

EJB Problematik des Testens von EJBs: Deployment einer EJB-Komponente dauert mehrere Minuten Isolation von einzelner Komponente nicht möglich, da diese von der spezifischen Konfiguration im Deployment-Deskriptor abhängt Î Ersetzen des EJB-Containers durch Mock-Objekte nicht sinnvoll Î Testen von EJBs nur innerhalb ihres Containers sinnvoll Testen verteilter Anwendungen 46

EJB Bemerkung: Einführung von EJBs zu Beginn eines Projekts ist nur selten zu rechtfertigen: If you start developing a new system, chances aren t very high that you have a good reason to start using EJBs (Vera Peeters) Testen verteilter Anwendungen 47

Quellen: J. Link: Unit Tests mit Java, dpunkt.verlag, 2002 http://java.sun.com/docs/books/tutorial/rmi/index. html http://java.sun.com/j2ee/docs.html http://www.omg.org Testen verteilter Anwendungen 48