Software Testing Flashcards
DIS/DOS?
Design Input & Design Output
Was ist Zephyr und wofür wird es verwendet?
Zephyr ist ein Testmanagement-Tool, das in Jira integriert ist.
Es wird verwendet, um Testfälle zu erstellen, zu verwalten und Testläufe durchzuführen.
Wie erstellt man einen Testfall in Zephyr?
Man navigiert zum Jira-Projekt, wählt “Mehr” und dann “Testfall hinzufügen”.
Man gibt die Details des Testfalls ein und speichert ihn
Wie führt man einen Testlauf in Zephyr durch?
Man wählt den Testfall aus, navigiert zu “Testzyklen” und startet einen neuen Zyklus.
Man führt die Tests gemäß den Anweisungen durch und dokumentiert die Ergebnisse.
Wie kann man Testergebnisse in Zephyr analysieren?
Man navigiert zu den Testzyklen und wählt den gewünschten Zyklus.
Man betrachtet die Testergebnisse und generiert Berichte für die Analyse.
Wie integriert man Zephyr mit anderen Tools?
Zephyr bietet Integrationen mit verschiedenen CI/CD-Tools und Automatisierungstools.
Man konfiguriert die Integrationen in den Einstellungen von Zephyr.
Was ist Cypress und wofür wird es verwendet?
Cypress ist ein Frontend-Testwerkzeug für das automatisierte Testen von Webanwendungen.
Es wird verwendet, um End-to-End-Tests in einer realen Browserumgebung durchzuführen
Wie installiert man Cypress?
Man installiert Cypress über npm mit dem Befehl npm install cypress –save-dev.
Nach der Installation kann man Cypress über das Kommando npx cypress open starten.
Wie schreibt man einen einfachen Test in Cypress?
Man erstellt eine neue Testdatei im cypress/integration-Verzeichnis.
Man verwendet die describe und it Funktionen, um Testfälle zu definieren und cy.visit zum Navigieren zu einer URL.
Wie verwendet man Assertions in Cypress?
Assertions in Cypress überprüfen, ob bestimmte Bedingungen im Test erfüllt sind.
Man verwendet Befehle wie expect oder should für Assertions.
Wie kann man Cypress mit CI/CD-Pipelines integrieren?
Man konfiguriert Cypress in der CI/CD-Pipeline, indem man die notwendigen Schritte in der Konfigurationsdatei der Pipeline definiert.
Cypress Tests werden automatisch ausgeführt, wenn Änderungen gepusht werden.
Frontend-Testwerkzeug
Ein Werkzeug, das speziell für das Testen der Benutzeroberfläche (Frontend) von Webanwendungen entwickelt wurde.
Beispiel: Cypress wird verwendet, um zu überprüfen, ob ein Anmeldeformular auf einer Webseite korrekt funktioniert, indem es automatisiert Benutzerdaten eingibt und auf den Anmeldebutton klickt.
End-to-End-Tests
Tests, die den kompletten Ablauf einer Anwendung aus der Sicht des Endnutzers überprüfen.
Beispiel: Ein End-to-End-Test könnte den gesamten Kaufprozess in einem Online-Shop simulieren, von der Produktauswahl bis zur Bestellbestätigung.
Assertions
Überprüfungen innerhalb eines Tests, die bestätigen, dass das erwartete Verhalten oder der erwartete Zustand einer Anwendung tatsächlich vorliegt.
Beispiel: expect(true).to.be.true ist eine einfache Assertion, die überprüft, ob der Wert true auch tatsächlich true ist.
expect oder should
Befehle in Cypress, die für Assertions verwendet werden.
Beispiel: cy.get(‘.alert’).should(‘contain’, ‘Login erfolgreich’) überprüft, ob ein Element mit der Klasse .alert den Text ‘Login erfolgreich’ enthält.
Testfall
Eine spezifische Anforderung oder Bedingung, die überprüft werden muss, um die Funktionalität eines Softwareprodukts zu validieren.
Beispiel: Ein Testfall könnte sein, zu überprüfen, ob ein Nutzer sich mit einer gültigen E-Mail-Adresse und Passwort anmelden kann.
Testlauf
Die Durchführung von Testfällen, um zu überprüfen, ob die Software die definierten Anforderungen erfüllt.
Beispiel: Ein Tester führt einen Testlauf durch, indem er die Schritte eines Testfalls befolgt und überprüft, ob das erwartete Ergebnis eintritt.
Was ist manuelles Testen?
Was ist automatisiertes Testen?
Was ist regulatorisches Testen?
Was ist Validierung und wo macht man es?
- Geräte / Produkte validiert man
Was ist Verifikation und wo macht man es?
- Dokumente wie Design Input (Product Owner) und Design Output (Desinger) werden verifiziert
Wie sieht ein einfacher Vorgang aus um mit Cypress ein Benutzerprofil zu überprüfen?
Wie sieht ein einfacher Vorgang aus um mit Cypress ein Count Up/down zu überprüfen?
VisioNize® Lab Suite Connectivity
VisioNize Lab Suite ermöglicht die Vernetzung und Fernüberwachung von Laborgeräten. Es unterstützt Geräte von Eppendorf und Drittanbietern, bietet Alarmbenachrichtigungen, Wartungsplanung und Audit-Protokolle. Nutzer können Geräteleistungsdaten einsehen und verwalten, sowohl über mobile Geräte als auch über ein Firmennetzwerk
Vorteile der VisioNize Lab Suite
Vorteile der VisioNize Lab Suite
Fernüberwachung: Überwachung der Leistung von Laborgeräten von überall aus
Alarmbenachrichtigungen: Benachrichtigungen bei Gerätealarmen, Fehlern und Änderungen des Gerätestatus
Wartungsplanung: Automatisierung der Wartungsmaßnahmen aller Laborgeräte und Benachrichtigung bei Fälligkeit
Audit-Protokolle: Detaillierte Dokumentation von Geräteleistungsdaten, Nutzereingriffen und Wartungsmaßnahmen
Zugang zu Gerätedaten: Zugriff auf alle relevanten Dokumente, Standardarbeitsanweisungen und Bedienungsanleitungen
Fern-Updates: Neue Verbesserungen sind sofort für alle VisioNize touch enabled Geräte verfügbar
Erhöhte Probensicherheit: Sicherstellung optimaler Bedingungen für das Zellwachstum und Vermeidung von Probenverlust
Verbesserung der Produktivität: Verwaltung wiederkehrender Aufgaben und Planung des Einsatzes von Geräten
Flexibilität: Anpassung der Services an die Bedürfnisse des Labors und Skalierbarkeit der Lösung
Kostenlose Erstnutzung: Möglichkeit, die ersten drei Geräte kostenlos anzubinden und praktische Erfahrungen zu sammeln
Nachteile der VisioNize Lab Suite
Nachteile der VisioNize Lab Suite
Die bereitgestellten Quellen enthalten keine spezifischen Informationen über Nachteile der VisioNize Lab Suite. Generell könnten potenzielle Nachteile von digitalen Labormanagement-Systemen jedoch in Bereichen wie Kosten für umfangreichere Nutzung, Abhängigkeit von Internetverbindungen, Datenschutzbedenken und die Notwendigkeit regelmäßiger Updates und Wartung liegen. Ohne spezifische Details aus den Quellen bleibt dies jedoch spekulativ.
Erkläre die Testing Pyramide mit deinen Worten wie ist die Reihenfolge und wofür sind die einzelnen Tests?
4 Ebene Unit Tests während der Entwicklung
3 Ebene Component Tests während der Entwicklung
Testet eine einzelne Componente ob z.B theoretisch eine API gefetcht werden kann
2 Ebene Integration Tests während der Entwicklung
Testet die Intergration zwischen mehreren Funktionen bzw Componenten wie z.B das Fetchen
1 Ebene e2e / end to end test
0 Ebene Manuelles Testen
think if you’re testing a car. You would want to test the engine on its own (component testing). The individual parts of the engine will also need to be tested i.e fuel injectors (unit testing). Then you want to test how the engine fits into the car model (integration testing)
Was ist ein Testbericht und was beinhaltet er im Softwaretesting?
Antwort: Ein Testbericht dokumentiert die Ergebnisse der Testaktivitäten. Er beinhaltet Informationen über durchgeführte Tests, Testergebnisse, gefundene Fehler, Testabdeckung und Bewertungen der Softwarequalität.
Was ist eine gute Analogie/Vergleich für Automatisierte Tests?
- Automatisierte Tests sind ähnlich wie Sport machen
- Jeder weiß, dass Sport etwas Gutes für einen selbst ist und einem etwas positives bringt
- So weiß auch jeder Entwickler, dass automatisierte Tests etwas gutes für die Qualität der Software ist
- Aber es ist schwer diese, die ganze Zeit anzuwenden und zu erstellen. Wie beim Sport ist es mit Aufwand und Sorgfalt verbunden. Man braucht Disziplin.
- Dabei helfen viele kleine und leichte automatisierte Tests langfristig sehr viel, ähnlich wie schon kleine Sportübungen regelmäßig viel bringen können
Wie funktionieren automatisierte Tests?
- Es gibt eine Funktion für einen bestimmten Testfall
- Diese Funktion wird von einem Skript ausgeführt und auf die eigene App angewandt
- Dort werden dann bestimmte Checks/Vergleiche angewandt, wie UI-Events (Klick, Touch), on ein Element sichtbar ist, ob Farben oder Größen stimmen.
- Auch Abläufe durch eine App wie erst einloggen, dann Profilverändern, in die App navigieren, prüfen ob etwas angezeigt wird oder möglich ist, kann automatisiert als Testfall abgebildet werden
Wie würdest du eine Teststrategie für eine ganz einfache App, die CRUD also etwas erstellen, anzeigen, updaten und löschen anbietet, aufbauen wenn noch gar keine Tests existieren?
- Man muss mit einer Strategie herangehen und darf nicht wahllos testen
- Falls es sowas wie Spezifikationsdokumente (Design Output) gab, um die App selbst zu erstellen könnte man sich fachlich an dieser entlang hangeln und von den Themen dort (Profilseite, Hauptseite etc) anfangen diese pro Thema in einen “Testablauf/Testbereich” aufzuteilen, welcher dann viele kleine Tests nur für seinen Bereich in sich hat
- Die Testfälle testen ausschließlich die Funktionalität und sollten möglichst jede Nutzerinteraktion und jedes Feature welches auf jedem Testbereich verfügbar ist abdecken. Damit eine hohe Testabdeckung entsteht und nichts ungetestet bleibt
- Wenn es keine Spezifikation gibt, kann man sie pro Screen oder pro URL der Website entlanghangeln und jeweils Testfälle anlegen.
- Auch visuelle Dinge wie das Layout und Styling kann einzeln getestet werden. So kann man bei Webtechnologien über den DOM auf jedes einzelne Node/Element des Doms via Selektoren wie Klassenselektor, ID-Selektor, HTML-Selektor etc zugreifen. Aus dem Node/Element kann man alle Informationen ablesen, wie Breite, Höhe, Farben, Styling, Events(Klick, Touch, Press) oder auch ob es sichtbar ist.
Was ist CRUD?
- Etwas was fast jede App anbietet
- Create (Dinge in der App erstellen und in Datenbank speichern, wie Account erstellen)
- Read (Dinge in der App anzeigen aus Datenbank wie Name anzeigen)
- Update (Dinge in der App aktualisieren und in Datenbank überschreiben wie Nutzername ändern)
- Delete (Dinge in der App löschen und in Datenbank löschen wie Account löschen)
Wie kann man Elemente/Nodes aus dem DOM selektieren?
- Mit verschiedenen Selektorn (Klasse, ID, HTML-Tag etc)
- Man hat dann vollen Zugriff auf alle Informationen die der Browser auch dazu hat, um diese anzuzeigen. Also Styling, Sichtbarkeit, gewisse Funktionen können darauf angewandt werden.
Wo werden SessionDaten also Infos über eingeloggte User in einer App gespeichert und wo kann man diese testen?
- Oftmals werden der sessionStorage oder localStorage genutzt
- Dort werden auch oft Cookies abgelegt oder JWT-Tokens welche der Beweis für den erfolgreichen Login sind
- Diese kann man via Cypress/Playwright auslesen und gucken ob diese beispielsweise vorhanden sind nachdem ein login geschehen ist. Damit für man die Login-Funktionalität prüfen auf ihre Technik.
- Man könnte auch einfach einen Text in der App via DOM abfragen, wie “Hallo, Nutzer …”. Dann testet man aber eher ob dieser Text nach dem Login angezeigt wird. Und es kann auch einen Bug geben, dass der Text angezeigt wird obwohl keine Session gespeichert wurde. Daher sollte man diesen technischen Login-Test und den Visuellen Login-Test der evtl eine React Component Testet trennen.
Welche Vorteile hat automatisiertes Testen gegenüber manuellem Testen?
- Es findet Bugs sehr früh und schnell (In der Pipeline nachdem ein Entwickler neuen Code committed/pusht)
- Es ist kostengünstiger, da Dinge nicht immer wieder erneut per Hand durchgetestet werden müssen (Regressionen)
- Es beschleunigt die Entwicklung da sich weniger Fehler einschleichen die erst später gefunden werden und schon neuer Code auf den fehlerhaften Code aufbaut.
Was ist Spezifität in CSS?
- Spezifität beschreibt die Wichtigkeit eines angewandten Stylings in CSS
- Wichtiger Styling überschreiben unwichtigere Stylings
- Wenn man in einer Library z.B. eine .login-button Klasse definiert mit einem styling und in der app auch eine eigener .login-button Klasse erstellt wird kann es zu Styling-Problemen kommen da unerwartet eines von beiden das andere überschreibt
- Dafür gibt es feste Regeln !important überschreibt alles, HTML IDs überschreiben Klassennamen, Klassennamen die später im CSS geladen werden als andere überschreiben die vorherigen (Cascading/Kaskadierend, wie ein Wasserfall CSS = Cascading Style Sheets)
Wie kann man Spezifität in CSS sicher handlen, so dass sich nichts überschreibt?
- Entweder man verwendet wirklich einzigartige Klassennamen. Das ist als Library aber schwer weil man keine Kontrolle über die App hat, welche die Library benutzt
- Oder man benutzt BEM (Block Entity Modifier) als CSS Klassennamen Bennenungsverfahren (
.button .button\_\_text .button\_\_text--disabled
- Oder man benutzt Scoped Modules wo bei jedem Erstellen einer Library/App an alle Klassennamen zufällige Hash-Werte herangehangen werden (.button_i9UzR) und eine app nicht den selben zufälligen Namen erstellen wird
Was sind Probleme mit Scoped Modules / Zufälligen Hashwerten die an Klassennamen im CSS rangehängt werden?
- Wenn man als Software-Tester Tests schreibt möchte man oft DOM-Elemente via Klassennamen selektieren.
- Jetzt haben die aber immer zufällige Namen, also gehen die Test nicht mehr verlässlich durch und finden jedesmal ihr richtiges Element
- Man kann mit spezielleren CSS Selektoren dieses Problem umgehen wie mit
[class^="button_"]
Damit wird nur der Anfang welcher nicht zufällig ist als Klassenname gesucht und was dahinter steht kann dann zufällig sein. Trotzdem wird das Element immer gefunden und die Tests gehen
Was ist der Unterschied in TypeScript/JavaScript zwischen == und === als Vergleichsoperator? Beispiel 2 == “2” und 2 === “2”
- Mit 2 == “2” kommt true also gleich heraus. Was problematisch sein kann, da eine Zahl 2 nicht das gleiche ist wie der String 2. (Herzschrittmacher)
- Mit 2 === “2” kommt false also nicht gleich heraus. Was korrekt ist. Daher immer === (3 fach) benutzen.
- Warum das mit == so ist, ist historisch so in der Programmiersprache entstanden. JavaScript möchte es für einen immer möglichst gleich machen. Es benutzt coercion (Automatische Umwandlung) Was aber problematisch ist.
Wie viele Threads hat JavaScript/TypeScript und was ist ein Thread?
- Ein Thread ist die Möglichkeit, dass ein Programm/App sich auf dem CPU aufteilt und parallel Aufgaben nebeneinander also gleichzeitig abarbeitet/bearbeitet
- TypeScript wird zu JavaScript transpiliert, also übersetzt damit der Browser es versteht und JavaScript kann nur auf einem 1 Thread laufen.
- JavaScript benutzt den EventLoop, in welchem wie in einem Kreis/Rennstrecke für Autos alle Codezeilen/Kommandos in einer Reihe abgearbeitet werden. Dabei kann es kleine Peformanceoptimierungen vornehmen und manche Aufgaben bevorzugen und manche nochmal den EventLoop durchlaufen lassen. So versucht es Threads nachzuahmen, kann aber niemals so stark sein wie echtes gleichzeitiges abarbeiten.
- Allerdings gibt es in JavaScript “ServiceWorker” die teilen eine App in mehrere kleine Apps auf. Dann hat zwar immer noch jede Teilapp einen Thread, aber die einzelnen Apps lassen sich auf verschiedene Threads des CPU laufen lassen und können untereinander Rechenergebnisse/Kommandos nach Priorität umverteilen. Damit kann man so ziemlich das gleiche erreichen wie mehrere Threads es in fast allen Programmiersprachen können. Ist aber schwieriger zu programmieren.
Was ist in React eine View, ein Container und eine Component?
- Components sind dumme wiederverwendbare Blöcke. Wie kleine Legosteine. Alle Logik sie die ausführen und alle Daten die sie bekommen um etwas anzuzeigen erhalten sie via Props und werden also wie Marionetten gesteuert.
- Container in React können komplexere Logik beinhalten und sich zu soetwas wie globalen Statemanagement verbinden. (Redux, Zustand etc). Sie kontrollieren anhand ihrer Logik die dummen Components.
- Views sind noch größere Dinge in React, welche mehrere Container beinhalten können. In früherer IT-Sprache würde man Masken/Screens/Pages sagen.
Wofür braucht man ein globales StateManagement in Web Frontends/React?
- Immer wenn wir in verschiedenen Components/ganz tiefen Teilbereichen einer App, wie einem Button der aber an vielen Stellen benutzt wird auf die gleichen Daten zugreifen wollen, ist es klug die Variable nur einmal in der App zu haben.
- Ansonsten hat man Probleme, dass man eine Variable hier nicht aktualisiert, die andere Schon oder sie asynchron also nicht gleichzeitig Daten speichern.
- Mit einer zentralen Stelle wo wichtige Daten für die ganze App liegen, wie z.B. den Nutzerdaten eines eingeloggten Nutzers (Name, Rolle im System, username, Profilbild etc) kann man das dann in der ganzen App anzeigen lassen und muss nur eine Stelle updaten/verändern.
Welche Technologien gibt es für globales Statemanagement in React?
- React Redux - was von React selber ist und mittels Actions und Observables arbeitet. Observables sind sowas wie Aktionen welche durch die App fließen und von gewissen Zuhörern/Listenern (In Redux heißen die Epics) getriggert werden können. Wichtig ist hier, das es passiv passiert. Also man ruft nicht den Zuhöhrer wie eine Funktion auf, sondern er hört einfach zu und wird dann selber aktiv.
- Zustand - Ist eine kleinere leichtete Variante als Redux. Kann nicht so viel aber hat weniger Code den man schreiben muss.
Was ist MQTT als Protokoll?
- MQTT ist ein Protokoll mit dem oftmals IoT-Geräte, also kleine, schwache und günstige Geräte kommunizieren können. Sie verbinden sich zu einem “Broker” die alle Kommunikation wie eine Poststelle abarbeitet und managed. Über diesen können sie wie in WhatsApp Chaträumen miteinander Daten austauschen und Sprechen. Man kann also so ein Backend mit einem Frontend verbinden. Hier gibt es weniger Mechanismen wie Frage/Antwort sachen. Sondern man schickt einfach Daten/Messages raus.
- Andere Alternativen wären REST, welches im Webbereich sehr viel üblicher ist. Da wird mittels HTTP-Requests miteinander geredet. Es gibt ein Frage-Antwort Verfahren und man schickt JSON-Daten hin und her und kann HTTP-Status-Codes als Erfolg/Error schicken. Wie 404 not found etc.
Was ist der DOM?
- Document Object Model
- Eine Art Baumstruktur worüber jeder Browser und jede Internetseit aufgebaut ist
- React kann mit einem Virtual Dom (VDom) der quasi eine Kopie als Datei/Objekt davon ist, kleinere Veränderungen, wie nur das Neufärben eines Buttons erkennen und den Baum so viel besser updaten, so dass nicht die gesamte Seite neu lädt, sondern nur der eine Button als Node/Element im DOM.
- Echte DOM Updates im Browser sind teuer und können das Neuladen einer Seite erfordern, was heutzutage nicht mehr die Erwartung von Nutzern ist.
Was ist der Unterschied zwischen den CSS Einheiten px und rem?
- px ist eine feste Einheit, es stellt einen Pixel auf dem Bildschirm dar.
- rem ist eine Einheit, welche in bisschen flexibler ist. Sie ist die größe des Buchstabens m auf dem root Element der App und damit auch fest. Kann aber auch an dieser Root-Stelle in der App geändert werden und alles rem skalieren dann gleichmäßig mit. Die gesamte App wird größer. Sowas brauchen Leute mit Behinderung da wird ein Screen-Reader/Extension den Wert erhöhen, damit sie die App besser lesen können. Man sollte lieber rem als em nutzen.