Zum Inhalt springen
Testautomatisierung.org – Magazin für funktionale und nicht funktionale Qualitätssicherung

Zurück zu den Artikeln

Waldemar Siebert

41 Beiträge von dieser Autorin oder diesem Autor

Allgemeines

Barrierefreiheit im Softwaretest: Was das BFSG für Testteams bedeutet


Barrierefreiheit gilt in vielen Projekten als Thema für später, bis ein Gesetz wie das Barrierefreiheitsstärkungsgesetz (BFSG) sie zur Pflicht macht. In einem Projekt der öffentlichen Verwaltung ist die Umsetzung der gesetzlichen Vorgaben zur Barrierefreiheit nicht optional. Unser Kollege Armin, der dort das Testmanagement verantwortet, hat aus erster Hand erlebt, wie Barrierefreiheit von einer Randnotiz zu einer strategischen Aufgabe wird, und was Testteams daraus mitnehmen können.

Barrierefreiheit gerät oft ins Hintertreffen

Die Erfahrung aus dem Projekt ist eindeutig: Barrierefreiheit steht häufig hinter anderen fachlichen und technischen Prioritäten zurück und wird erst spät in den Entwicklungsprozess integriert. Dieses Muster ist branchentypisch. Genau hier setzt eine zentrale Erkenntnis an: Barrierefreiheit lässt sich deutlich einfacher umsetzen, wenn sie bereits bei der Konzeption einer Anwendung mitgedacht wird.

Shift Left: warum früh günstiger ist als spät

Nachträgliche Anpassungen bestehender Systeme kosten erheblichen Aufwand. Benutzeroberflächen, Navigationskonzepte und Interaktionen müssen oft grundlegend überarbeitet werden. Im beschriebenen Projekt bietet ein bevorstehendes Redesign die Chance, Barrierefreiheit direkt in die Neuentwicklung einzubauen statt sie später aufwendig nachzurüsten. Das deckt sich mit einer der zentralen Empfehlungen aus dem Projekt: Barrierefreiheit von Anfang an berücksichtigen, also Shift Left. Wenn Architektur, Navigation und Komponenten von Beginn an barrierefrei entstehen, wird Accessibility Teil der Definition of Done und bleibt kein nachträglicher Prüfpunkt.

Der Zielkonflikt: wie viel Barrierefreiheit ist genug?

Ohne Spannungsfeld geht es trotzdem nicht. Nutzergruppen haben unterschiedliche Anforderungen: Manche bedienen eine Anwendung ausschließlich mit der Maus, andere sind vollständig auf Tastatursteuerung oder assistive Technologien angewiesen. Jede zusätzliche Funktion zur Unterstützung einzelner Nutzergruppen erhöht den Pflegeaufwand der Anwendung. Es braucht bewusste Priorisierung statt eines pauschalen "so viel wie möglich".

Risikobasiert testen, auch bei Accessibility

Wie beim funktionalen Testen ist es kaum möglich, sämtliche Nutzungsszenarien vollständig abzudecken. Auch bei Barrierefreiheit hilft ein risikobasierter Ansatz: zuerst die kritischsten Bedienabläufe und Anforderungen validieren, dann den Umfang erweitern. Konkret bedeutet das:

  • kritische User Journeys zuerst testen
  • häufig genutzte Funktionen priorisieren
  • den Testumfang schrittweise ausbauen

Akzeptanz entsteht durch Verständnis

Nachträgliche Anpassungen empfinden Teams oft als zusätzlichen Aufwand, die Motivation fällt dann gering aus. In neuen Projekten, in denen Barrierefreiheit von Anfang an Teil der Architektur ist, gelingt die Umsetzung leichter. Ein wirksames Mittel für mehr Verständnis: Entwickler und Tester erleben die Perspektive der späteren Nutzer selbst. Eine einfache Übung lautet "Versuch die Seite einmal ohne Maus zu bedienen." Solche praktischen Erfahrungen, etwa die Bedienung per Tastatur oder mit assistiven Technologien, schaffen ein Bewusstsein dafür, dass Barrierefreiheit zur Softwarequalität gehört und keine reine Pflichtübung ist.

Accessibility kontinuierlich testen statt einmalig vor dem Release

Eine der wichtigsten Empfehlungen aus dem Projekt: Accessibility darf kein einmaliger Check kurz vor dem Release sein. Sinnvoll ist ein kontinuierlicher Ansatz mit drei Bausteinen:

  1. automatisierte Prüfungen in der CI
  2. manuelle Accessibility Reviews
  3. regelmäßige Regressionstests

Fazit

Das BFSG macht Barrierefreiheit für viele Projekte zur Pflicht. Die größere Chance liegt darin, sie als festen Bestandteil von Architektur, Testen und Teamkultur zu verstehen statt als lästige Auflage. Wer früh beginnt, risikobasiert priorisiert und Accessibility kontinuierlich prüft, vermeidet teure Nachbesserungen und liefert am Ende ein Produkt, das für alle Nutzergruppen funktioniert.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Unit Tests

Vergleich Assertion Bibliotheken in Java


Wer Tests schreibt, sollte zwangsläufig auch Assertions verwenden. Bevor man Assertions verwenden kann, sollte man aber natürlich eine geeignete Assertionsbibliothek auswählen. Dieser Artikel vergleicht fünf der populärsten Bibliotheken: JUnit Assert, TestNG Assert, AssertJ, Hamcrest und Truth.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/2 Kommentare/von Waldemar Siebert

Testreporting

Allure Listener für Screenshots und weitere Anhänge verwenden


Allure Reporting ist eines der beliebtesten Open Source Produkte im Testbereich. Aus gutem Grund! Die Reports aggregieren die benötigten Daten sehr übersichtlich. Die Anbindung an die meisten Testframeworks wie Cucumber, TestNG, Selenide und andere funktioniert in der Regel reibungslos.

Spannend wird es bei Allure nur, wenn es um spezielle Anforderungen geht. Es können Postprocessing Aggregationen von unterschiedlichen Runs sein, aber auch das Anhängen von Dateien (Log Files oder Screenshots...) im Test-Lebenszyklus. Um den letzten Punkt geht es in diesem Artikel.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/2 Kommentare/von Waldemar Siebert

Testinfrastruktur

Container git Fehler "fatal: unsafe repository (/dir is owned by someone else)" beheben


Tester führen Tests gerne in Docker Containern aus, soweit so bekannt.. Auch dass wir alle ganz gerne git verwenden, wundert eigentlich nicht wirklich. Nur kann die Kombination von beiden auch kleinere Probleme bereiten. So sind auch bei uns spontan, von einem Tag auf den anderen sämtliche Testfälle beim Cleanup der Umgebung ausgestiegen mit der Fehlermeldung:

+ git clean -fdx
fatal: unsafe repository ('/usr/share/jenkins/workspace/tests/nightly' is owned by someone else)
To add an exception for this directory, call:

	git config --global --add safe.directory '/usr/share/jenkins/workspace/tests/nightly'

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Appium

Einrichtung von Appium und Android Studio unter Windows


Ihr wollten schon immer eine mobile Anwendung mit Appium automatisieren, wisst aber nicht wie ihr am besten loslegt?

In unserem Appium Tutorial zeigen wir euch die wichtigsten Schritte auf dem Weg zum ersten automatisierten Test mit Appium.

In diesem Beitrag geht es los mit dem Teil 1: Einrichtung von Appium und Android Studio unter Windows.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Testautomatisierung mit Cypress vs. Selenium


Cypress und Selenium sind bekannte Testwerkzeuge, die für die Automatisierung von Webapplikationen eingesetzt werden. Selenium ist ein Open-Source-Automatisierungsframework, das in unterschiedlichen Produktversionen vorhanden ist.  Die Automatisierungslösung Selenium existiert schon seit 2004 und ist ein etabliertes Produkt mit einer großen Nutzerbasis weltweit. Das End-to-End-Tool Cypress hingegen ist seit 2014 ein Newcomer auf dem Markt, welches sich wie Selenium für die Automatisierung von Webapplikationen eignet. Cypress hat in den letzten Jahren durch seine rasche Entwicklung und Erweiterung kontinuierlich an Beliebtheit gewonnen. Doch welches Werkzeug ist besser?  

In diesem Artikel gehen wir auf die Eigenschaften und Spezifikationen beider Testtools, sowie deren Vor- und Nachteile.  

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Testreporting

HTML Test Reports für Selenium Tests mit ExtentReport Framework


Selenium ist als Testautomatisierungstool für Webanwendungen absoluter Standard. Der Standard WebDriver an sich hat keinen integrierten Reporter und das ist auch nicht seine Kernaufgabe. Diese wird vom WebDriver an die Testframeworks (JUnit / NUnit / MSTest / Jasmine usw.) delegiert. Es kann aber trotzdem vorkommen, dass die von den Testframeworks zur Verfügung gestellten Reporter für Auswertung von den Tests nicht ausreichend sind.

Gute Testreports haben allgemein folgende Vorteile:

  • Bieten gute Übersicht über den Testlauf auf verschiedenen Ebenen an: von hoch-granaular als Testmanagement Sicht bis feingranular für die Analyse einzelner Testschritte
  • Als lesbarer strukturierter Text / HTML abgelegt, enthalten fachliche Schritte
  • Enthalten eingebetete Screenshots, was beim Nachvollziehen der Probleme hilft
  • Vereinfachen die Fehlersuche
  • Können archiviert werden
  • Können von Menschen ohne Programmier-Kenntnissen ausgewertet werden

Auf dem Markt existieren viele mehr oder weniger gute Lösungen, die das Reporting für Selenium Tests bereitstellen. Nicht alle erfüllen die davor genannten Anforderungen an gute Testberichte, aber je nach Anwendungsfall und Projekt ist es auch oft gar nicht notwendig.

Bei uns in den Projekten hat sich der Testreporter ExtentReports bewährt. Neben einer kostenpflichtigen Version, gibt es auch eine Community Edition, die für den Einsatz in den meisten Projekten absolut ausreichend ist.

In diesem Beitrag möchte ich aufzeigen, wie ExtentReports in ein .NET Projekt eingebunden und benutzt werden kann.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/1 Kommentar/von Waldemar Siebert

Protractor

Tutorial: E2E Testautomatisierung von Angular Applikationen


Angular Applikationen auf Ebene von Unit Tests und Integrationstests durchzutesten, ist eine relativ bequeme Geschichte. Gerüchten zu Folge wurde Angular bei Google von einem Test Team entwickelt und so ist die Testbarkeit der Applikation sozusagen direkt in der DNA der Architektur integriert.
Aber wie sieht es mit den E2E Tests aus? Wie werden Cross-Browser Tests im Rahmen einer Angular Applikation realisiert? Dieses Tutorial wird diese Punkte beleuchten.

Einrichtung der Umgebung

Als erstes sollten wir uns die Entwicklungsumgebung einrichten, Angular installieren, uns ein neues Angular Projekt erstellen und uns ansehen, welche Möglichkeiten zur Qualitätssicherung Angular von Haus aus mitbringt und wie speziell die E2E UI Testskripte aufgebaut sind.

Entwicklungsumgebung

Am sinnvollsten ist es, den Code der Applikation in einer IDE (Integrated Development Environment) zu öffnen. Eine IDE ist zwar nicht zwingend notwendig, um mit Angular oder automatisierten Tests zu arbeiten, bietet aber einige Vorteile im Vergleich zu einem simplen Editor (wie Notepad++), z.B. integrierte Git Anbindung, Organisation des Codes und der dazugehörigen Pakete, integrierte Autovervollständigung (Intellisense), integrierter Terminal (Batch / Powershell) und vieles mehr.  Solltest du mit Windows, Mac oder Linux arbeiten, eignet sich die Open Source Entwicklungsumgebung Visual Studio Code gut für diese Aufgabe, aber auch mit der kostenlosen Version von Visual Studio Community für Windows oder Mac, macht man nicht viel falsch. Ich verwende für dieses Tutorial Visual Studio Code.

Um Visual Studio Code zu installieren, lade es einfach  von der offiziellen Webseite runter, installiere und starte die Applikation: https://code.visualstudio.com/

Füge anschließend den Ordner "C:\tutorial" im Explorer zu dem Arbeitsbereich hinzu.

Angular Projekt in Visual Studio Code

Schon kannst du den Inhalt von dem Ordner und seine demnächst folgenden Source Dateien einsehen und bearbeiten. Ein weiterer Vorteil ist auch das integrierte Terminal unten, so können wir dort anschließend bequem Pakete installieren oder Tests starten:

Screenshot: integriertes Terminal in Visual Studio Code mit PowerShell-Prompt im Ordner C:\tutorial

  Tipp: Sollte Terminal nicht sichtbar sein, einfach "STRG+ö" drücken bzw über das Menü View>Terminal auswählen.

Installation von Angular auf dem Rechner

Solltest du davor Angular noch nie auf deinem Rechner installiert haben, benötigst du zwei Sachen:

1.Intalliere Nodejs mit dem dazugehörigen NPM (Node Package Manager). Diesen findest du auf der offiziellen Webseite von NodeJS: https://nodejs.org/en/download/ - wichtig bei NodeJS ist natürlich die Installation vom npm package manager und das "Add to Path", damit der npm Befehl aus dem Terminal bzw. der Konsole funktioniert

Node.JS Setup

Nodejs Installation

2.Installiere anschließend über NPM die Angular Client Applikation global auf deinem Rechner. Dazu kannst du nach der NodeJs Installation einfach folgende Anweisung in deiner Console bzw. in dem Visual Studio Code Terminal ausführen:

 npm install -g @angular/cli 

Erstellung des ersten Angular Projektes

Nach der Installation von Angular können wir unser erstes kleines Projekt erstellen. Dazu einfach den "ng new <projekt-name>" aufrufen. Dieses habe ich bei mir project2 genannt.

 ng new project2 

Mit dem Projekt wird ein neuer Ordner mit der kompletten Angular Applikationsstruktur angelegt. Nach der Anlage ist das Angular Projekt sofort lauffähig. In der Ordnerstruktur wird dir vielleicht direkt unter dem Hauptverzeichnis bereits ein Ordner e2e Tests auffallen. Die Testdateien werden bei der Neuanlage eines Angular Projektes immer mit angelegt und enthalten bereits vorkonfigurierte Karma Unit Tests sowie fertig vorkonfigurierte Protractor Tests. Bequemer kann man Testautomatisierung einem Entwickler nicht näher bringen! :-)

Du kannst auch sofort nach der Anlage aus dem Root Verzeichnis den Befehl "ng e2e" bzw "npm run e2e" ausführen.

 ng e2e 

Das Ergebnis sieht bei einem Erstprojekt etwa so aus:

Angular E2E Tests starten

Wie du schon mitbekommen hast, wurde auf dem Rechner die Angular Applikation gebaut, der Chrome Browser gestartet und die Applikation aufgerufen, außerdem wurde ein erster Check auf einen Titel durchgeführt. Der Aufruf ng e2e ist wirklich sehr bequem, da es uns eine Menge Arbeit abnimmt. Würden wir die gleiche Kette "manuell" machen wollen, müssten wir folgende Aktionen unternehmen:

  1. Angular Applikation bauen und starten mit dem Befehl ng serve in einer eigenen Konsole
  2. Start vom Webdriver Manager mit webdriver-manager start in einer eigenen Konsole (evtl. sollte davor noch webdriver-manager update durchgeführt werden)
  3. Start der Testfälle mit dem Befehlt protractor e2e/protractor.conf.js in einer weiteren Konsole

Was die einzelnen Befehle bedeuten und welche weiteren Möglichkeiten existieren, Testfälle auszuführen, schauen wir uns etwas weiter unten an.

Struktur und Aufbau der E2E Tests in Angular

Der erste UI Test war ja schon erfolgreich, obwohl wir dazu auch noch überhaupt nichts beigetragen haben. Aus diesem Grund schauen wir uns jetzt die einzelnen Komponenten der E2E Testfälle an und wie diese in den Testskripten realisiert werden.

Als erstes schauen wir uns die beteiligten Komponenten an. Das Standard Testframework in Angular ist Jasmine. Aus diesem werden die Testfälle über das Testautomation Tool Protractor mit einem Selenium Webdriver im Hintergrund durchgeführt.

Jasmine

Jasmine ist ein sogenanntes Behavior-Driven Development Testing Framework, dass viele hilfreiche Funktionalitäten bereitstellt, die im Rahmen der Testdurchführung auf unterschiedlichen Schichten (Unit Tests / Integrationstestsund auch E2E UI Tests) immer wieder benötigt werden, z.B. zur Verifizierung von Soll / Ist Ergebnissen.

Behavior Driven bedeutet, dass die Test Suiten und Test Cases so spezifiziert werden, dass sie das fachliche Soll-Verhalten der Applikation beschreiben, wodurch es auch für außenstehende einfacher ist, die Testinhalte und Ziele zu verstehen.

Der Aufbau einer typischen Jasmine "Test Suite" sieht eigentlich immer so aus:

describe("A suite", function() {
it("contains spec with an expectation", function() {
expect(true).toBe(true);
});
});

Describe entspricht einer TestSuite und kann in sich mehrere it's enthalten.
Ein it entspricht einem Testfall welches in sich eine Logik enthält, die z.B. prüft ob etwas dem erwarteten Wert entspricht
Die Struktur ist etwas gewöhnungsbedürftig, lässt sich aber nach einer Zeit tatsächlich ganz gut lesen.

Protractor

Protractor ist die offizielle UI Bibliothek für Angular UI Testfälle. Protractor ist eigentlich nichts anderes, als ein Wrapper für den Selenium Webdriver. Im Endeffekt benutzt man also Selenium zur Browserautomatisierung, mit dem Vorteil, die für Angular spezifischen Methoden von Protractor als Wrapperfunktionen nutzen zu können.

E2E Ordnerstruktur

Wenn wir uns den erstellten Ordner ansehen, finden wir darin folgende Dateien

C:\tutorial\project2\e2e\protractor.conf.js
C:\tutorial\project2\e2e\tsconfig.e2e.json
C:\tutorial\project2\e2e\src\app.e2e-spec.ts
C:\tutorial\project2\e2e\src\app.po.ts

Die tsconfig.e2e.json werden wir an dieser Stelle vorerst auslassen, da diese lediglich für die TypeScript Konfiguration zuständig ist (eine kurze Anleitung dazu kommt demnächst). Die anderen Dateien sollten wir uns aber detaillierter anschauen:

Testkonfigurationsdatei protractor.conf.js

Die Datei protractor.conf.js ist der Kern der E2E Automatisierung. Diese ist für die Konfiguration der Protractor Ausführung verantwortlich und definiert u.a. welche Testspezifikationen ausgeführt werden, z.B.:

specs: [
  './src/**/*.e2e-spec.ts'
],

Mit welchen Capabilities (Art des Browsers, Einstellungen des Browsers) z.B.:

capabilities: {
'browserName': 'chrome'
},

welche Jasmine Optionen gelten, welcher Reporter verwendet wird, welche Timeouts die Skripte enthalten und vieles vieles mehr. Eine genaue Auflistung der unterschiedlichen Möglichkeiten findest du unter: https://github.com/angular/protractor/blob/master/docs/api-overview.md#config-file

Diese Datei werden wir dann noch in weiteren Szenarien anpassen und erweitern.

Jasmine Testfallspezifikationsdatei src/app.e2e-spec.ts

Die Datei enthält die Jasmine Spezifikation der "Testsuiten" und "Testfälle". Der Verweis auf app.po ist interessant, weil dort die sogenannte Page Object Implementierung hinterlegt ist. Mehr dazu im nächsten Abschnitt

import { AppPage } from './app.po'; //Import von Page Object AppPage aus der datei src/app.po.ts
 
describe('workspace-project App', () => { // neue TestSuite
  let page: AppPage; //globale AppPage Variable, verfügbar für alle Its
 
  beforeEach(() => { //Jasmine "Init" Klasse, diese wird jedes mal ausgeführt, bevor ein 'it' ausgeführt wird
    page = new AppPage(); //Erstellung neuer Instanz der der Page Object Klasse AppPage
  });
 
  it('should display welcome message', async () => { //neuer Testfall
    await page.navigateTo(); //Aufruf einer Page Object Funktion, mit der zu der Startseite navigiert wird
    expect(await page.getParagraphText()).toEqual('Welcome to testapp!'); //überprüfung ob der Paragraph Text dem erwarteten Wert "Welcome to testapp!" entspricht
  });
});

Page Object Implementierung src/app.po.ts

Die Datei stellt das Page Object bzw. "funktionale Abstraktion" der tatsächlichen Protractor Zugriffe auf die Elemente einer Webseite dar. In dieser werden also die einzelnen Elemente gesucht und über Protractorfunktionalitäten angesteuert.

import { browser, by, element } from 'protractor'; // importiert benötigte Funktionalitäten aus dem Protractor Modul

export class AppPage { // exportiert die Klasse, die von anderen Klassen konsumiert und genutzt werden kann
async navigateTo() { //Navigationsmethode
await browser.get('/'); //Ruft über protractor die "baseadress" Adresse auf, die in protractor.conf.js hinterlegt ist
}

async getParagraphText() {
await element(by.css('app-root h1')).getText(); //sucht mit Hilfe von css Identifier ein Element mit dem Tag h1 und gibt den Text von diesem Element zurück.
}
}

Aufbau des Angular Tutorial Projektes

Nachdem wir den grundsätzlich Aufbau eines E2E Tests angeschaut haben, möchten wir eine etwas komplexere Anwendung nehmen, mit der wir anschließend unsere Testfälle entwickeln und anschließend mit unterschiedlichen Konfigurationen testen werden. Dazu nehmen wir einfach das auf der Angular Hauptseite https://angular.io/tutorial/toh-pt0 aufgeführte Beispiel. Da es bei diesem Tutorial nicht um den Aufbau einer Angular Anwendung geht, laden wir einfach die fertige Angular Applikation von der Tutorialseite runter:

Links zu dem finalen Review findest du hier: https://angular.io/tutorial/toh-pt6#final-code-review
Und die Zip Datei kann hier bezogen werden: https://angular.io/generated/zips/toh-pt6/toh-pt6.zip

Solltest du die komplette Anwendung selbst aufbauen möchten, folge einfach dem sehr gut beschriebenen Tutorial auf der angular.io Webseite.

Ich habe für dieses Tutorial ein neues Verzeichnis auf C: mit dem Namen "tutorial" angelegt, dorthin die zip Datei runtergeladen und anschließend die zip Datei in einen weiteren Unterordner mit der Bezeichnung "angular_heroes" entpackt.

Anschließend wechseln wir in das Anwendungsverzeichnis und führen npm install aus, um die benötigten Pakete für unsere Angular Anwendung zu installieren:

 cd C:\tutorial\angular_heroes
npm install

Damit sollten sich die erforderlichen Pakete installieren lassen.  Am Ende müsste in etwa folgende  Meldung erscheinen:

 
added 1113 packages from 1279 contributors and audited 34260 packages in 70.961s
found 14 vulnerabilities (9 low, 5 high)
run `npm audit fix` to fix them, or `npm audit` for details
 

Tipp: Sollte npm install mal nicht beim ersten mal erfolgreich durchlaufen, einfach noch einmal probieren. Ab und zu gibt es da Probleme beim Download von phantomjs oder anderen Paketen.

Nun müssten wir die Applikation starten können, dazu einfach in den angular_heroes Ordner gehen und mit ng-serve starten:

ng serve --open

Mit dem --open Parameter wird die Applikation nach Start in dem Standard Browser geöffnet.

Nach diesem Befehl sollte sich dein Browser mit der URL http://localhost:4200/dashboard öffnen und du müsstest das im Angular Tutorial gezeigte "Dashboard" sehen. Mach Dich ruhig ein paar Minuten mit der Applikation vertraut, bevor wir mit der automatisierten Qualitätssicherung dieser Applikation loslegen.

Wichtig: Da die Angular Leute ja bekannt für ihre Begeisterung für testbare Anwendungen / Testautomatisierung sind, haben sie natürlich schon etliche Testfälle für das Tutorial Projekt hinzugefügt. Du kannst dir natürlich gerne die E2E Testfälle der Entwickler anschauen und diese auch gerne mit npm run e2e ausprobieren. Ich würde allerdings kurz bitten den Ordner "src" zu löschen bzw. außerhalb der Applikation zu verschieben und einen neuen, leeren Ordner src anzulegen, damit wir die Testfälle gleich komplett neu in der Page Objects Struktur aufbauen können.

Aufbau der UI Testautomatisierung für das Angular Projekt

Da wir nun ein funktionierendes "System Under Test" haben, können wir uns überlegen, welche Testfälle dafür relevant sind. Am besten geht das natürlich direkt in der Jasmine BDD Notation. Daher starten wir hier einfach mit dem "Verhalten" in dem Spec File.

Erstellung der Jasmine Spec File(s)

Wir legen uns in dem Ordner src eine Datei an. Im Visual Studio Code klicke einfach rechts auf den Ordner im Explorer und wähle "New File" aus.

Wir betrachten einfach die beiden Views der Appliaktion und unterteilen sie in "Verhalten / Eigenschaften, die wir Testen möchten.

Beim Dashboard könnten wir z.B. prüfen ob:

  • der Titel "Tour of Heroes" ist
  • die 4 Top Heroes angezeigt werden
  • die Navigation verfügbar ist und aus Dashboard und Heroes besteht

Bei der Hero View könnten wir prüfen ob:

  • Die Liste der Helden existiert
  • wir einen neuen Helden anlegen können
  • wir einen Helden löschen können

Die dazugehörige Jasmine Struktur könnte daher so aussehen:

describe('Heroes Dashboard', ()=> {
    it(' should have "Tour of Heroes" as title',()=> {
 
    });
    it(' should contain 4 Top Heroes',()=> {
 
    });
 
    it(' should have a navigation',()=> {
 
    });
 
});
 
describe('Heroes ', ()=&amp;gt;{
    it(' view contains a list of heroes',()=> {
 
    });
 
    it(' creation is possible',()=> {
 
    });
 
    it(' deletion is possible',()=> {
 
    });
});

Wenn wir jetzt npm run e2e ausführen, sollte die Ausgabe so aussehen:

Jasmine started
Heroes Dashboard
√  should have "Tour of Heroes" as title
√  should contain 4 Top Heroes
√  should have a navigation

Heroes
√  view contains a list of heroes
√  creation is possible
√  deletion is possible
Executed 6 of 6 specs SUCCESS in 0.023 sec.

Die Testfälle machen an der Stelle natürlich überhaupt nichts. Aber wir sehen schon mal, dass Jasmine mit unserer Struktur arbeiten und die "it" Anweisungsblöcke problemlos aufrufen kann.

Erstellung der dazugehörigen PageObjects

Die Page Objects Dateien sollten Funktionen und Hilfsfunktionen der Businesslogik einer View abbilden. Deshalb legen wir uns nun eine weitere Datei in das Verzeichnis e2e/src an, die wir  dashboard.po.ts nennen. Ich werde die verwendeten Funktionen mit den dazugehörigen Links zu der Protractor Hilfe versehen, damit du dir gleich die offizielle Beschreibung ansehen kannst inkl. der Rückgabewerte der Funktionalität und dir natürlich auch angewöhnst, bei neuen Funktionen die zugehörige Hilfe zu verwenden.

Page Objects Datei dashboard.po.ts

Um das Verhalten der View testen zu können, könnten wir z.B. in der dazugehörigen Page Object Datei folgende Funktionen anlegen:

  1. Zu der View navigieren
  2. Liste mit Top Helden zurückgeben
  3. Title auf dem Dashboard zurückgeben
  4. Die Namen der Navigationselemente als Array zurückgeben

Rückgabe vom Titel und die Navigation zur Seite ist an sich relativ einfach, wir könnten uns eigentlich komplett den beiden Funktionen navigateTo und getTitle aus dem neuen e2e Projekt bedienen.
Die navigateTo Methode ruft lediglich browser.get('/') auf, womit der Browser angewiesen wird, die baseAddress (aus protractor.conf.js) aufzurufen.
Die getTitle Methode sieht schon etwas komplizierter aus: dort wird mit element(by.css('app-root h1')) ein Element gesucht und mit getText() anschließend der innerText von diesem Element zurückgegeben.

Auch die beiden anderen Funktionen sehen ähnlich aus, nur verwenden wir dafür dann die Suche nach mehreren Elementen mit dem Befehl element.all. Dieser Befehl liefert uns eine Art Array zurück (zur Synchronisierungt kommen wir gleich), welches 0 bis n Elemente enthalten kann, die mit den Kriterien gefunden bzw nicht gefunden wurden. Bei der Liste mit den Navigationsnamen nutzen wir die gleiche element.all Funktion, nur bekommt diese am Ende noch die Map Funktion, die eben nur die Texte aus den Daten extrahiert und uns den dazugehörigen "Texte" zurück gibt.

import { browser, by, element, ElementFinder } from 'protractor';
  
export class DashboardPage {
 async navigateTo() {
    await browser.get('/');
  }

 async getTopHeroes(){
    return await element.all(by.css('app-root app-dashboard > div h4'));
  }
  
  async getDashboardTitle() {
    return await element(by.css('app-root h1')).getText();
  }

  async getNavigationItemNames() {
    return await element.all(by.css('app-root nav a')).map((el: ElementFinder) =><strong>;</strong> el.getText()); 
  }
}

Page Objects Datei heroes.po.ts

Um die Funktionen der Heroes Sicht abdecken zu können, würden sich folgende Methoden anbieten:

  • Liste von den Heroes zurückgeben
  • Einen neuen Hero anlegen
  • Einen Hero löschen
import { browser, by, element, ElementFinder } from 'protractor'; 
  
export class HeroesPage { 
  async navigateTo() { 
    await browser.get('/heroes'); 
  }
 
  async getHeroList(){
    return await element.all(by.xpath('//app-heroes/ul'));
  }
  
  async addHero(name:string) { 
    await element(by.xpath('//app-heroes//input')).sendKeys(name);
    await element(by.xpath('//button[text()=" add "]')).click();
    return await element(by.xpath('//app-heroes/ul//*[contains(text(),"'+name+'")]'));
  }
 
  async deleteHero(name:string) { 
   await element(by.xpath('//app-heroes/ul//*[contains(text(),"'+name+'")]/../button[@title="delete hero"]'));
    return await element.all(by.xpath('//app-heroes/ul//*[contains(text(),"'+name+'")]'));
  }
}

Implementierung der automatisierten E2E Testfälle

Nachdem die Funktionalität implementiert ist, wollen wir diese aus unseren Jasmine Spec Testfällen aufzurufen. Aber erst mal wird es etwas theoretischer:

Asynchronität in der Testautomatisierung mit JavaScript / Protractor

Solltest du bisher mit Selenium in Java oder C# gearbeitet haben, sollte dir der Code sehr bekannt vorkommen. Der vertraute Eindruck täuscht an dieser Stelle aber. Wir arbeiten mit Javascript / Typescript und natürlich auch mit Protractor asynchron. Wie die Hilfe von element(by.css('app-root h1')) schon anmerkt, gibt die Suche einen sogenannten "ElementFinder" und nicht ein WebElement wie in C# / Java zurück. Dieses kann zwar für die meisten Funktionen wie ein WebElement verwendet werden, enthält aber auch die Besonderheit, dass die Funktionen eben nicht synchron ausgeführt werden, sondern erst dann, wenn der ElementFinder das dazugehörige Element auch gefunden hat. Wenn du dir auch erneut z.B. getText() als Funktion anschaust, wirst du feststellen, dass diese keinen String Wert zurückliefert, sondern einen Promise, der "verspricht" irgendwann einen String Wert zu liefern. In diesem Fall heißt es, dass wenn du z.B. den Wert von getText() in die Konsole ausgeben möchtest, dieser zwingend einen await bzw. .then zur Synchronisierung benötigt, z.B.:

await element(by.tagName('h1')).getText().then(function(wert){ console.log(wert); })

Das muss man im Hinterkopf behalten, funktioniert aber problemlos, wenn man etwas javascript / typescript Erfahrung mitbringt bzw. Interesse hat, sich in dieses Thema einzuarbeiten.

Spec File mit Aufrufen der Page Objects

Aber nun kommen wir zu der Spec Datei, diese würde nun am Ende so aussehen:

import { DashboardPage } from './dashboard.po';
import { HeroesPage } from './heroes.po';
 
 
describe('Heroes Dashboard', () => {
    let dashboardPage;
 
    beforeAll(() => {
        dashboardPage = new DashboardPage();
    });
    beforeEach(async () => {
        await dashboardPage.navigateTo();
    });
 
 
    it('should have "Tour of Heroes" as title', async () => {
        expect(await dashboardPage.getDashboardTitle()).toEqual("Tour of Heroes");
    });
 
    it('should contain 4 Top Heroes', async () => {
       await dashboardPage.getTopHeroes().then(function (arr) {
            expect (arr.length).toEqual(4);
        })
    });
 
    it('should have Dashboard and Heroes in Navigation List', async () => {
       await dashboardPage.getNavigationItemNames().then((arr) => {
            expect (arr.length).toEqual(2);
            expect (arr[0]).toEqual("Dashboard");
            expect (arr[1]).toEqual("Heroes");
        })
 
    });
 
});
 
describe('Heroes ', () => {
    let heroesPage;
 
    beforeAll(() => {
        heroesPage = new HeroesPage();
    });
 
    beforeEach(async() => {
        await heroesPage.navigateTo();
    });
 
 
    it('view contains a list of ten heroes', async () => {
       await heroesPage.getHeroList().then((arr) => {
            expect(arr.length).toEqual(10);
 
        })
    });
 
    it(' creation is possible', async () => {
        //neuen Helden anlegen
        let neuerHeld = heroesPage.addHero("SuperTester");
        //prüfen ob der Held neben einer neuen ID auch den richtigen Namen enthält
        expect(await neuerHeld.getText()).toContain("SuperTester");
 
        //Bonus: Asyonchronität, hier geben wir die Liste aller Helden aus:
        heroesPage.getHeroList().then((helden) =&amp;gt; {
            for (let held of helden) {
                held.getText().then((heldenname) =&amp;gt; {
                    console.log(heldenname);
                })
            }
        });
 
        //und hier die Demonstration der Asynchronität von Protractor:
        console.log("Dieser Text wird in der Console früher ausgegeben, als die Liste der Helden ;-)");
 
    });
 
    it(' deletion is possible', async () => {
        await heroesPage.deleteHero("SuperTester").then((arr) => {
            expect(arr.length).toEqual(0);
        })
 
    });
});

Damit sind unsere ersten automatisierten E2E Testfälle der Angular Applikation fertig.

Starte die Testdruchführung mit

 ng e2e 

und überprüfe die Testergebnisse.

Der Test-Code ist natürlich noch nicht perfekt und könnte noch weiter verfeinert werden. Er demonstriert aber ganz gut, wie die Testautomatisierung mit Protractor in einem Angular Umfeld grundsätzlich realisiert werden kann. Ich habe auch eine kleine Demo der Asynchronität in die Specs eingebaut, um zu verdeutlichen wie der "Executor" vorgeht.

Zusammenfassung

In diesem Tutorial haben wir gelernt, wie man sehr schnell eine funktionierende state-of-the-art  E2E Testautomatisierungslösung einer Angular Applikation mit Hilfe der automatisch generierten Vorlage in einem Angular Projekt aufsetzen kann. In dieser Vorlage haben wir Jasmin Framework verwendet, um eine Testspezifikation mit Hilfe der behavior-driven Notation zu definieren. Anschliessend haben wir das selenium-basierte Testautomatisierungsframework Protractor verwendet, um die konkreten Aktion dieser Testspezifikation zu automatisieren. Am Schluss haben wir die integrierte Testlaufzeitumgebung von Angular verwendet, um bequem die Testdurchführung unserer Tstsuite mit einem einzigen Befehl zu starten.

Ich werde demnächst weitere Beiträge zu dem Thema Testautomatisierung im Angular Umfeld hinzufügen, u.A.

  • Durchführung von E2E Protractor Tests in der CI Pipeline
  • Durchführung der E2E Testfälle in der Cloud (z.B. mit BrowserStack)
  • Mocken von Rest API um isoliert Oberflächen testen zu können
  • und evtl. einiges mehr.

Schaue daher regelmäßig vorbei ;-)


Hat dir dieses Tutorial gefallen? Fehlt noch etwas oder du kommst an einigen Stellen nicht weiter? Bitte teile uns dein Feedback in den Kommentaren mit.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Weiterbildung

ISTQB Agile Tester Extension Zertifizierung


ISTQB (International Software Testing Quality Board) ist eine gemeinnützige Zertifizierungsstelle für Softwaretester. Die Zertifikate von diesem Board sind weltweit anerkannt und auch in vielen Stellenbeschreibungen für die Position als Tester /QA Engineer (sowohl als Arbeitnehmer als auch Freiberufler) häufig anzutreffen.

Ich habe vor kurzem die ISTQB Agile Tester Extension Zertifizierung für ein Projekt nachholen dürfen und möchte an dieser Stelle mein Vorgehen bei der Vorbereitung darstellen und kurz den Ablauf der Zertifizierung skizzieren.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Allgemeines

Flaky Tests und der Umgang mit diesen - #1 Medien / Infosammlung


Flaky / instabile Testfälle wird wohl jeder kennen, der schon mal das Vergnügen hatte, den einen oder anderen automatisierten Oberflächentest auszuführen. Flaky Testfälle können viele Ursachen haben, dem Grund auf die Spur zu kommen, ist eine der Hauptaufgaben des Testautomatisierers.

Seit einigen Jahren tobt ein kleiner Glaubenskrieg zwischen denen, die, aus Zeit oder Kostengründen, etwas instabile Testfälle verstecken / erneut durchführen möchten und denen, die die darin einen Verstoß gegen alle Prinzipien eines/r ehrenhaften Testautomatisierers/in sehen.

Hier findest du einen kleinen Einblick in die Meinungen unterschiedlicher Unternehmen / Fach-Personen, die sich mit diesem Thema befasst haben.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Warnung über unsichere Passwortübetragung in FF / Marionette deaktivieren


Seit Firefox 52 gibt es eine Besonderheit:
Wenn auf einer Webseite ohne HTTPS (SSL Zertifikat), ein Passwort eingetippt wird, erscheint folgende Warnung: This connection is not secure. Logins entered here could be compromised.

Screenshot: Firefox-Warnung This connection is not secure unter einem Passwortfeld

Das Ganze ist natürlich sehr sinnvoll, denn das Passwort wird in diesem Fall im Klartext  übertragen und kann z.b. in nicht gesicherten WLAN-Netzen mit einfachsten Mitteln ausgelesen werden.

In der Testautomatisierung bereitet uns dieses "Tooltipp" aber ab und zu Probleme.
Denn was passiert, wenn der dazugehörige Login Button direkt unter dem Passwortfeld ist? Richtig! Statt auf den Button zu klicken, erfolgt der Klick auf die Warnung und diese leitet uns auf die Seite "https://support.mozilla.org/en-US/kb/insecure-password-warning-firefox" weiter. Das hat natürlich einen fehlgeschlagenen Testfall zur Folge.

Hier ein Tipp wie diese Warnung ausgeschaltet werden kann:

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Top 5 Vorträge der Selenium Conference 2016 in London


Nachdem die Selenium Conference in London bereits fast 4 Monate her ist und die nächste bereits in wenigen Wochen statt findet, möchte ich meine persönliche Top 5 der Präsentationen vorstellen, die keiner verpassen sollte, der in der beruflich oder privat mit der Testautomatisierung beschäftigt.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Appium

WinAppDriver - Windows Automatisierung mit Appium / Selenium


Es ist offiziell, die Hölle ist zugefroren!!!

So oder so ähnlich hat es einer der Erfinder von Appium auf der Selenium Konferenz 2016 in London verkündet. Der Grund ist relativ simpel. Microsoft hat sich entschieden den Coded UI Ansatz nicht weiter zu fahren und auf den generischen Selenium / Appium WebDriver Ansatz zu setzen.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Selenium Tutorial: Wordpress Automatisierung mit C# - Einrichtung der Umgebung


Tutorial-Ziel

Wir alle haben ab und zu Aufgaben, die wir gerne automatisieren möchten. Mit diesem Tutorial zeige ich, wie mit Hilfe von Selenium, bestimmte Aktionen in Wordpress automatisiert werden können.
Ziel des Tutorials ist, automatisiert durch alle vorgegebenen Beiträge zu gehen und in jedem Beitrag eine bestimmte Kleinigkeit zu ändern und zu speichern.

In dem ersten Teil wird nochmal die komplette Einrichtung beschrieben, das ist bereits in einem anderen Tutorial auf der Seite ähnlich zu finden, wegen der Vollständigkeit habe ich das aber hier noch einmal hinzugefügt.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Protractor

Expect in Jasmine / Protractor Framework erweitern


Während der Automatisierung mit Jasmine / Protractor Framework ist es oft sinnvoll, die bestehenden expect Klassen (u.a. hier beschrieben: /expect-jasmine-javascript-framework/) zu erweitern.

Dazu wird von dem Framework die addMatchers Methode bereitgestellt. In dieser können Funktionen ausimplementiert werden, die dann anschließend in gewohnter Weise mit Expect aufgerufen werden.

Ein sehr gutes Beispiel steht zu diesem Thema auf GitHub bereit:  https://gist.github.com/elgalu/94284ec0ac3e8a590507

Es wird gezeigt, wie mit Hilfe von expect() und der dazugehörigen Erweiterungsmethoden die Klassen eines Elements überprüft werden können.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Selenium Version 2.46.0 verfügbar


Die neue Selenium Version 2.46.0 steht jetzt zur Verfügung. Diese kann wie immer auf der Selenium Download Seite bezogen werden:
http://www.seleniumhq.org/download/

Die wichtigsten Änderungen umfassen u.a.:

  • Support vom Firefox Driver unter openBSD
  • Aktualisierter HtmlUnitDriver
  • Kritischer Fehler im Selenium Server behoben (Java Versionsdiskrepanz)
  • ...

Detaillierte Änderungsbeschreibung ist unter folgendem Link zu finden: https://raw.githubusercontent.com/SeleniumHQ/selenium/master/java/CHANGELOG

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Selenium 2.45.0 verfügbar - Firefox 36 Bug gelöst


Die neue Version Selenium 2.45.0 ist seit Freitag verfügbar und kann wie immer hier bezogen werden:
http://www.seleniumhq.org/download/

Die neuste und wichtigste Neuerung für die, die mit Firefox testen ist, dass die automatisierten Testfälle mit der neuen Firefox 36 Version wieder funktionieren. Der dazugehörige Bug (Selenium Bug 8399) wurde zum Glück relativ schnell gelöst und die automatisierten Testfälle laufen jetzt erfolgreich an.

Offenbar wird seit der Firefox Version 36, eine davor verwendete API Schnittstelle nicht mehr unterstützt, dadurch konnten die Anfragen an den Firefox Driver nicht mehr übergeben werden.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Drag and Drop für HTML 5 Elemente mit Selenium


Normalerweise ist Drag and Drop mit Selenium kein Problem. In der Standard-Bibliothek von Selenium existiert die Möglichkeit eine DragDrop Action zu erstellen:

Actions actions = new Actions(driver);
actions.DragAndDrop(element1, element2);
actions.Build();
actions.Perform();

Dieses Vorgehen funktioniert auch absolut problemlos mit der HTML4 JS Lösungen. Seit der HTML5 Version klappt es mit Selenium leider überhaupt nicht mehr. Auch die Kombination aus ClickAndHold Aktion, MoveToElement und Release bringt einen bei dem neuen HTML Standard kein Stück weiter.
Dieser Fehler ist bekannt und ist bereits seit 2012 offen: Issue 3604: HTML5 Drag and Drop with Selenium Webdriver

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/1 Kommentar/von Waldemar Siebert

Protractor

Arbeiten mit expect im Jasmine JavaScript Framework


Um im Jasmine Framework und natürlich allen darauf basierten Testautomatisierungs-Frameworks (z.B. Protractor für AngularJS) erwartetes Sollverhalten überprüfen zu können, kann die Funktion / das Keyword "expect" verwendet werden. Mit den Funktionen können Zeichenketten, Objekte und andere Elemente überprüft werden.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Visual Studio Testframework

Automatisierte Tests mit C# in eigener AppDomain starten


In C# existiert die Möglichkeit, automatisierte Testfälle in einer eigenen AppDomain zu starten.
Der Vorteil von AppDomains ist, dass alle Aktionen in einem separaten Bereich ausgeführt werden. Anwendungsdomänen helfen dabei, den ausführenden Code von den anderen Bereichen zu isolieren und nach der Ausführung nicht benötigte Referenzen zu entladen.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

Selenium Tutorial: Automatisiertes Testen von Webanwendungen - Teil 1


Lernziele des Tutorials: Anlage von einem C# Projekt, Anbindung der Selenium DLLs in .Net Umgebung. Öffnen der Seite www.testautomatisierung.org in Firefox.

Zielgruppe: Dieses Selenium Tutorial ist für Anfänger gedacht, vorausgesetzt sind rudimentäre C# / Testautomatisierungserfahrungen.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium

OptionTag Auswahl mit Selenium


Um in einem automatisierten Test einen Eintrag aus einer DropDown Liste auszuwählen (Select-Tag), gibt es in Selenium mehrere Möglichkeiten.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Allgemeines

Deutsche Version des ISTQB Glossars hinzugefügt


Als weiteren Service für unsere Leser wurde die deutsche ISTQB Glossar-Version hinzugefügt. Diese kann hier gefunden werden: Glossar deutsch

Die englische und die russische Version folgen demnächst.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Microsoft Test Manager

MTM Testdurchführung über TFS API starten


Um einen automatisierten Testrun über die TFS API zu erstellen, kann die CreateTestRun Methode der Schnittstelle ITestPlan verwendet werden.
Das Erstellen von einem neuen Testlauf funktioniert (zumind. für die Basis-Workflows) ziemlich einfach.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Visual Studio Testframework

Aufbau TFS Testtabellen


Wer sich mit Qualitätssicherung in TFS beschäftigt, wird früher oder später mit den dazugehörigen Testtabellen in Kontakt kommen (Query in tcm.exe, TFS API).
Folgender Blog Eintrag bietet eine gute Übersicht über die einzelnen einzelnen Tabellen und dazugehörigen Interfaces:
http://blogs.msdn.com/b/duat_le/archive/2010/02/25/wiql-for-test.aspx

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium, Webautomatisierung

Selenium MouseOver Event erzeugen


Um auf dynamische Untermenüs zugreifen zu können, ist es oft Notwendig ein "MouseOver-Event" auf ein bestimmtest Element zu erzeugen. Alles andere führt bei Selenium zu der "Element is not currently visible and so may not be interacted with" - Exception.

Wenn auch das Eltern-Element mit einer Seite im Hintergrund belegt ist, kann der Zugriff auf das Untermenü, nicht mit einem Klick realisiert werden. Es sollte also möglich sein, ein Selenium MouseOver aus dem automatisierten Test zu erzeugen.
Selenium bietet hier die Möglichkeit mit Actions zu arbeiten. Aus dem Driver wird ein Actions Builder erzeugt, dieser kann dann eine Selenium MoveToElement Methode auf das gewünschte Webelement ausführen.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Selenium, Webautomatisierung

Selenium Version 2.33.0 verfügbar


Die neue  Selenium WebDriver C# Assembly (Version 2.33.0) steht zur Verfügung.
Diese kann wie gewohnt von der Seite seleniumhq geladen werden:
http://docs.seleniumhq.org/download/

Die Änderungen in dieser Version sind:

 * Supports native events for Firefox versions 21 (current), 20 (immediately
   previous), 17 (current ESR), and 10 (immediately previous ESR)
 * Issue #5549: Modified to use indexer for putting entry in .NET Firefox
   Profile preferences Dictionary. Was previously using the .Add() method of
   the Dictionary, which would throw an exception if the key already existed.
 * Updated InternetExplorerDriverService to allow using new command line
   options for IEDriverServer.exe
(Auszug aus Selenium Changelog)

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Microsoft Test Manager, Visual Studio Testframework

VS 2010 Testcontroller überfüllt die Partition


Sollte der Testcontroller über eine, im Verhältnis zu den durchzuführenden Testfällen, zu kleine "C" Partition (ggf. auch andere Partition, auf der sich das Users Verzeichnis befindet) verfügen, kann es während der Durchführung zu "Problemen" führen.
Grund dafür ist ein fehlendes, bzw. fast nicht vorhandenes Aufräumen des Users Verzeichnisses "QTController".

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Microsoft Test Manager, Visual Studio Testframework

Unittest / Coded UI Testmethoden mit WorkItem TestCase in Visual Studio 2012 verknüpfen


Durch Visual Studio 2012 haben sich einige Menüs und Funktionen im Testbereich geändert.
Mehrere Dialoge, wie Test View und Test List Editor, wurden jetzt zu einem Test Explorer zusammengefasst.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Ranorex

Ranorex: Pixelfarbe ermitteln


Bei manchen Testfällen ist es notwendig die aktuelle Hintergrundfarbe eines Oberflächenelements zu ermitteln.
WinForms / VB6 / usw. Oberflächen stellen diesen Wert nicht als Eigenschaft bereit, aus diesem Grund muss dieser Wert über einen anderen Weg abgefragt werden.

Der einfachste Weg ist es, ein Screenshot des Elements zu erzeugen und diesen dann mit der GetPixel Methode abfragen.
Ranorex stellt dazu z.B. die Methode

Report.Screenshot(element);

bereit.
Bei dieser Methode wird allerdings das Bild lokal gespeichert, dieses Vorgehen ist etwas fehleranfällig und vor allem unnötig.
Nach einer längerer Suche, bin ich auf die Methode Imaging.CaptureCompressedImage() gestoßen, diese liefert ein Bitmap Objekt zur Laufzeit zurück, ohne dass Bilder lokal gespeichert werden müssen.
Als Parameter kann ein Element vom Typ Ranorex Adapter oder Ranorex Element übergeben werden.

Hier ist eine Beispiels-Methode, mit der vom übergebenen Control die Hintergrundfarben ermittelt werden können.
Natürlich können auch die Pixel verändert bzw. parametrisiert werden.

public static string Color(Adapter ui_control)
{
   Bitmap bmp = Imaging.CaptureCompressedImage(ui_control);
   Color cElementColor = bmp.GetPixel(2, 2);
   return cElementColor.Name;
}

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Allgemeines

Lesetipp: Automated Software Testing Magazine - obsolete


Leider ist die Kultur der Testautomatisierung in Deutschland (noch?) nicht so sehr verbereitet wie in anderen Ländern. So gibt es, neben gut ausgebauten und "lebendigen" Foren, auch Magazine, die sich speziell dem Thema Testautomatisierung widmen.
Unter dem folgenden Link ist ein gutes "Testautomatisierungs - Magazin", der Webseite automatedtestinginstitute.com, zu finden:
Automated Software Testing Magazige - PDF Datei(Link entfernt)
Themen u.a. sind:

  • So easy even a child can use it - Is Your Test Automation Architecture Usable?
  • Cells, Selenium, XPath and Labels - Using Labels to identify Dynamic Objects
  • Test Automation Experiences
  • Selenium vs. Watir... And the Winner is Webdriver

Waldemar - Nachtrag (11/2015):
Leider wurde die Zielseite entfernt und die PDF Datei ist nicht mehr auffindbar. Ich habe den dazugehörigen Link entfernt und den Artikel als obsolete gekennzeichnet.
Danke an Michael Grabowski, der mich darauf aufmerksam gemacht hat, dass der Link nicht mehr zu der gewünschten Seite führt.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Microsoft Test Manager

Microsoft Test Manager: TimeOut für die Testdurchführung ausschalten


Manchmal ist es notwendig, dass einzelne Testfälle länger als 30 Minuten laufen. Die Durchführungszeit wird aber, per default, von MTM auf 30 Minuten festgelegt

Default TimeOut der Testdurchführung aus Microsoft Testmanager, wird in den Test Settings festgelegt.

Mit folgenden Schritten, kann die TimeOut Zeit angepasst werden:

  • MTM starten
  • Oben den Bereich von "Testing Center" auf "Lab Center" umschalten
  • im "Lab Center" den Reiter "Test Settings Manager" auswählen
  • Im "Settings Manager" eine neue Test Setting anlegen oder eine bestehende öffnen
  • Im Bereich "Steps", Oberknoten "Advanced" auswählen, dann den Unterknoten "Timeouts"
  • "Set Mark an individual test as failed if its execution time exceeds: 30" deaktivieren
  • Speichern
  • Fertig!

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Webautomatisierung, Ranorex

Ranorex: Problem beim dynamischen Zugriff auf eine Webtabelle


Bei der Automatisierung einer Web-Applikation mit Ranorex, bin ich vor kurzem auf folgendes Problem gestoßen:

Die Tabelle besteht aus ca 10 Zeilen und 2 Header Zeilen.
Um einen flexibelen Zugriff zu ermöglichen, setze ich mir den Ranorex Pfad (Ranorex XPath) selbst zusammen.
Der Zugriff sollte in diesem Fall über "Zeilen / Spalten - Nummer" aus Sicht der Tabellenebene stattfinden.
Das Element setzte sich so zusammen:

element = tablepath + "//tr[" + row + "]/td[" + column + "]";

Alles soweit in Ordnung. Variablen row = 1 und column = 3 gesetzt, Ranorex Pfad wird richtig gefüllt und die td Zelle lässt sich, mit dem generierten Pfad, durch Ranorex Spy finden.

Der Versuch dieses Element per Methode TryFindSingle() während der Testdurchführung zu finden, ist aber gescheitert.

Host.Local.TryFindSingle(element, TimeSpan.FromSeconds(time), out tdElement))

Nach einer kurzen Try/Fail-Phase, habe ich versucht die Zelle über den Ranorex Typ "WebElement" zu finden.
Dazu wird einfach das letzte Element (td) durch ein * ersetzt und mit TryFindSingle nach Typ "WebElement" gesucht.
Dadurch kann jedes Element identifiziert werden, das den Suchkriterien entspricht. Als Result kam Tag TH (Head Element) raus.
Also row = 3 (von der Anzahl höher als das letzte TH Element) gesetzt, schon hat der Zugriff über TryFindSingle() funktioniert.
Reicht als Lösung des Problems natürlich nicht aus, die ersten beiden Zeilen sollen schließlich auch angesprochen werden können. Da kommt das Element tbody ins Spiel.
Durch tbody kann hier sichergestellt werden, dass der Zugriff wirklich auf den "Content" der Tabelle stattfindet. Die Identifikation ist so eindeutig.
Also den Ranorex XPath Ausdruck angepasst, schon funktioniert die TryFindSingle() Suche fehlerfrei:

element = tablepath + "//tbody/tr[" + row + "]/td[" + column + "]";

Man könnte annehmen, dass //tr[1]/td[1] Kombination ausreichend wäre, dem war hier leider nicht so.
Warum dieser Pfad in Ranorex Spy richtig erkannt wird und per TryFindSingle() nicht, kann ich leider nicht sagen, aber durch diesen kleinen "Workaround" kann an dieser Stelle weitergearbeitet werden.

Im Ranorex Forum gibt es ein ähnliches Problem: Beitrag im Ranorex Forum
Die dort vorgeschlagenen Lösungen, haben bei diesem Problem aber keine Besserung gebracht.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Ranorex, Selenium, Visual Studio Testframework, Microsoft Test Manager, Unit Tests

ClassCleanup() Verhalten


Um aus Microsoft Test Manager automatisierte Testfälle (Unit Tests, Coded UI Tests, Ranorex, Selenium usw.) ansprechen zu können, müssen diese in Testmethoden "verpackt" werden.

Weiterlesen

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

Testwerkzeuge Tipps und Tutorials

Tree (Baum) expandieren mit Tastenkombination


Es kann vorkommen, dass mit einigen Werkzeugen das Expandieren des kompletten Tree's nicht oder nur fehlerhaft funktioniert. Um nicht jedes Element auf "expandierbar" prüfen zu müssen, kann die **Taste *** vom Numblock auf den Oberknoten angewandt werden.

Also ein beliebiges Treeelement auswählen und * klicken. Probiert es einfach mal im Explorer aus, aber vorsicht, wählt dabei eine nicht zu tief verschachtelte Struktur, da sonst der Explorer sich aufhängen kann.

Es ist von Werkzeug zu Werkzeug unterschiedlich wie dieser Befehl an die Oberfläche übergeben werden kann. In VisualStudio kann der Befehl SendKeys() mit Parameter {MULTIPLY} auf einem Oberknoten verwendet werden.

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

QuickTest Pro

QuickTest Pro: Zeichen einer Stelle ermitteln


Um in QuickTest Professional ein Zeichen auf einer bestimmten Position im String zu ermitteln, kann die Funktion Mid() verwendet werden.

Hier ein kleines Beispiel, wie jedes Zeichen eines Strings nacheinander ausgegeben werden kann:

For i=1 to Len("Tomate")
  msgbox Mid("Tomate", i, 1)
Next

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

QuickTest Pro

QuickTest Pro: Hintergrundfarbe ermitteln


Soll bei einer Automatisierung die Hintergrundfarbe ermittelt werden, gestaltet es sich in QuickTest recht schwierig, wenn es sich nicht um Webseiten oder WPF handelt, da die Hintergrundfarbe bei Win Oberfllächen keine abfragbare Eigenschaft von GUI Objekten ist.

Ein Lösungsansatz ist es, die Hintergrundfarbe über die WinAPI Funktion GetPixel (Beschreibung Microsoft) zu ermitteln. Diese Funktion liefert einen COLORREF Wert zurück. Dieser muss dann nur noch umgerechnet werden. In dem unteren Beispiel verwende ich dazu eine selbstgeschriebene Funktion. Es gibt aber auch einen saubereren Weg an die RGB Werte zu kommen (WinApi Funktionen: GetRValue, GetGValue und GetBValue -> siehe hier)

In diesem Beispiel wird bei dem Windows "Taschenrechner" (calc, unter Windows 7) die Farbe des Buttons mit und ohne Hover Effekt geprüft.
Vor dem MouseMove hat der Button eine blaue, dannach eine orangene Farbe.

Dim Hintergrundfarbe1, Hintergrundfarbe2
Set Hintergrundfarbe1 = GetRGBValues(GetBackGroundColor(Window("Rechner").WinButton("Button")))

msgbox "Blau: " & Hintergrundfarbe1.Blue & " - Rot: " & Hintergrundfarbe1.Red & " - Grün: " & Hintergrundfarbe1.Green

Window("Rechner").WinButton("Button").MouseMove 1,1

Set Hintergrundfarbe2 = GetRGBValues(GetBackGroundColor(Window("Rechner").WinButton("Button")))
msgbox "Blau: " & Hintergrundfarbe2.Blue & " - Rot: " & Hintergrundfarbe2.Red & " - Grün " & Hintergrundfarbe2.Green

'Funktion zum Umrechnen der Werte in RGB
Function GetRGBValues(lngRGB)
  Dim Farbe
  'Neues Objekt definieren
  Set Farbe = new Farbe
  Farbe.Red = lngRGBAND &HFF&
  Farbe.Green = (lngRGB AND &H0000FF00&)/256
  Farbe.Blue = (lngRGB and &H00FF0000&)/65536

  set GetRGBValues = Farbe
End Function

Function GetBackGroundColor(dlgObject)
  Extern.Declare micLong, "GetPixel", "gdi32", "GetPixel", micLong, micLong, micLong
  Extern.Declare micLong, "ReleaseDC", "user32", "ReleaseDC", micLong, micLong
  Extern.Declare micLong, "GetDC", "user32", "GetDC", micLong
  Extern.Declare micLong, "SetForegroundWindow", "user32", "SetForegroundWindow", micLong

  Dim hDCSource, hWndSource, backColor

  hWndSource = dlgObject.GetROProperty("hwnd")
  Extern.SetForegroundWindow hWndSource
  hDCSource = CLng(Extern.GetDC(hWndSource))
  backColor = CLng(Extern.GetPixel(hDCSource, CLng(1), CLng(1)))

  Extern.ReleaseDC hWndSource, hDCSource
  GetBackGroundColor = backColor
End Function

Class Farbe
  Dim Red
  Dim Green
  Dim Blue
End Class

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert

QuickTest Pro

XML File mit QuickTest Pro lesen


XML ist in QuickTest Pro sehr nützlich. Die Hilfe von QuickTest dazu ist aber verbesserungswürdig. Hier ist eine Beispielfunktion, mit der alle XML Knoten rekursiv geöffnet werden.

Set xml = XMLUtil.CreateXML()
xml.LoadFile "C:\test.xml"
Set root = xml.GetRootElement()

'initialer Aufruf der Funktion
lese_xml root

Function lese_xml (element)
  set children = element.ChildElements()
  For i=1 to children.Count
    set child = children.Item(i)
    ' Hier können die unterschiedlichen Eigenschaften des Knotens abgefragt werden
    'z.B. Ausgabe des Namens
    print child.ElementName
    lese_xml child
  Next
End Function

Waldemar Siebert

Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.

Gründer und Geschäftsführer der Firma SimplyTest GmbH

/0 Kommentare/von Waldemar Siebert