Lotus Notes / Domino Sonstiges > Help-Desk Applikation !!Help!!
Help Application demo at Lotusphere
eknori (retired):
--- Zitat ---Ich tendiere dazu, es besser zu finden, dass im Webservice Producer die Funtktion CreateTickets mit CreateTickets(TicketDetails ticketDetails) implementiert würde und nicht CreateTicket(String userName, String Problem).
--- Ende Zitat ---
Hat was ... Aber wie gesagt; ich lasse das erst einmal so, damit du testen kannst. Außerdem warte ich das Feedback von RIM ab.
Das CloseTicket funktioniert soweit; es wird geprüft, ob
- das Ticket nicht schon geschlossen wurde ( retcode 5)
- das Ticket noch offene ToDos hat. ( retcode 4 )
flaite:
Das dauert doch länger als ich dachte. Denke aber das ich irgendwann heute nacht sämtliche tests für den business layer grün sind:
Ich bringe für die Ansichten die Daten in verschiedene Strukturen. Das ist jetzt erstmal fertig.
Kommt noch reasign create und so ein Zeug. Das dürfte einfacher sein, weil das nur jeweils 1 Ticket betrifft und ich die nicht extra neu gruppieren muß.
status = null ist erstmal nicht so wichtig. Die haben sowieso den statusCode (wird nicht angezeigt) und der status kann immer dynamisch gezogen werden, ohne dass dies die Performance merklich belastet.
-> bezeichnet jeweils ein neues TicketPartial (dasselbe wie Ticket bei dir, nicht zu verwechseln mit TicketFull (bei dir TicketDetails).
1. Tickets gesucht nach key user "Heinz Ulrich Krause", geordnet Nach Status.
Dies Datenstruktur kann dann in einem JTree (so ähnlich wie outline) genutzt werden, um die Tickets nach den Stati zu gruppieren:
printing out value from method:testGetUserTicketsOrderedByStatus()
offen
->
[TicketPartial:
name: COMM-6JXH7Z
status: null
user: Heinz Ulrich Krause
problem: Take a look at the refresh function , please
does not work !
mit freundlichen Grüssen
Heinz Ulrich Krause
Am Zaunbusch 8
40822 Mettmann
Mobil: 0174 9898464
SKYPE: eknori
WEB: http://www.eknori.de
newItem: true]
geschlossen
->
[TicketPartial:
name: COMM-6K7LXD
status: null
user: Heinz Ulrich Krause
problem: Test neuzuweisung. Maybe there is a wrong language key !!
newItem: true]
->
[TicketPartial:
name: COMM-6JXHE9
status: null
user: Heinz Ulrich Krause
problem: This ticket is created using the "Quick Call" form
newItem: true]
->
[TicketPartial:
name: HUKE-6JXH8N
status: null
user: Heinz Ulrich Krause
problem: SAP down because AS/400 needs IPL
newItem: true]
->
[TicketPartial:
name: COMM-6K7LLS
status: null
user: Heinz Ulrich Krause
problem: There is no problem in the new release
newItem: true]
----------------------------------------------------------------------------------------------------------------
2. Tickets gesucht nach key suporter "Heinz Ulrich Krause", geordnet Nach Status.
printing out value from method:testGetSuporterTicketsOrderedByStatus()
neu
->
[TicketPartial:
name: COMM-6KMPHS
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHT
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHU
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KKMS4
status: null
user: Hein Bloed
problem: Baldy man
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHV
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHW
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHR
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHX
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHY
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPK2
status: null
user: Heinz Urich Krause
problem: HAPPY NEW Year ... what a crap ...
newItem: true]
offen
->
[TicketPartial:
name: HUKE-6KDMGE
status: null
user: Witte Administrator
problem: Ticket manually created
newItem: true]
->
[TicketPartial:
name: COMM-6KKTVW
status: null
user: Stefan1971
problem: Noch ein Ticket, weil's so schön ist!
newItem: true]
->
[TicketPartial:
name: COMM-6KKMQZ
status: null
user: Hein Bloed
problem: I'm loosing my hair
newItem: true]
->
[TicketPartial:
name: COMM-6KKQJY
status: null
user: Bruce Elgort
problem: NO, I wasn't here
newItem: true]
->
[TicketPartial:
name: COMM-6KKTML
status: null
user: Arnold Schwarzenegger
problem: I would like to have a bratwurscht with a bretzel and sauerkraut.
newItem: true]
->
[TicketPartial:
name: COMM-6KKTKX
status: null
user: PowerLuser
problem: Any key cannot be found.
newItem: true]
->
[TicketPartial:
name: COMM-6JXH7Z
status: null
user: Heinz Ulrich Krause
problem: Take a look at the refresh function , please
does not work !
mit freundlichen Grüssen
Heinz Ulrich Krause
Am Zaunbusch 8
40822 Mettmann
Mobil: 0174 9898464
SKYPE: eknori
WEB: http://www.eknori.de
newItem: true]
geschlossen
->
[TicketPartial:
name: HUKE-6JXH8N
status: null
user: Heinz Ulrich Krause
problem: SAP down because AS/400 needs IPL
newItem: true]
->
[TicketPartial:
name: COMM-6K7LXD
status: null
user: Heinz Ulrich Krause
problem: Test neuzuweisung. Maybe there is a wrong language key !!
newItem: true]
->
[TicketPartial:
name: COMM-6K7LLS
status: null
user: Heinz Ulrich Krause
problem: There is no problem in the new release
newItem: true]
->
[TicketPartial:
name: COMM-6JXHE9
status: null
user: Heinz Ulrich Krause
problem: This ticket is created using the "Quick Call" form
newItem: true]
--------------------------------------------------------------------------------------------------------------------
printing out value from method:testGetSuporterTicketsOrderedByUser()
tickets gesucht nach suporter Heinz Ulrich Krause, gruppiert nach User.
Arnold Schwarzenegger
->
[TicketPartial:
name: COMM-6KKTML
status: null
user: Arnold Schwarzenegger
problem: I would like to have a bratwurscht with a bretzel and sauerkraut.
newItem: true]
Bruce Elgort
->
[TicketPartial:
name: COMM-6KKQJY
status: null
user: Bruce Elgort
problem: NO, I wasn't here
newItem: true]
Hein Bloed
->
[TicketPartial:
name: COMM-6KMPHR
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KKMS4
status: null
user: Hein Bloed
problem: Baldy man
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHW
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHS
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHX
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHY
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHU
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KKMQZ
status: null
user: Hein Bloed
problem: I'm loosing my hair
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHV
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
->
[TicketPartial:
name: COMM-6KMPHT
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
Heinz Ulrich Krause
->
[TicketPartial:
name: COMM-6JXH7Z
status: null
user: Heinz Ulrich Krause
problem: Take a look at the refresh function , please
does not work !
mit freundlichen Grüssen
Heinz Ulrich Krause
Am Zaunbusch 8
40822 Mettmann
Mobil: 0174 9898464
SKYPE: eknori
WEB: http://www.eknori.de
newItem: true]
->
[TicketPartial:
name: HUKE-6JXH8N
status: null
user: Heinz Ulrich Krause
problem: SAP down because AS/400 needs IPL
newItem: true]
->
[TicketPartial:
name: COMM-6K7LXD
status: null
user: Heinz Ulrich Krause
problem: Test neuzuweisung. Maybe there is a wrong language key !!
newItem: true]
->
[TicketPartial:
name: COMM-6K7LLS
status: null
user: Heinz Ulrich Krause
problem: There is no problem in the new release
newItem: true]
->
[TicketPartial:
name: COMM-6JXHE9
status: null
user: Heinz Ulrich Krause
problem: This ticket is created using the "Quick Call" form
newItem: true]
Heinz Urich Krause
->
[TicketPartial:
name: COMM-6KMPK2
status: null
user: Heinz Urich Krause
problem: HAPPY NEW Year ... what a crap ...
newItem: true]
PowerLuser
->
[TicketPartial:
name: COMM-6KKTKX
status: null
user: PowerLuser
problem: Any key cannot be found.
newItem: true]
Stefan1971
->
[TicketPartial:
name: COMM-6KKTVW
status: null
user: Stefan1971
problem: Noch ein Ticket, weil's so schön ist!
newItem: true]
Witte Administrator
->
[TicketPartial:
name: HUKE-6KDMGE
status: null
user: Witte Administrator
problem: Ticket manually created
newItem: true]
flaite:
Die Funktion getTicketDetails ist nicht implementiert ???
Hier kommt nix an. In deinem zuletzt geposteten Source code scheint es so zu sein.
--- Code: ---%REM
#####################################################
Public Function GetTicketDetails ( TicketNumber as String ) As TicketDetails
#####################################################
%END REM
Public Function GetTicketDetails ( TicketNumber as String ) As TicketDetails
On Error Goto ERRHANDLE
EXITPOINT:
exit function <-<<
--- Ende Code ---
flaite:
create Ticket hat Test grün.
von mir ist ein Ticket drin:
--- Code: ---[TicketPartial:
id: COMM-6KMUUW
statusCode: 0
user: Axel Janssen
problem: p1136155428718
newItem: true]
--- Ende Code ---
Das ist auch der einzige Junit-Test, der einigermassen vernünftig ist. Vielleicht interessiert es jemanden:
--- Code: --- /*
* Test method for
* 'de.atnotes.help.wsclient.domain.BasicTicketsRepository.createTicket(String,
* String)'
*/
public void testCreateTicket() {
String user = "Axel Janssen";
String problem = "p" + System.currentTimeMillis();
TicketFull ticketFull = TicketFull.getInstanceUsingUserData(null, -1,
user, problem, null);
int ret = -1;
try {
ret = ticketsRep.createTicket(ticketFull);
} catch (EnvironmentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertEquals(0, ret);
// try to retrieve newly created ticket from remote database. Must have
// statusCode =0
Map<Integer, Set<TicketPartial>> mTicketsUserOrderedByStatus = null;
try {
mTicketsUserOrderedByStatus = ticketsRep
.getUserTicketsOrderedByStatus(user, true);
} catch (EnvironmentException e) {
e.printStackTrace();
}
Set<TicketPartial> set = mTicketsUserOrderedByStatus.get(0);
Iterator<TicketPartial> it = set.iterator();
TicketPartial ticketPartial = null;
boolean wasFound = false;
while (it.hasNext()) {
ticketPartial = it.next();
if (ticketPartial.getProblem().equals(problem)) {
wasFound = true;
System.out.println(ticketPartial);
break; // while
}
}
assertTrue(wasFound);
}
--- Ende Code ---
Erst erzeugt er ein Ticket und dann guckt der Test selbst nach, obs da ist. Wegen der currentTimeMilis() im problem ist es sehr wahrscheinlich, dass es sich um kein Duplikat handelt.
Das Tolle an junit-Tests ist, dass sie einfach da sind. D.h.: Wenn ich was verändere, kann ich jederzeit mit der quasi völlig automatisch startenden Batterie der Junit-Tests überprüfen, ob der neue Code vielleicht nicht zu einem Fehler geführt hat. Ausserdem hat man immer einen schicken
grünen -> alles ok
roten -> eine der assert-Funktionen meldet Fehler
oder tiefroten -> Exception geworfen.
Balken
flaite:
Aus Design-Gesichtspunkten halte ich die von den Funktionen
Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
Public Function CloseTicket ( strTicket As String ) As Integer
retunierten Integer für keine gute Idee.
Warum nicht einfach einen String runtergeben, der den Fehler ein bischen beschreibt. Davon läuft der Speicher vom Blackberry auch nicht voll.
UND VOR ALLEM: Bei CreateTicket wird ein Teil des Tickets auf dem Client (user, problem), ein anderer Teil aber auf dem Server erzeugt: WICHTIG IST V.A. id (oder) TicketNumber (und die ist alphanumerisch). Ich seh das quasi als zwingend an, dass CreateTicket diese ID zurückgibt. Die restlichen Werte sind eh beim Erzeugen mehr so Konstanten also egal.
Das ist auch ein RDBMS-Proggen Prinzip: bei SQL Create am besten immer den Primärschlüssel zurückgeben (der wird ja oft wie bei dir von der DB automatisch erzeugt).
Dieser Beitrag war so ziemlich das drängenste Problem, was ich zur Zeit sehe.
Auch für die anderen Funktionen wären Text Fehlermeldungen find ich besser. Ich mapp die Nummern sowieso direkt auf String und ich glaub wie gesagt nicht, dass dies sich auf den Speicher von BlackBerry merklich auswirkt.
(
--- Code: ---if (ret == 1) {
throw new EnvironmentException(AppUtils.getValue("exception.general.mandatoryParameterNotSet") +
"ticketFull.user=" + ticketFull.getUser() + "ticketFull.problem=" + ticketFull.getProblem());
}
if (ret == 2) {
throw new EnvironmentException(AppUtils.getValue("exception.environmentException.WebserviceErrorCode"));
}
--- Ende Code ---
)
Wenn ich ins Bett gehe, habe ich erstmal genug getestet. Meinetwegen kann die DB für ein paar Stunden vom Netz gehen, verändert werden, etc. Aber bitte hier ankündigen. Ich kann mir ohne große Schwierigkeiten MockObjekte erzeugen (von Hand. leider kann ichs nicht anders obwohls dafür tools gibt), die die entfernten Objekte simmulieren. Ist eh einfacher.
Versuch aber noch assignTicket und closeTicket zu implementieren.
In den JunitTests fehlen noch ein paar Tests auf Exceptions. Mach ich später noch.
Gruß Axel
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln