Title: Vortrag zur Diplomarbeit
1Vortrag zur Diplomarbeit
- Automatische Generierung von Testskript-Kommandos
durch Capturing von Nutzereingaben - Andreas Hirth
2Übersicht
- Motivation, Intention
- Realisierung
- Fazit
- Demonstration
3ATOSbisheriger 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
4ATOSeinige 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
5ATOSKommandoerzeugung (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
6Neue 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
7Vorteile
- 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
8Übersicht
- Motivation, Intention
- Realisierung
- technische Grundlagen
- Capturing
- Integration
- Fazit
- Demonstration
9Windows-Nachrichten
- Windows-Nachrichten als Basiskonzept für
- Kommunikation mit und zwischen Fenstern (Dialoge,
Controls, ) - Synchronisation
- System-Queue ? FIFO
- Übermittlung von Eingaben (Maus/Tastatur)
- Timer
10Was sind Hooks?
- Hooks erlauben es einer Applikation, eine eigene
Subroutine in die systemweite Nachrichtenverarbeit
ung einzuschalten - Möglichkeiten
- Nachrichten "mitschneiden"
- Nachrichten modifizieren oder blockieren
- Systemweite vs. Thread-spezifische Hooks
11Typen von Hooks
- 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
12Was 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
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
14Bestimmen 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
15Bestimmen 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))
16Übersicht
- Motivation, Intention
- Realisierung
- technische Grundlagen
- Capturing
- Integration
- Fazit
- Demonstration
17Capturing (Übersicht)
Nachrichten
Hook
Code-Segment
installiert steuert
Nachrichten
Daten-Segment
Daten-Segment
Shared Data
sendetInformationen
Testobjekt
ATOS
Abfragen
Antworten
18Capturing
Übersicht
- 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
19Capturing (Beispiel 1)
- Beispiel Übermittlung der Information zum
Ereignis "linke Maustaste gedrückt" - define WM_CAPTURE_LMOUSEDOWN USER100
- ...
- SendMessage(
- hWnd, // Dialog des Capturing-Moduls
- WM_CAPTURE_LMOUSEDOWN,
- wParam, // LOWORD x-Koordinate
- // HIWORD y-Koordinate
- lParam // Handle des Zielfensters
- )
20Capturing (Beispiel 2)
- Beispiel Übermittlung der Information zum
Ereignis "Tastatureingabe" - define WM_CAPTURE_KEY USER102
- ...
- SendMessage(
- hWnd, // Dialog des Capturing-Moduls
- WM_CAPTURE_KEY,
- wParam, // LOWORD 0
- // HIWORD virtueller Tastenkode
- lParam // Handle des Fensters mit dem
- // Fokus
- )
21Interpretation der Eingaben (Mausklick)
Übersicht
- 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)
22Interpretation der Eingaben (Tastatur)
Übersicht
- 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
23Capturing 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
24Capturing 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
25Übersicht
- Motivation, Intention
- Realisierung
- technische Grundlagen
- Capturing
- Integration
- Fazit
- Demonstration
26Ziele 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
27Integration 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
28Modellierung 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
29Klasse 'CapturingProcessor'
CapturingProcessor
- struct TEMPORARYDATA UINT uiVal HWND
hWnd HMENU hMenu RECT area
mTempData - unsigned short munInternalState - bo
ol mbHookRunning - HWND mhRunningAppWnd - DWORD
mdwRunningAppPId - HWND mhCallingDlgWnd - UINT
muiGeneratedCmdsCnt
- LineList mCommandList - LineList
mPostCommands - LineList mPreCommands - unsign
ed short munWorkingMode - unsigned short
munLastCmdCreationMode - LRESULT
(mfnStartTestSelDlg)(HWND, Line ) - LineList
mControlTypeSynonyms
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() - UI
NT 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 CreateCmdLISTBOXMULTI
SEL(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)
30Trennung von GUI und Logik
Hook
installiert, steuert
ATOS
GUI
Logik
Testsequenz
sendetNachrichten
übermittelt Daten steuert
startet
Capturing Dialog
31Besonderheiten 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
32Neues 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
33Übersicht
- Motivation, Intention
- Realisierung
- Fazit
- Demonstration
34Fazit 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
35Übersicht
- Motivation, Intention
- Realisierung
- Fazit
- Demonstration
- Rechner
- Editor
36Diskussion
- Vielen Dank für Ihre Aufmerksamkeit!