Web tesztelés

A Cypress

A Cypress egy NodeJS-ben írt tesztelési keretrendszer. A futtatásához ezért a NodeJS-t kell először telepíteni. Ez a https://nodejs.org/en/download/ oldalról tölthető le.

Egy teszt készítéséhez először egy munkakönyvtárat érdemes létrehozni, majd abba telepíteni a Cypress-t:

mkdir webtest
cd webtest
npm install cypress --save-dev

A cypress elindítása az alábbi módon történik:

node_modules\.bin\cypress open

Egy Cypress teszt „csontváza” az alábbi:

describe('localhost:8080', () => {
    it('localhost:8080', () => {
          cy.visit('localhost:8080')
    })
})

Példa

Első, kicsit összetettebb példánk egy hibás név-jelszó kombinációval történő Neptun bejelentkezést tesztel.

describe('Neptun test', () => {
  it('passes', () => {
    //
    cy.visit('https://neptun.uni-eszterhazy.hu')
    // A Hallgatóknak szövegre kattintunk
    cy.contains('Hallgatóknak').click()
    // Megkeressük azt az elemet, amelynek id-je a linkStudentvolt szöveg,
    // eltávolítjuk az új ablak nyitásának paraméterét,
    // és rákattintunk.
    cy.get('a[id="linkStudentvolt"]').invoke('removeAttr', 'target').click()
    cy.get('input[id=user]').type('ABC123')
    cy.get('input[id=pwd]').type('alma')
    cy.get('input[id=btnSubmit]').click()
    cy.contains('Érvénytelen').should('be.visible')
  })
})

Példa

Egy egyszerű python Flask applikáció:

from flask import Flask
app = Flask(__name__)

@app.route('/')
@app.route ('/index')
def index():
return ('''
    Hello, this is the index page.<br>
    <a href="/greetings/feri">SayHello</a><br>
    <a href="/form">Form</a>
    ''')

@app.route('/greetings/<name>')
def greetings(name):
    return (f'Hello, {name}!')

@app.route('/form')
def form():
    return ('<input type="text" id="name">')

app.run(
    debug=True,
    port=5004
)

Ennek egyszerű tesztje:

describe('Flask Demo Test', () => {
  it('passes', () => {
    cy.visit('http://localhost:5004')

    // Test greetings link
    cy.contains('SayHello').click()
    cy.get('body').contains('feri')

    cy.visit('http://localhost:5004/form')
    cy.get('input[id=name]').type('Kiss Lajos')

  })

})

Feladat:

  1. Egy másodfokú egyenlet megoldását végző website konténerizált változatát a Dockerhub a koczkaferenc/cypresstest:1 konténere tartalmazza. Töltsd le és indítsd el a docker run -it --rm -p 8080:80 koczkaferenc/cypresstest:1 paranccsal!

  2. Teszteld a működőképességét a http://localhost:8080 weboldal megnyitásával!

  3. Készíts egy tesztet, amely megnyitja ezt az oldalt! Használd ehhez a fenti „csontvázat”!

  4. Mivel a tesztelendő website első változata már a megnyitáskor hibát jelez, állítsd le a konténert, és használd a 2-es verziót! (docker run -it --rm -p 8080:80 koczkaferenc/cypresstest:2)

  5. Készítsd el a website első oldalán látható utasítások alapján a program tesztelését! Egy lehetséges megoldás az alábbi, de további cicomázások is végezhetők.

describe('localhost:8080', () => {
  it('localhost:8080', () => {
    cy.visit('localhost:8080')
    cy.wait(500)
    cy.contains('Másodfokú egyenlet').click()

    // 1 ---------------------------------------
    // A Megoldás szövegnek nem szabad látszania
    cy.get('div[id=solutionblock]').should('not.be.visible')

    cy.get('input[id=var-a]').type('1')
    cy.get('input[id=var-b]').type('6')
    cy.get('input[id=var-c]').type('8')
    cy.contains('Megoldás').click()

    // Meg kell jelennie a Megoldás szövegnek és a megoldásnak
    cy.get('div[id=solutionblock]').should('be.visible')
    cy.get('div [id=solutionblock]').contains('Mivel D, az egyenletnek két gyöke van: -2 és -4.')

    // Alaphelyzet
    cy.contains('Alaphelyzet').click()

    // 2 ---------------------------------------
    // A Megoldás szövegnek nem szabad látszania
    cy.get('div[id=solutionblock]').should('not.be.visible')

    cy.get('input[id=var-a]').type('1')
    cy.get('input[id=var-b]').type('-14')
    cy.get('input[id=var-c]').type('49')
    cy.contains('Megoldás').click()

    // Meg kell jelennie a Megoldás szövegnek és a megoldásnak
    cy.get('div[id=solutionblock]').should('be.visible')
    cy.get('div [id=solutionblock]').contains('Mivel D=0, az egyenletnek egy gyöke van: 7.')

    // Alaphelyzet
    cy.contains('Alaphelyzet').click()

    // 3 ---------------------------------------
    // A Megoldás szövegnek nem szabad látszania
    cy.get('div[id=solutionblock]').should('not.be.visible')

    cy.get('input[id=var-a]').type('1')
    cy.get('input[id=var-b]').type('6')
    cy.get('input[id=var-c]').type('8')
    cy.contains('Megoldás').click()

    // Meg kell jelennie a Megoldás szövegnek és a megoldásnak
    cy.get('div[id=solutionblock]').should('be.visible')
    cy.get('div [id=solutionblock]').contains('Mivel D, az egyenletnek két gyöke van: -2 és -4.')

    // Vissza a főoldalra
    cy.contains('Feladat').click()
    cy.location('href').should('eq', 'http://localhost:8080/?c=0')

    // Vissza a főoldalra
    cy.contains('a', 'Ellenőrzés megkezdése').click()
    cy.location('href').should('eq', 'http://localhost:8080/?c=1')

  })
})

A teljes dokumentáció ezen az oldalon érhető el: https://docs.cypress.io/guides/end-to-end-testing/writing-your-first-end-to-end-test#Add-a-test-file

Selenium

A Selenium tesztekhez le kell tölteni az adott böngészőhöz tartozó drivert, ezért példáinkban a Chrome-ot használjuk. A driver elérhető a https://chromedriver.chromium.org/downloads webhelyen.

A Chromedriver letöltése

A web tesztelést egy hasonló feladaton keresztül végezzük el. Ehhez a Python selenium moduljára is szükség lesz, ezért a pyCharm-ban a munka megkezdése előtt ezt a csomagot a projekthez hozzá kell adnod. Ehhez válaszd ki a File > Settings > Project menüben a Python Interpreter lapot, és a + megnyomásával add hozzá a listából a Selenium csomagot. Ez után már megírhatod a tesztelést végző programot.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome(executable_path=r"/Users/koczka.ferenc/Downloads/chromedriver")
driver.get("http://localhost:8080")

login = driver.find_element(By.NAME, "login")
login.clear()
login.send_keys("admin")

passw = driver.find_element(By.NAME, "password")
passw.clear()
passw.send_keys("*****************")

submit = driver.find_element(By.NAME, "submit")
submit.click()

# Domain kiválasztása

driver.get("http://localhost:8080/?module=cISP&c=cPanel")
domain_select_element = driver.find_element(By.NAME, 'domain')
select_object = Select(domain_select_element)
select_object.select_by_visible_text('linux-szerver.hu')

submit = driver.find_element(By.NAME, "submit")
submit.click()

# E-mail címek kiválasztása
driver.get("http://localhost:8080/?module=cISP&c=mailList")

driver.get("http://localhost:8080/?module=cISP&c=mailForm&username=cert-oc")