Journey from subjective to objective: Capturing user experience
Vortrag zur Diplomarbeit Automatische Generierung von Testskript- Kommandos durch Capturing von...
-
Upload
margarete-schlesinger -
Category
Documents
-
view
110 -
download
2
Transcript of Vortrag zur Diplomarbeit Automatische Generierung von Testskript- Kommandos durch Capturing von...
Vortrag zur Diplomarbeit
Automatische Generierung von Testskript-Kommandos durch Capturing
von Nutzereingaben
Andreas Hirth
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
2
Übersicht
Motivation, Intention
Realisierung
Fazit
Demonstration
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
3
ATOSbisheriger Funktionsumfang
Simulation von Nutzereingaben in Testobjekte
Auslesen des Status von Elementen eines Testobjekts und Vergleich mit erwarteten Werten
Unterstützung einer Skriptsprache zur Definition von Kommandos
Speichern von Kommandoabläufen in Testskripts
Zusammenfassen von Testskripts in Testpakten
Unterstützung bei der Erstellung von Testskripts mittels intelligentem Editor
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
4
ATOSeinige Einschränkungen
Quelltext des Testobjekts muss vorliegen Notwendige Informationen werden zum großen
Teil mit Softwareunterstützung aus den Fremdquellen ausgelesen – müssen per Hand nachbearbeitet, teilweise vollständig
manuell eingegeben werden– Unterstützung abhängig von
verwendeter Entwicklungsumgebung
Eigenschaften dynamisch erzeugter Fensterelemente müssen immer manuell eingegeben werden
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
5
ATOSKommandoerzeugung (bisher)
Schrittweiser Aufbau der Kommandostruktur
dabei Sicherstellung der Validität erzeugter Kommandos– Invalide Kommandos können nicht erstellt werden– direkte manuelle Eingabe ist nicht vorgesehen
die meisten Kommandos bestehen aus 5 oder mehr Komponenten
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
6
Neue Idee
Automatische Kommandoerzeugung – Aktionen
• der Testskriptdesigner bedient das Testobjekt auf übliche Art und Weise
• ATOS schneidet alle Eingaben mit (Capturing) und generiert daraus automatisch die entsprechenden Testskript-Kommandos (HTS)
– Tests• in einem zweiten Modus klickt der Testskriptdesigner im
laufenden Testobjekt ein Fensterelement an• ATOS generiert (nach Auswahl) automatisch Testskript-
Kommandos, die den Status des Fensterelements mit den aktuellen Werten vergleichen
• die Nutzeraktionen werden hierbei abgefangen, das Testobjekt erhält also keine Eingaben
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
7
Vorteile
enormer Performance-Gewinn bei der Testskript-Erstellung
automatisch generierte Kommandos sind syntaktisch und semantisch korrekt
der zu programmierende Testfall wird bei der Erstellung direkt durchgeführt– Vermeidung von logischen Design-Fehlern
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
8
Übersicht
Motivation, Intention
Realisierung– technische Grundlagen– Capturing– Integration
Fazit
Demonstration
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
9
Windows-Nachrichten
Windows-Nachrichten als Basiskonzept für– Kommunikation mit und zwischen Fenstern (Dialoge,
Controls, …)– Synchronisation
• System-Queue FIFO– Übermittlung von Eingaben (Maus/Tastatur)– Timer
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
10
Was sind Hooks?
Hooks erlauben es einer Applikation, eine eigene Subroutine in die systemweite Nachrichtenverarbeitung einzuschalten
Möglichkeiten:– Nachrichten "mitschneiden"– Nachrichten modifizieren oder blockieren
Systemweite vs. Thread-spezifische Hooks
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
11
WH_CALLWNDPROC Hook WH_CALLWNDPROCRET Hook WH_CBT Hook WH_DEBUG Hook WH_FOREGROUNDIDLE Hook WH_GETMESSAGE Hook WH_JOURNALPLAYBACK Hook WH_JOURNALRECORD Hook WH_KEYBOARD_LL Hook WH_KEYBOARD Hook WH_MOUSE_LL Hook WH_MOUSE Hook WH_MSGFILTER and WH_SYSMSGFILTER Hooks WH_SHELL Hook
Typen von Hooks
The WH_CALLWNDPROC hook enables you to monitor messages sent to window procedures. The system calls a WH_CALLWNDPROC hook procedure before passing the message to the receiving window procedure
The WH_CALLWNDPROC hook enables you to monitor messages sent to window procedures. The system calls a WH_CALLWNDPROC hook procedure before passing the message to the receiving window procedure
The WH_KEYBOARD hook enables an application to monitor message traffic for WM_KEYDOWN and WM_KEYUP messages about to be returned by the GetMessage or PeekMessage function.
The WH_KEYBOARD hook enables an application to monitor message traffic for WM_KEYDOWN and WM_KEYUP messages about to be returned by the GetMessage or PeekMessage function.
The WH_MOUSE hook enables you to monitor mouse messages about to be returned by the GetMessage or PeekMessage function.
The WH_MOUSE hook enables you to monitor mouse messages about to be returned by the GetMessage or PeekMessage function.
The WH_GETMESSAGE hook enables an application to monitor messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_GETMESSAGE hook to monitor mouse and keyboard input and other messages posted to the message queue.
The WH_GETMESSAGE hook enables an application to monitor messages about to be returned by the GetMessage or PeekMessage function. You can use the WH_GETMESSAGE hook to monitor mouse and keyboard input and other messages posted to the message queue.
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
12
Was können Hooks nicht?
Idee:– Nachrichten verarbeiten wie in der Nachrichten-Schleife
der Fensterfunktion WndProc()– Nutzen der von Controls gesendeten Notifications
• z.B: BN_CLICKED, EN_CHANGE Control-bezogene Aktionen
Aber:– ob Controls wirkliche die benötigten Notifications senden,
ist programmabhängig– Client-Client-Nachrichten laufen nicht über die
systemweite Nachrichtenverwaltung kein Zugriff über Hooks
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
13
"Mitschneiden" von Eingaben
Abfangen von reinen Eingabe-Ereignissen (Maus, Tastatur) für das Testobjekt
Mausklick:– Bestimmen des Ziel-Fensters des Mausklicks aus den
Koordinaten– Interpretation abhängig vom Typ des Fensters
Tastendruck:– Ermittlung des aktiven Fensters– Interpretation abhängig vom Typ des Fensters
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
14
Bestimmen des Controltyps (1)
Ermitteln des Klassennamens des Fensters (GetClassName(…))– Edit– Static– Button
Problem 1:– Programme können Controls in ihrer Funktionalität
erweitern, ohne das Basisverhalten einzuschränken normal steuerbar über HTS-Kommandos Aber: abweichender Klassenname Lösung: nutzereditierbare Liste mit Synonymen für
Klassennamen
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
15
Bestimmen des Controltyps (2)
Problem 2:– Controls desselben Typs können unterschiedliche
Eigenschaften haben (und unterschiedliche Behandlung erfordern)
Klasse "Button" realisiert eine Reihe unterschiedlichster Controls
• Pushbutton• Radiobutton• Checkbox• Groupbox
Identifizierung über gesetzte Stylebits möglich (GetWindowLong(…, GWL_STYLE))
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
16
Übersicht
Motivation, Intention
Realisierung– technische Grundlagen– Capturing– Integration
Fazit
Demonstration
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
17
Capturing (Übersicht)
HookHook
Daten-Segmen
t
Daten-Segmen
t
Daten-Segmen
t
Daten-Segmen
t
TestobjektTestobjekt ATOSATOS
Shared Data
Shared Data
installiert steuert
sendetInformationen
Nachrichten
AbfragenAntworten
Code-SegmentCode-Segment
Nachrichten
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
18
Capturing
ATOS installiert Hooks für den Thread des Testobjekts– WH_MOUSE Mausklicks– WH_KEYBOARD Tastatureingaben– WH_CALLWNDPROC Menüaufrufe
jede Nachricht, die einen der installierten Hooks betrifft, durchläuft zunächst die zugehörige Hook-Funktion (im Kontext des Testobjekts)– Analyse der Nachricht– ggf. Informationsübermittlung an ATOS mittels
nutzerdefinierter Nachricht– ggf. Stoppen der Übermittlung Testobjekt erhält die
Nachricht nicht
ÜbersichtÜbersicht
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
19
Capturing (Beispiel 1)
Beispiel Übermittlung der Information zum Ereignis "linke Maustaste gedrückt"
#define WM_CAPTURE_LMOUSEDOWN USER+100...SendMessage(hWnd, // Dialog des Capturing-ModulsWM_CAPTURE_LMOUSEDOWN,wParam, // LOWORD: x-Koordinate
// HIWORD: y-KoordinatelParam // Handle des Zielfensters
);
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
20
Capturing (Beispiel 2)
Beispiel Übermittlung der Information zum Ereignis "Tastatureingabe"
#define WM_CAPTURE_KEY USER+102...SendMessage(hWnd, // Dialog des Capturing-ModulsWM_CAPTURE_KEY,wParam, // LOWORD: 0
// HIWORD: virtueller TastenkodelParam // Handle des Fensters mit dem
// Fokus);
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
21
Interpretation der Eingaben (Mausklick)
Mausklick (links)– Prüfen, ob Drücken der Maustaste und Loslassen auf demselben
Control stattfanden– Ermitteln des Control-Typs– Prüfen des Control-Status (aktiviert)– Generieren eines Kommandos in Abhängigkeit vom Control-Typ
• Button Klick• Radiobutton Auswahl• Checkbox Setzen/Löschen• Listbox Auswahl (ggf. Mehrfachauswahl mehrere
Kommandos)• Combobox Auswahl oder Wert• Tab Auswahl• Editbox, Static -
– bei bestimmten Controls überflüssige Zwischenkommandos vermeiden (z.B. Editbox, Listbox, Combobox)
ÜbersichtÜbersicht
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
22
Interpretation der Eingaben (Tastatur)
Tastatureingabe– Prüfen des virtuellen Tastenkodes – Ermitteln des Control-Typs (des aktuell fokusierten
Fensters)– ggf. Generierung eines Kommandos in Abhängigkeit vom
Typ des Controls und der gedrückten Tastez.B:
• Button SPACE Klick• Button ENTER Klick• Checkbox ENTER Tastendruck ENTER• Button 'A' -• Editbox 'A' Wert setzen• Combobox 'A' Auswahl oder Wert setzen
ÜbersichtÜbersicht
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
23
Capturing von Menüaktionen (1. Möglichkeit)
1. Möglichkeit: Auswerten von WM_COMMAND Notification
– das high-order word von wParam gibt Auskunft, ob es sich um eine Menüaktion handelt
– Aber: unzuverlässig– Aber: nachträglich keine Möglichkeit, das Fenster zu
ermitteln, zu dem das Menü gehörte nicht realisiert
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
24
Capturing von Menüaktionen (2. Möglichkeit)
2. Möglichkeit (wurde realisiert): Auswerten der WM_MENUSELECT Notification
– Nachricht wird immer empfangen, wenn der Cursor über einen neuen Menüpunkt kommt oder mittels Tastatur zu einem anderen Menüpunkt gesprungen wird
– zwischen auswählbaren und nicht auswählbaren (inaktive, Trennlinien, Submenüs) Menüpunkten unterscheiden
– aktives Rechteck des Menüpunkts speichern und bei nächstem Klick-Ereignis Treffer prüfen
– Fenster, das das Menü aufgerufen hat ermitteln zum Zeitpunkt der ersten WM_INITMENU Notification
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
25
Übersicht
Motivation, Intention
Realisierung– technische Grundlagen– Capturing– Integration
Fazit
Demonstration
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
26
Ziele für die Integration in das ATOS-Grundsystem
die ATOS-Testsuite soll weiterhin wie bisher nutzbar bleiben
die Erweiterung soll sich möglichst ohne Bruch in das ATOS-System einfügen
die generierten Kommandos müssen gültige HTS-Befehle darstellen– generierte Kommandos sollen nachbearbeitet werden
können
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
27
Integration eines neuen Dialogs
Beschränkung auf notwendige und sinnvolle Steuer- und Informationselemente– selbsterklärende Bedienung– geringer Platzbedarf
Dialog wird im Vordergrund gehalten
optisches Feedback bei Generierung neuer Kommandos– grün neues Kommando erfolgreich erzeugt– gelb letztes Kommando erfolgreich modifiziert– rot Fehler bei der Kommandoerzeugung
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
28
Modellierung der neuen Klasse'CapturingProcessor'
Funktionalität– Hookinstallation, -steuerung– Auswertung der Hook-Nachrichten– Ermittlung weiterer benötigter Informationen aus dem
Testobjekt– Generierung von kommentierten Kommandos– Undo-Funktion
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
29
Klasse 'CapturingProcessor'CapturingProcessor
- struct TEMPORARYDATA {UINT uiVal;HWND hWnd;HMENU hMenu;RECT area;
} mTempData;- unsigned short munInternalState;- bool mbHookRunning;- HWND mhRunningAppWnd;- DWORD mdwRunningAppPId;- HWND mhCallingDlgWnd;- UINT muiGeneratedCmdsCnt;
+ CapturingProcessor(const char* szConfigFilePath);+ virtual ~CapturingProcessor();+ bool Initialize(const char* szAppPath,
LRESULT (*fnStartTestSelDlg)(HWND, Line *), HWND hDlgWnd);+ void Uninitialize();+ HWND GetRunningAppTopMostWnd();+ bool StartCapturing(HWND hWndMsgTarget);+ bool StopCapturing();+ bool SetWorkingMode(unsigned short NewWorkingMode);+ unsigned short GetWorkingMode();+ Line * Undo();+ unsigned short GetLastCmdCreationMode();+ UINT GetGeneratedCmdsCnt();+ LineList * GetCommands(bool bClearCommands);+ void ClearCommands();+ char * GetCtrlInfo(HWND hCtrl);+ Line * CaptureClick(HWND hCtrl, POINT pt);+ Line * CaptureKey(HWND hCtrl, UINT uiKeyCode);+ Line * CaptureMenuCmd(HMENU hMenu, UINT uiMenuItemID);+ Line * CaptureMenuInit(HWND hWnd);- bool ImportTypeSynonymsFile(char *szFilename);- HWND StartApplication(char *szPath);- void PreparePreAndPostCommands();- UINT GetControlType(HWND hWndControl, char *szName);- BOOL IsRunningAppWndValid();- void MaskQuotes(char * szText);- static BOOL CALLBACK EnumWindowsProc(HWND hWnd,
LPARAM lParam);
- Line * CaptureClickACTION(HWND hCtrl, POINT pt);- Line * CaptureKeyACTION(HWND hCtrl, UINT uiKeyCode);- Line * CaptureMenuCmdACTION(HMENU hMenu,
UINT uiMenuItemID);- Line * CaptureMenuInitACTION(HWND hWnd);- Line * CaptureClickTEST(HWND hCtrl, POINT pt);- bool CreateCmdEDITBOX(HWND hCtrl, Line *commentLine,
Line *commandLine);- bool CreateCmdBUTTON(HWND hCtrl, Line *commentLine,
Line *commandLine);- bool CreateCmdTAB(HWND hCtrl, Line *commentLine,
Line *commandLine);- bool CreateCmdLISTBOX(HWND hCtrl, Line *commentLine,
Line *commandLine);- bool CreateCmdLISTBOXMULTISEL(HWND hCtrl,
Line *commentLine, Line *commandLine, UINT uiCmdArraySize);
- bool CreateCmdCOMBOBOX(HWND hCtrl, Line *commentLine, Line *commandLine);
- bool CreateCmdMENU(HWND hWnd, HMENU hMenu, UINT uiMenuItemID, Line *commentLine, Line *commandLine);
- bool CreateCmdKEY(UINT uiKeyCode, Line *commentLine, Line *commandLine);
- bool CreateTestCmd(HWND hCtrl, Line *commentLine, Line *commandLine, UINT uiCmdArraySize, unsigned short unTestMode);
- void AddCommandToList(Line **commentLine, Line **commandLine, UINT uiCmdArraySize);
- unsigned short GetKeyHandlingForCtrl(UINT uiKeyCode, UINT uiControlType);
- bool IsLastCmdOfCtrl(char *szControl, HWND hCtrl);
- LineList * mCommandList;- LineList * mPostCommands;- LineList * mPreCommands;- unsigned short munWorkingMode;- unsigned short munLastCmdCreationMode;- LRESULT (*mfnStartTestSelDlg)(HWND, Line *) ;- LineList * mControlTypeSynonyms;
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
30
HookHook
Trennung von GUI und Logik
ATOSATOS
GUIGUILogikLogik
TestsequenzTestsequenz
startet
sendetNachrichten
installiert, steuert
übermittelt Datensteuert
CapturingProcessorCapturingProcessor
ATOSATOS
Capturing DialogCapturing Dialog
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
31
Besonderheiten aus dem Capturing erzeugter HTS-Kommandos
"herkömmliche" HTS-Befehle beinhalten verbale Bezeichner an Stelle der numerischen Identifikatoren von Controls– die Zuordnung wird durch Informationen aus URF-Dateien
hergestellt
beim Capturing werden die numerischen Identifikatoren ermittelt– Rückwärts-Zuordnung über Daten aus URF-Dateien wäre möglich,
würde aber dem Ziel einer Quelltext-Unabhängigkeit entgegenstehen
– projektgebundenes Umschalten zwischen entweder Nutzung der manuellen Testskript-Erstellung oder des Capturings widerspricht Zielstellung
"herkömmliche" und generierte HTS-Befehle sollen innerhalb derselben Testsequenz kombiniert werden können Einführung eines "Schalters" zum Deaktivieren der Substitutionen
beim Übersetzen der Kommandos von HTS nach ATS
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
32
Neues HTS-Kommando NOSUBST
Erweiterte HTS-Syntax– anweisung = aktionsschritt | auswertungsschritt
|interaktion | dateioperation |loopstruktur | kommentar | deakt_kommando | nosubst_kommando
...nosubst_kommando = NOSUBST,anweisung
Kommandos mit dem Präfix NOSUBST werden normal verarbeitet, bis auf folgende Einschränkungen:– an Stelle von Control-Bezeichnern oder Menübäumen werden
die entsprechenden numerischen Identifikatoren der Controls oder Menükommandos erwartet
NOSUBST-Kommandos können im ATOS-Befehls-Editor bearbeitet werden, eine automatische Fehlerkontrolle ist jedoch nicht möglich
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
33
Übersicht
Motivation, Intention
Realisierung
Fazit
Demonstration
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
34
Fazit und Ausblick
Erreichte Ziele– zuverlässiges Capturing der Nutzeraktionen durch
Interpretation von Eingabe-Nachrichten auf niedrigem Level
– schnelle, intuitive Generierung von Aktions- und Testkommandos
– Unterstützung des Testens von Applikationen, für die kein Quellkode vorliegt
– saubere Einbettung in das ATOS Grundsystem– Möglichkeit der kombinierten Verwendung von manueller
Testskript-Erstellung und Capturing
Erweiterungen, Verbesserungen– Verwendung der URF-Daten zur Kommando-Generierung,
wenn vorhanden– ggf. Unterstützung weiterer Controls
• Abhängig auch von Unterstützung durch HTS
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
35
Übersicht
Motivation, Intention
Realisierung
Fazit
Demonstration– Rechner– Editor
Andreas Hirth, Automatische Generierung von Testskript-Kommandos durch Capturing von Nutzereingaben
36
Diskussion
Vielen Dank für Ihre Aufmerksamkeit!