SECTOR NORD AG Tipp des Monats


End2End / API Tests mit Cypress

von Martin Haubold

Cypress - www.cypress.io - wurde 2017 als Testtool für Web- und API-Anwendungen unter der MIT-Lizenz entwickelt. Cypress ist ein vielfältiges Framework um Endpunkte oder Webseiten zu prüfen/monitoren. Sehr schön und sehr praktisch an Cypress ist die Vorschaufunktion. Sie macht Abläufe transparent und hilft Fehler zu vermeiden (siehe auch https://www.cypress.io/videos/home_page.mp4).

Kernaufgaben:

  • End-to-End
  • Component
  • Integration
  • Unittests

Cypress ist für alle großen Plattformen wie Windows, Linux oder macOS verfügbar.

Unser Beispiel / Anwendungsfall > Anmeldung am ServiceDesk Znuny:

  1. Öffne eine Webseite vom Ticket System
  2. Melde dich, als Benutzer "monitoring" an.
  3. Melde dich ab.

Die Cypress-Checks werden in Java oder Typescript geschrieben und in einem Chrome, Firefox oder Electron Browser ausgeführt. Nach erfolgreichem Testen der Anwendung bekommen wir eine Zusammenfassung angezeigt, die angezeigte Laufzeitmessung können wir mit dem NSCA in unsere Monitoring-Lösung SNAG-View senden.

Wir nutzen "Docker/Podman" um die Tests auszuführen, dafür haben wir ein "kleines Script" geschrieben. Wir starten das Script über den "CRON" alle 5min und senden uns die Zeit als passiven Service ins SNAG-View.

#!/bin/bash
execute=`docker run --rm -v /root/install/e2e/znuny:/e2e -w /e2e cypress/included:5.6.0 |tail -n2 |head -n1`
 
if [[ $execute == *"All specs passed!"* ]]; the
    # Mit AWK und SED die zeit auslesen: ###
    times=`echo "$execute" |awk -F'!' '{print $2}'`
    times=`echo "$times" |awk -F' ' '{print $2}'`
    echo "$times" > /tmp/_txt1
    tr -cd '\11\12\15\40-\176' < /tmp/_txt1 > /tmp/_txt2
    times=`cat /tmp/_txt2`
    times=`echo $times |sed 's/\[90m\|\[39m//g'`
    min=`echo "$times" |awk -F':' '{print $1}'`
    sec=`echo "$times" |awk -F':' '{print $2}'`
    seconds=$((min*60+sec))
 
    # NSCA Nachricht für SV vorbereiten:
    msg="OK: Login is possible|time=${seconds}s;30;45;0;"
    msg="E2E,TICKETSYSTEM,0,$msg\n"
else
    # NSCA Nachricht für SV vorbereiten:
   msg="CRITICAL: Login is not possible|time=0s;30;45;0;"
    msg="E2E,TICKETSYSTEM,1,$msg\n"
fi
    # Senden der Nachricht mit NSCA
    echo "$msg" | /var/lib/nagios/libexec/eventhandlers/send_nsca -H localhost -p 5667 -c /var/lib/nagios/send_nsca.cfg -d ,

Beispiel:

 

Znuny login

    ✓ finds the content "type" (3031ms)

 

 

  1 passing (3s)

 

 

  (Results)

 

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐

  │ Tests:        1                                                                                │

  │ Passing:      1                                                                                │

  │ Failing:      0                                                                                │

  │ Pending:      0                                                                                │

  │ Skipped:      0                                                                                │

  │ Screenshots:  0                                                                                │

  │ Video:        true                                                                             │

  │ Duration:     3 seconds                                                                        │

  │ Spec Ran:     spec.js                                                                          │

  └────────────────────────────────────────────────────────────────────────────────────────────────┘

 

 

  (Video)

 

  -  Started processing:  Compressing to 32 CRF

  -  Finished processing: /e2e/cypress/videos/spec.js.mp4                                 (1 second)

 

 

====================================================================================================

 

  (Run Finished)

 

 

       Spec                                              Tests  Passing  Failing  Pending  Skipped

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐

  │ ✔  spec.js                                  00:03        1        1        -        -        - │

  └────────────────────────────────────────────────────────────────────────────────────────────────┘

    ✔  All specs passed!                        00:03        1        1        -        -        -

describe('Znuny login', function() {
 
  it('finds the content "type"', function() {
    cy.viewport('macbook-16')
    cy.visit('https://ticket.example.com')
    cy.contains('Powered by Znuny')
 
    cy.get('form').within(($form) => {
      cy.get('#User').type('monitoring')
      cy.get('#Password').type('superGeheimesKennwort42')
 
        cy.server()
        cy.route({ method: 'POST', url: '/otrs/index.pl' }).as('login');
 
 
      cy.get('#LoginButton').contains('Login').click()
        cy.wait('@login').then(function (xhr) {
            console.log(xhr)
            expect(xhr.status).to.equal(200)
        })
    })
 
                cy.get('.UserAvatar > a > img').click()
        cy.get('#LogoutButton').click()
 })
})