-Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft...
Transcript of -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft...
![Page 1: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/1.jpg)
Testen verteilter Anwendungen 1
-Testen verteilter Anwendungen
Seminar „Simulation und Bildanalyse mit Java“ im SS04
Konstantin Tjo, Urs Pricking
![Page 2: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/2.jpg)
Testen verteilter Anwendungen 2
Übersicht
• Einführung in verteilte Anwendungen
• RMI (Remote Method Invocation)
• CORBA (Common Object Request Broker
Architecture)
• EJB (Enterprise JavaBean)
![Page 3: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/3.jpg)
Testen verteilter Anwendungen 3
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.“
![Page 4: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/4.jpg)
Testen verteilter Anwendungen 4
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
![Page 5: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/5.jpg)
Testen verteilter Anwendungen 5
Einführung in verteilte Anwendungen
• Verteilungsmechanismen
– Sockets
– Remote Procedure Calls
– RMI
– CORBA
– EJB
![Page 6: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/6.jpg)
Testen verteilter Anwendungen 6
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
![Page 7: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/7.jpg)
Testen verteilter Anwendungen 7
Einführung in verteilte Anwendungen
• Probleme aus Testersicht
– Probleme der Nebenläufigkeit
– Auffinden anderer Objekte im Netzwerk (Naming Service)
– Unsicherheit der Kommunikation
![Page 8: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/8.jpg)
Testen verteilter Anwendungen 8
RMI
• 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
![Page 9: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/9.jpg)
Testen verteilter Anwendungen 9
RMI
• 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)
![Page 10: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/10.jpg)
Testen verteilter Anwendungen 10
RMI
![Page 11: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/11.jpg)
Testen verteilter Anwendungen 11
RMI
• 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
![Page 12: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/12.jpg)
Testen verteilter Anwendungen 12
RMI
![Page 13: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/13.jpg)
Testen verteilter Anwendungen 13
RMI
• 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“)
![Page 14: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/14.jpg)
Testen verteilter Anwendungen 14
RMI
• 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
![Page 15: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/15.jpg)
Testen verteilter Anwendungen 15
RMI
• Test-First-Entwicklung eines Servers:– Interface (Schnittstelle):
import java.rmi.*;
public interface MyRemoteServer extends Remote {
String LOOKUP_NAME = “MyRemoteServer“;
String callService() throws RemoteException;
}
![Page 16: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/16.jpg)
Testen verteilter Anwendungen 16
RMI
– erster lokaler Testpublic class MyRemoteServerTest extends
TestCase {
public MyRemoteServerTest(String name) {...}
public void testCallService() {
MyRemoteServer server = new
MyRemoteServerImpl();
assertEquals(“OK“, server.callService());
}
}
![Page 17: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/17.jpg)
Testen verteilter Anwendungen 17
RMI
• 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;
}
![Page 18: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/18.jpg)
Testen verteilter Anwendungen 18
RMI
• Wiederholung zu Mock-Objekten:
– Objektattrappen
– legen erwartetes Verhalten fest
– verifizieren korrektes Verhalten
![Page 19: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/19.jpg)
Testen verteilter Anwendungen 19
RMI
• 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() {...}
}
![Page 20: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/20.jpg)
Testen verteilter Anwendungen 20
RMI
• 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();
}
![Page 21: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/21.jpg)
Testen verteilter Anwendungen 21
RMI
• 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();
}
}
![Page 22: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/22.jpg)
Testen verteilter Anwendungen 22
RMI
• 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);
}
}
![Page 23: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/23.jpg)
Testen verteilter Anwendungen 23
RMI
• 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();
}
![Page 24: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/24.jpg)
Testen verteilter Anwendungen 24
RMI
• 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“;
}
![Page 25: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/25.jpg)
Testen verteilter Anwendungen 25
RMI
• 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);
}
}
![Page 26: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/26.jpg)
Testen verteilter Anwendungen 26
RMI
• Aufgaben beim Testen des Clients:
– korrekte Verwendung des Naming-Dienst zum Auffinden der entfernten Serverinstanz
– korrekte Verwendung des entfernten Serverobjekts
![Page 27: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/27.jpg)
Testen verteilter Anwendungen 27
RMI
• 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;
}
![Page 28: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/28.jpg)
Testen verteilter Anwendungen 28
RMI
• Entsprechend bei MockNaming:
import java.rmi.*;
public class MockNaming implements MyNaming {
...
public void expectLookup(String name,
Remote lookup {...}
public Remote lookup(String name) {...}
}
![Page 29: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/29.jpg)
Testen verteilter Anwendungen 29
RMI
• 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 ““;
}
};
![Page 30: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/30.jpg)
Testen verteilter Anwendungen 30
RMI
• Testen der lookup()-Methode (2):
MockNaming namingClient = new MockNaming();
namingClient.expectLookup(MyRemoteServer.LOOKUP_NAME,
remote);
MyRemoteClient client = new
MyRemoteClient(namingClient);
namingClient.verify();
}
}
![Page 31: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/31.jpg)
Testen verteilter Anwendungen 31
RMI
• Test einer einfachen callTwice()-Methode (1):
public class MyRemoteClientTest extends TestCase {
private MockNaming naming;
public MyRemoteClientTest(String name) {...}
protected void setUp() {
naming = new MockNaming();
}
![Page 32: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/32.jpg)
Testen verteilter Anwendungen 32
RMI
• 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());
![Page 33: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/33.jpg)
Testen verteilter Anwendungen 33
RMI
• 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());
}
![Page 34: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/34.jpg)
Testen verteilter Anwendungen 34
RMI
• Test einer einfachen callTwice()-Methode (4):
private MyRemoteServer createRemoteServer(final
String returnString) {
return new MyRemoteServer() {
public String callService() {
return returnString;
}
};
}
}
![Page 35: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/35.jpg)
Testen verteilter Anwendungen 35
RMI
• 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) {}
}
![Page 36: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/36.jpg)
Testen verteilter Anwendungen 36
RMI
• 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();
}
![Page 37: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/37.jpg)
Testen verteilter Anwendungen 37
RMI
• 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
![Page 38: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/38.jpg)
Testen verteilter Anwendungen 38
CORBA
• Kurzer Überblick:
– CORBA = „Common Objekt Request Broker Architecture“
– offener Standard der Open Management Group (OMG)
– erlaubt beliebige Implementierungssprache
![Page 39: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/39.jpg)
Testen verteilter Anwendungen 39
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)
![Page 40: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/40.jpg)
Testen verteilter Anwendungen 40
CORBA
![Page 41: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/41.jpg)
Testen verteilter Anwendungen 41
RMI vs. CORBA
• RMI– Einsatz in reinen Java-
Umgebungen
– Plattform-unabhängigkeit durch Java
– leicht einzusetzen
• CORBA– Einsatz in heterogenen
Umgebungen
– Plattform-unabhängigkeit durch Sprachen-unabhängigkeit
– komplizierter, aber flexibler
![Page 42: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/42.jpg)
Testen verteilter Anwendungen 42
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
![Page 43: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/43.jpg)
Testen verteilter Anwendungen 43
EJB
EJB 1
EJB 3
EJB 2
EJB 4
EJB 5
Client
Container 1 Container 2
EJB Server
![Page 44: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/44.jpg)
Testen verteilter Anwendungen 44
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
![Page 45: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/45.jpg)
Testen verteilter Anwendungen 45
EJB
![Page 46: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/46.jpg)
Testen verteilter Anwendungen 46
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
![Page 47: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/47.jpg)
Testen verteilter Anwendungen 47
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)
![Page 48: -Testen verteilter Anwendungen · Testen verteilter Anwendungen 11 RMI • Ablauf: – Client ruft Methode eines entfernten Objekts auf – Argumente werden von einem Stub (Client-Vertreter)](https://reader030.fdocuments.us/reader030/viewer/2022040700/5d5249d188c9937f3c8b67a5/html5/thumbnails/48.jpg)
Testen verteilter Anwendungen 48
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