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:
.. code-block:: console
mkdir webtest
cd webtest
npm install cypress --save-dev
A cypress elindítása az alábbi módon történik:
.. code-block:: console
node_modules\.bin\cypress open
Egy Cypress teszt "csontváza" az alábbi:
.. code-block:: console
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.
.. code-block:: javascript
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ó:
.. code-block:: console
from flask import Flask
app = Flask(__name__)
@app.route('/')
@app.route ('/index')
def index():
return ('''
Hello, this is the index page. SayHello Form
''')
@app.route('/greetings/')
def greetings(name):
return (f'Hello, {name}!')
@app.route('/form')
def form():
return ('')
app.run(
debug=True,
port=5004
)
Ennek egyszerű tesztje:
.. code-block:: console
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:
----------
#. 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 :command:`docker run -it --rm -p 8080:80 koczkaferenc/cypresstest:1` paranccsal!
#. Teszteld a működőképességét a :envvar:`http://localhost:8080` weboldal megnyitásával!
#. Készíts egy tesztet, amely megnyitja ezt az oldalt! Használd ehhez a fenti "csontvázat"!
#. 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! (:command:`docker run -it --rm -p 8080:80 koczkaferenc/cypresstest:2`)
#. 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.
.. code-block:: console
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.
.. image:: images/chromedriver.png
:alt: A Chromedriver letöltése
:align: center
A web tesztelést egy hasonló feladaton keresztül végezzük el. Ehhez a Python :envvar:`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 :envvar:`File` > :envvar:`Settings` > :envvar:`Project` menüben a :envvar:`Python Interpreter` lapot, és a :envvar:`+` 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.
.. code-block:: console
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")