Poniżej znajduje się spis pojęć, których używamy podczas kursu z podziałem na lekcje i kurs

Część 1:

Lekcja: Krótko o narzędziach których potrzebujemy

IDE
Python
Selenium
PyCharm

Lekcja: Tworzymy projekt

ChromeDriver

Lekcja: Pierwszy kod – pojawia się Selenium

moduły
pakiety

Lekcja: Drugi kod – korzystamy z modułu WebDriver

zmienna
funkcja wbudowana
r (jako prefix przed napisem)

Lekcja: Warunek pozytywnego zakończenia testu

instrukcja
instrukcja assert

Lekcja: Test który nie przechodzi

driver.close() vs. driver.quit()
traceback
stacktrace

Część 2:

Lekcja: Konfiguracje uruchomieniowe w PyCharm

konfiguracja uruchomieniowa w PyCharm

Lekcja: Refaktoryzacja – oczyszczanie kodu

refaktoryzacja kodu
setUp
tearDown
setUpClass
tearDownClass

Część 3:

Lekcja: PyCharm scratches – czyli jak szybko sprawdzić działanie kawałka kodu

PyCharm Scratches
PyCharm Test Runner
Uruchamianie kodu testów bez TestRunnera
Test Runner

Lekcja: Dobry print – czyli czytelne komunikaty na konsoli

arg
argumenty funkcji
literał
logowanie
parametry funkcji
prefiks
typ wbudowany

Lekcja: Kolejny refaktor – jedziemy z polerowaniem kodu

log
XPath

Lekcja: Przeglądarka i kod strony

atrybuty HTML
HTML
serwer

Lekcja: XPath i wyszukiwanie elementów strony

XML
XPath
cheat sheet

Robimy testy uzbrojeni w XPath

dziedziczenie
Smoke testy
typ boolowski/logiczny
URL
utrzymywalność kodu
wyjątek

XPath w Pythonie – połączmy to wszystko razem

dokumentacja funkcji
feedback
predefiniowane wartości

Część 4:

Lekcja: Refactor i własne moduły

None
PEP
return

Lekcja: Struktury i Instrukcje

referencja
struktura
typy prymitywne
iteracja

Lekcja: Test Suite

Sanity testy

Lekcja: Raport z testów

CI/CD
konsola systemowa
PIP
Terminal w PyCharm
zmienna środowiskowa
zmienna środowiskowa PATH

Lekcja: Istrukcja if – stan ma znacznie

negacja

Lekcja: Własna metoda do czekania

okienko modal
substring
testy wydajnościowe

Część 5:

Lekcja: Zrzuty ekranu – jak to robić dobrze podczas testów GUI

wzorce projektowe
wrapper
rzutowanie

Słownik


akcja naprawcza w PyCharm – TODO


arg – parametr funkcji, który oznacza, że można wstawić dowolną liczbę argumentów TODO przykład


argumenty funkcji – to wstawiana przez nas wartość w miejsce parametrów funkcji. Przykładowy funkcja z dwoma parametrami:

def add_numbers_and_print(number_one, number_two):
     print(number_one + number_two)

W powyższym przykładzie number_one oraz number_two są parametrami funkcji.

Użycie parametrów funkcji add_numbers_and_print z podaniem nazwy parametru i jego wartości:
add_numbers_and_print(number_one=10, number_two=24)

Bezpośrednie podanie wartości:

add_numbers_and_print(10, 24)

W powyższych przykładach 10 oraz 24 są argumentami funkcji.

Argumenty funkcji są ściśle związane z parametrami funkcji.


atrybuty – to pola danego obiektu, które mogą posiadać jakąś wartość, definiują jaki jest nasz obiekt. W odróżnieniu od funkcji, które definiują zachowania naszego obiektu. np. mając obiekt burek (stworzony z klasy Pies):
atrybut burek.waga zwróci nam 10kg a już burek.skacz() będzie jakąś akcją czyli funkcją


atrybuty HTML – tak samo jak atrybuty opisane powyżej, są to pola jakiegoś obiektu, w tym przypadku HTML. Dla przykładu dla elementu HTML typu div czyli zamkniętego w znacznikach <div></div> jego atrybutem mogą być class, style lub id. Atrybuty HTML w kodzie wyglądają tak:

<div id="logo-link" class="logo"></div>


cheat sheet – rodzaj ściągi która w szybki sposób pomaga nam zorientować się w najważniejszych tematach, wzorach z danej dziedziny. Przykładem może być nasze mini kompendium z XPath https://jaktestowac.pl/xpath-sciaga/ lub z Pythona https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PythonForDataScience.pdf


checkbox – element w interfejsie graficznym programu który można zaznaczyć lub odznaczyć w celu zaakceptowania danej opcji, standardowo ma postać małego kwadratu, zazwyczaj w przypadku większej ilości checkoboxów, możemy zaznaczyć/odznaczyć checkbox dowolnie niezależnie od stanu innych checkboxów. Więcej przeczytasz na:
http://how2html.pl/checkbox-html/


ChromeDriver – plik uruchomieniowy (dla systemu Windows z rozszerzeniem .exe) potrzeby aby Selenium mogło komunikować się z daną przeglądarką – w tym przypadku Chrome. Wersja pliku ChromeDriver jest mocno związana z wersją przeglądarki Chrome więc może wymagać częstego uaktualniania ( w świetle tego, że zazwyczaj chcemy mieć zaktualizowaną przeglądarkę)


CI/CD – z ang.:

  • Continuous Integration czyli Ciągła Integracja,
  • Continuous Delivery czyli Ciągłe Dostarczanie,
  • Continuous Deployment czyli Ciągłe Wdrażanie.

Continuous Integration – proces polegający na automatyzacji procesu wytwarzania aplikacji. Do tego procesu używane są narzędzia typu Jenkins, TeamCity, Bamboo itp. Jak to wygląda w praktyce? Po umieszczeniu zmian w kodzie na repozytorium (czyli wykonaniu commit/merge) zostaje uruchomiony automatyczny proces, który zawiera:

  • kompilacji kodu,
  • statycznej analizy kodu,
  • testów jednostkowych,
  • testów integracyjnych,
  • pozostałe typy testów, które można zautomatyzować.

Po pomyślnym ukończeniu całego procesu nasza aplikacja prawdopodobnie może być dostarczona klientowi.

Continuous Delivery oraz Continuous Deployment są podobnymi procesami, które polegają na automatyzacji całego przepływu – od wprowadzenia zmian w kodzie, przez uruchomienie testów aż po wdrożenie na produkcję.
W Continuous Deployment wdrożenie na produkcję następuje automatycznie, natomiast w Continuous Delivery wdrożenie na produkcję następuje manualnie – manualnie oznacza w tym przypadku np. poprzez naciśnięcie odpowiedniego przycisku. Pozwala to zachować pewien rodzaj kontroli, gdyż w przypadku Continuous Deployment, gdzie wszystko dzieje się automatycznie, trzeba mieć zautomatyzowany pełen zestaw narzędzi (testy integracyjne, wydajnościowe, security), aby być pewnym, ze to co dostarczamy klientowi jest wystarczająco dobrej jakości. Więcej możecie poczytać pod adresem Continuous integration vs. continuous delivery vs. continuous deployment.


Code Reviewprzegląd kodu albo Inspekcja kodu, jest to praktyka polegająca na przeglądaniu kodu napisanego przez programistę przez inną osobę, którą nazywamy recenzentem (ang. reviewer). Praktyka ta pozwala wykryć różnego typu błędy, które mogły zostać popełnione podczas pisania kodu, a co za tym idzie – poprawić jakość oprogramowania.
Code Review powinno być wykonywane także dla kodu testów, które są pisane przez zespół testerów/QA.


dekorator – w Pythonie służy do wymuszenia wykonania dodatkowego kodu, który może ale nie musi być związany z dekorowaną funkcją. Dekorator może całkowicie przysłonić daną funkcję lub ją rozszerzyć. Dekorator dodaje się do funkcji przed jej definicją, wraz ze znakiem @ na początku i nazwą dekoratora.

Przykładowa implementacja i użycie dekoratora dodającego text do wywołanej funkcji.

#deklaracja dekoratora
def super_text_decorate(func):
  def func_wrapper(text):
      #dodanie tekstu
      print("Hello ")
      #użycie funkcji dekorowanej
      func(text)
  return func_wrapper

#użycie dekoratora 
@super_text_decorate
def print_name(name):
  print("Name: " + name)

@super_text_decorate
def print_surname(surname):
  print("Surname: " + surname)

#wywołanie udekorowanych funkcji 
print_name("Przemo")
print_surname("Kowalski")

I wynik po uruchomieniu pliku z powyższym kodem:

Hello
Name: Przemo
Hello
Surname: Kowalski

dokumentacja funkcji – najedź kursorem na metodę a następnie użyj skrótu Ctrl + Q – wyświetlona zostanie dokumentacja danej metody:


driver.close() vs. driver.quit() – są to dwie metody, służące do zamykania przeglądarki. Różnią się jednakże dosyć istotnym szczegółem, co sprawia, że w zależności od sytuacji ich działanie jest inne.

driver.close() – służy do zamykania jedynie tego okna przeglądarki, na którym jest focus. Podczas tworzenia testów, jeśli z jakiegoś powodu otwartych jest więcej okien lub kart w przeglądarce, to zamknięte zostanie tylko to okno, które jest aktywne podczas wykonywania metody close().
driver.quit() – służy do zniszczenia instancji Webdrivera – zamknięte zostaną wszystkie okna i karty, które są zależne od danej instancji Webdrivera, oraz sesja przeglądarki zostanie poprawnie zakończona.

Przykładowy kod obrazujący zachowanie close() oraz quit():

from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe")
driver.get("http://www.google.com/")
# open new tab using js script:
driver.execute_script('window.open("http://www.bings.com/","_blank");')
# lets wait few seconds to see the both tabs:
time.sleep(2)
# use close() to close only first tab:
driver.close()

W powyższym przypadku przeglądarka nadal będzie otwarta z kartą http://www.bings.com/.

from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe")
driver.get("http://www.google.com/")
# open new tab using js script:
driver.execute_script('window.open("http://www.bings.com/","_blank");')
# lets wait few seconds to see the both tabs:
time.sleep(2)
# use quit() to close whole browser:
driver.quit()

W powyższym przypadku przeglądarka zostanie zamknięta poprawnie, bez względu na liczbę otwartych kart.


dziedziczenie – TBD


feedback – ocena, w której zawarte są zarówno strony pozytywne jak i negatywne. Ocena ta ma prowadzić do uniknięcia tych samych błędów w przyszłości oraz rozwoju umiejętności. Więcej o samym mechanizmie feedbacku możesz przeczytać np tu http://akados.pl/blog/2015/05/co-to-jest-feedback/


funkcja – fragment kodu, któremu nadano nazwę i który można wykonać poprzez podanie jego nazwy. Przykład funkcji do dodawania, która jako parametry przyjmuje dwie liczby:

def add_two_numbers(number_1, number_2):
    result = number_1 + number_2
    print(result)

I przykład jej użycia z argumentami 1 oraz 2

add_two_numebrs(5, 3)

Wykonanie tej funkcji zwróci na konsolę wynik dodawania.

8

funkcja wbudowana – to taka funkcja, którą możemy uruchomić bez potrzeby importowania czy instalowania dodatkowych rzeczy. Kod dla funkcji jest dostarczany wraz z językiem programowania. W przypadku Pythona wystarczy, że wpiszemy nazwę takiej funkcji i jest ona gotowa do użytku. Np. funkcja print()

print("To tekst który chcę aby pojawił się na konsoli")

GUI – (ang. Graphical User Interface) to skrót od Graficzny Interfejs Użytkownika czyli warstwy prezentacji programu, z którym użytkownik wchodzi w interakcję. W testerskim rozumieniu jest to zazwyczaj wszystko co jest dostępne na stronie internetowej (bardzo rzadko program stacjonarny) z poziomu standardowego użycia. Testy tej warstwy potwierdzają poprawność działania funkcji jakie ma spełniać dana strona www.


HTML – Język HTML to zestaw znaczników, które zawierają w sobie treść np wyświetlany tekst, głównie wykorzystywany do tworzenia stron internetowych.


IDE – integrated development environment – zintegrowane środowisko programistyczne, narzędzie do szybkiego pisania i uruchamiania kodu np: PyCharm


inputbox – element strony internetowej służący do wprowadzenia znaków (np. jest to element w którym wpisujemy wyszukiwaną frazę w Google) Występuje kilka różnych typów input box:
text-field – czyli standardowe pole do wpisywania loginu przy logowaniu się do aplikacji
password-field – pole wpisywania hasła posiadające możliwość ukrywania wpisanego tekstu
text-area – pole służące do wpisywania długiego wielolinijkowego tekstu, często posiadające często możliwość powiększania lub zmniejszania przez użytkownika pola


instancja – nowe okno danego programu, np: otworzenie dwóch okien przeglądarki Chrome oznacza, że posiadamy dwie instancje tego programu w których możemy dokonać niezależnych akcji oraz zamknąć je w dowolnej kolejności.


instrukcja – (ang. statement) jest reprezentacją akcji, która zostanie wykonana na przekazanej do niej zmiennej np. import Selenium gdzie import jest instrukcją a Selenium wyrażeniem, które do niej przekazujemy. Instrukcje są wbudowane w język Python i dlatego ich nazwy są zastrzeżone, dlatego nie możemy tak nazywać naszych zmiennych. Instrukcje dzielą się na proste (import, assert, więcej znajdziesz w oficjalnej dokumentacji https://docs.python.org/3/reference/simple_stmts.html) i złożone (for, if, więcej znajdziesz w oficjalnej dokumentacji https://docs.python.org/3/reference/compound_stmts.html). Przykład złożonej instrukcji:

for item in ['Milk', 'Apple', 'Water']:
    print(item)

instrukcja assert – wbudowana instrukcja, która słóży do sprawdzenia czy dane wyrażenia są ze sobą zgodne (lub nie) przez porównanie lub zaprzeczenie np:

person1_name = "Ania"
person2_name = "Ala"
assert person1_name == person2_name

Kod programu zostanie przerwany jeśli wykonanie instrukcji assert zakończy się niepowodzeniem.


integer – (w skrócie int) jest to typ danych będących liczbami całkowitymi (takie bez przecinka 😛 ) dla których możliwe są operacje matematyczne takie jak dodawanie, odejmowanie czy mnożenie:

 
#deklaracja zmiennej o typie int
age = 0
first_birthday = 1 + age
print(first_birthday)
second_birthday = 1+ first_birthday
print(second_birthday)

iteracja – wykonanie określonej ilości razy tej samej instrukcji. Najczęstszym przykładem iteracji jest wykonanie pętli for na obiekcie, który zawiera kolekcję elementów

 
names = ['Ela', 'Ana', 'Ola']
for name in names:
    print(name)
# result
# 'Ela'
# 'Ana'
# 'Ola'

Obiekty, które mogą być poddane iteracji nazywamy iterowalnymi, czyli posiadającymi strukturę pozwalającą na przetwarzanie ich poszczególnych elementów.


Java – język programowania ogólnego zastosowania wykorzystywany najczęściej do tworzenia rozwiązań korporacyjnych (np. oprogramowanie dla instytucji finansowych) po stronie serwera. Zaletą programów napisanych w języku Java jest ich przenośność, czyli możliwość uruchomienia na dowolnym systemie (oczywiście z pewnymi obostrzeniami). Aby uruchomić program Java wymagane jest zainstalowanie środowisko uruchomieniowe Java zwane JRE (ang. Java Runtime Environment).


klasa – [TODO]


konfiguracja uruchomieniowa w PyCharm – konfiguracja ta jest automatycznie dodawana gdy uruchomimy plik lub testy w PyCharm. Poruszone to zostało w lekcji Konfiguracje uruchomieniowe w PyCharm. Możliwe jest ręczne tworzenie konfiguracji i planowana jest lekcja na ten temat


konsola python – jest to konsola uruchamiana np. w konsoli systemowej za pomocą polecenia python lub uruchamiana w środowisku IDE, np. PyCharm (uruchomisz konsolę wybierając z górnego menu Tools->Python Console…). Dzięki niej można wykonywać proste polecenia i importować biblioteki w języku Python. Więcej znajdziesz w lekcji Zestaw konsola, lista i for – Konsola Python


konsola systemowa – rodzaj programu, w którym za pomocą wpisywanych komend (specjalnych poleceń) możemy uzyskać informacje o systemie, oraz wykonać wiele akcji, które są dostępne przez graficzny interfejs (np: tworzenie i edycję plików oraz folderów). Więcej o konsoli wraz z przykładami znajdziesz w Konsola cheat sheet.


lista – struktura, która zawiera uszeregowaną listę elementów. Przykładem może być lista zakupów, gdzie elementami listy są obiekty typu string w języku Python shoppings = ['Apple', 'Water', 'Egg']. Dostęp do listy odbywa się za pomocą podania indeksu danego elementu shoppings[1] przy czym indeksy są liczone od 0 co oznacza, że aby dostać się do pierwszego elementu stosujemy shoppings[0]. Listy posiadają szereg zaimplementowanych funkcji np: shoppings.sort() do sortowania alfabetycznego lub numerycznego. Więcej odnajdziesz w oficjalnej dokumentacji https://docs.python.org/3/tutorial/datastructures.html#more-on-lists.


literał – TODO – https://pl.python.org/docs/ref/node9.html


logowanie – potoczne sformułowanie oznaczające wypisywanie różnego typu wiadomości (takich jak na przykład błędy) na konsoli albo zapisywanie ich do pliku.


log – wszystko co pojawia się na konsoli uruchomieniowej po wykonaniu kodu. Log zawiera automatyczne wiadomości programu oraz tekst, który autor kodu chce aby się w nich pojawił. Służą do sprawdzenia poprawności wykonywania programu oraz odszukiwania problemów w wykonywanym programie. Przykładowy log:
TODO


metodafunkcja umieszczona w danej klasie. Przykładowa definicja metody o nazwie add_two_numbers() w klasie AddNumbers():

class AddNumbers():
    
    def add_two_numbers(self, number_1, number_2):
        result = number_1 + number_2
        print(result)

Wywołanie metody wpisującej wynik na konsolę:

AddNumbers.add_two_numbers(1,2)

Jak można zauważyć metoda różni się wyłącznie od przykładowej funkcji parametrem self, który pozwala na użycie metody add_two_numbers() po wywołaniu nazwy klasy AddNumbers. Użycie odbywa się bez potrzeby podawania wartości dla parametru self.


moduły – w języku Python jest to plik z rozszerzeniem .py. Czyli jeśli stworzymy jakikolwiek plik z rozszerzeniem .py będzie on modułem, który możemy zaimportować używając komendy import


negacja – inaczej zaprzeczenie, jest to rodzaj porównania polegającego na zbadaniu odwrotności danego wyrażenia. Np. dla zmiennej age = 18 możemy zrobić porównanie age == 18 – zobaczmy to w konsoli:

>>> age = 18
>>> age == 18
True

A następnie sprawdzić negację tego porównania stosując konstrukcję z !

>>> age = 18
>>> age == 18
True
>>> age != 18
False

Czyli moglibyśmy przeczytać: różni się i zastosować tak:

>>> age = 18
>>> age == 18
True
>>> age != 18
False
>>> age != 17
True

none – wbudowany typ w Pythonie, który oznacza brak wartości


obiekt – jest to zbudowana w czasie uruchomienia programu konstrukcja, stworzona na podstawie jakiegoś wzoru, która posiada zestaw wartości i akcji dzięki czemu można się nią łatwo posługiwać i tworzyć jej kopie. Przykładowa deklaracja utworzenia i posługiwania się obiektem driver:

import unittest
from selenium import webdriver

#inicjalizacja obiektu
driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe")

#wykorzystanie metody obiektu       
driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')

#przypisanie do nowego obiektu wartości, którą posiada własność obiekt driver
title = driver.title

#wykorzystanie metody obiektu
driver.quit()
 

okienko modal – rodzaj wyskakującego okna prezentowanego w górnej części strony internetowej, bardzo często zawierającego elementy umożliwiające interakcje np. przyciski. Przykładowy modal (użyj przycisku Open Modal): https://www.w3schools.com/howto/howto_css_modals.asp


pakiety – w języku Python, pakiet jest folder, który zawiera pusty plik __init__.py oraz moduły (czyli pliki z rozszerzeniem .py) i/albo inne pakiety. Pakiety, podobnie jak moduły, możemy zaimportować używając komendy import. Plik __init__.py może być pusty i informuje on, że dany folder zawiera pakiet języka Python.


parametry funkcji – są to opisane elementy, które wymaga funkcja. Specjalnym typem parametru jest arg. Przykładowy funkcja z dwoma parametrami:

def add_numbers_and_print(number_one, number_two):
     print(number_one + number_two)

W powyższym przykładzie number_one oraz number_two są parametrami funkcji.

Użycie parametrów funkcji add_numbers_and_print z podaniem nazwy parametru i jego wartości:
add_numbers_and_print(number_one=10, number_two=24)

Bezpośrednie podanie wartości:

add_numbers_and_print(10, 24)

W powyższych przykładach 10 oraz 24 są argumentami funkcji – czyli wartościami podanymi w miejsce wymaganych parametrów.

Parametry funkcji są ściśle związane z argumentami funkcji.


PEP – ang. ‘Python Enhancement Proposals’, czyli w wolnym tłumaczeniu ‘Propozycje Usprawnień dla Pythona’, jest to ogólny zestaw reguł, zasad i praktyk, które pomagają w ujednoliceniu i poprawie czytelności kodu. Występuje wiele różnych PEPów, które rozróżniane są numerem, i które dotyczą różnych aspektów kodu. Warto zapamiętać PEP 8, który zawiera wytyczne dotyczące nazewnictwa, sposobu tworzenia zmiennych i ogólne wytyczne formatowania kodu.
Pełna lista PEPów dostępna jest pod adresem https://www.python.org/dev/peps/.


PIP – menadżer pakietów do języka Python pozwalający w prosty sposób pobierać i zarządzać pakietami. Aby z niego skorzystać wystarczy otworzyć konsolę i wpisać:

pip

Po jej wykonaniu dostaniemy odrobinę tematów pomocy i przykładowych parametrów:

Usage:
  pip  [options]

Commands:
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  check                       Verify installed packages have compatible dependencies.
  config                      Manage local and global configuration.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  hash                        Compute hashes of package archives.
  completion                  A helper command used for command completion.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be used up to 3 times (corresponding to
                              WARNING, ERROR, and CRITICAL logging levels).
  --log                 Path to a verbose appending log.
  --proxy              Specify a proxy in the form [user:passwd@]proxy.server:port.
  --retries          Maximum number of retries each connection should attempt (default 5 times).
  --timeout              Set the socket timeout (default 15 seconds).
  --exists-action     Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).
  --trusted-host    Mark this host as trusted, even though it does not have valid or any HTTPS.
  --cert                Path to alternate CA bundle.
  --client-cert         Path to SSL client certificate, a single file containing the private key and the
                              certificate in PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check Don't periodically check PyPI to determine whether a new version of pip is available for download. Implied with --no-index.
  --no-color                  Suppress colored output

Najczęściej używanymi komendami są:

  • pip list – wyświetla nam informację o wszystkich zainstalowanych pakietach oraz ich wersjach,
  • pip install xxx – instaluje pakiet o nazwie xxx,
  • pip uninstall xxx – usuwa pakiet o nazwie xxx.

Więcej na Installing Python Modules


predefiniowane wartości – a) na stronie internetowej stosuje się je przy wprowadzaniu danych np: w polach tekstowych, gdy wstępnie są one wypełnione za użytkownika, najczęściej są to pola w których pojawia się oczekiwana wartość np. kraj pochodzenia dla polskojęzycznych stron 90% użytkowników wypełni Polska więc w polu tekstowym może pojawić się taki tekst za nim użytkownik je sam uzupełni, przykład https://codepen.io/ahmetvrgn/pen/dMQzYJ?page=4


prefiks – w języku Python wartość stawiana przed wyrażeniem typu string taka jak f lub r, pozwalająca na nadaniu łańcuchowi znakowemu specjalnych funkcji np. dla prefiksu f:

    name = 'Bob'
    workplace = 'office'
    print(f'My name is {name} and I am working at {workplace}!')

gdzie w miejsce {workplace} zostanie podstawiona wartość zmiennej workplace

Więcej o prefiksie rr (jako prefix przed napisem)
Więcej o prefiksie fFormatted string literals


PyCharm – środowisko programistyczne IDE do wspomagania pisania i uruchamiania kodu dla języka Python, w kursie używamy wersji Community.


PyCharm Scratches – pliki tymczasowe przeznaczone do eksperymentów i szybkiego testowania nowych rozwiązań. Aby utworzyć plik typu scratches należy użyć kombinacji Ctrl+Shift+Alt+Insert. Aby otworzyć listę plików typu scratches należy użyć kombinacji Alt+F1 i z menu które się pojawi wybrać Scratches, albo użyć menu Project Tool Window. Pełen obszerny opis dostępny jest na stronie www.jetbrains.com


PyCharm Test Runner – TODO https://www.jetbrains.com/help/pycharm/test-runner-tab.html


Python – język programowania użyty w kursie


Test Runner – zestaw bibliotek, których zadaniem jest wyszukanie naszych testów a następnie ich uruchomienie. W Pythonie występuje kilka test runnerów a najpopularniejszymi z nich są:

  • unittest – domyślna biblioteka Pythona,
  • pytest – zewnętrzna biblioteka,
  • nosetests – zewnętrzna biblioteka.

Wszystkie trzy test runnery są dostępne w PyCharm. Różnią się one w możliwościach i w niektórych konstrukcjach językowych.
Przykładowo asercja w unittest wygląda tak: assertEqual(5, 5) natomiast w pytest: assert 5 == 5. Ciekawe porównanie pomiędzy unitest i pytest można znaleźć pod adresem https://www.slant.co/versus/9148/9149/~unittest_vs_pytest.
W chwili obecnej pytest zyskuje na popularności i jest najbardziej polecanym test runnerem w języku Python. Jego dodatkową zaletą jest, że testy napisane pod runnera unittest, będą działały bez problemu także w pytest. Oczywiście istnieją wyjątki – taki przypadek, związany z subTest, opisujemy w lekcji Listy i pętle w praktyce – Asercje w pętli – zagrożenia.

Test Runner możemy zmienić w PyCharm za pomocą ustawienia w górnym menu:
File -> Settings -> Tools -> Python Integrated Tools w sekcji Testing. Wybieramy tam runner dla ustawienia Default test runner.

Warto zauważyć, że PyCharm posiada własne wersje wbudowanych test runnerów więc uruchamianie testów z poza PyCharama może przynieść czasem inny wynik. Ma to zazwyczaj miejsce gdy nastąpi niepowodzenie i wtedy obsługa błędu jest inaczej zalogowana. Więcej w PyCharm Test Runner


r (jako prefix przed napisem) – (r pochodzi od ang. raw, czyli po polsku ‘surowy’, ‘czysty’) oznacza, że napis zostanie potraktowany przez Pythona tak, jak wygląda a wszystkie znaki specjalne jak \t (co oznacza tabulację), \n (co oznacza nową linię) zostaną zignorowane. Można było go spotkać w np. driver = webdriver.Chrome(executable_path = r'C:\TestFiles\chromedriver.exe')


refaktoryzacja kodu – proces modyfikacji kodu aby stał się on bardziej czytelny, zrozumiały i przejrzysty. Podczas refaktoryzacji poprawiamy istniejący już kod tak, aby jego funkcjonalność (logika) się nie zmieniała – czyli najprościej mówiąc kod działa tak samo ale był lepiej napisany. Przykład kodu przed refaktoryzacją:

 
 title = 'Demobank w sam raz do testów'
 # wypisuję tytuł strony
 print('Demobank w sam raz do testów')

po refaktoryzacji – poprawiamy nazwę zmiennej i usuwamy niepotrzebny komentarz (gdyż teraz nazwa zmiennej jasno tłumaczy co w sobie zawiera), oraz używamy zmiennej aby nie powtarzać wypisywania tego samego tekstu w kodzie

webpage_title = 'Demobank w sam raz do testów'
print(webpage_title)

referencja – (ang. reference) informacja o położeniu danej wartości w pamięci lub nośniku danych. Zmiennie nie przechowują bezpośrednio obiektów, a jedynie referencje do pamięci, gdzie dane wartości się znajduję. Przykładowo, gdy przypisujemy wartość jednej zmiennej do drugiej zmiennej, przekazujemy jedynie referencję. Oznacza to, że od tego momentu obie zmienne będą odnosić się do tego samego obiektu, a zmiany stanu wprowadzone za pośrednictwem jednej z nich będą natychmiast widoczne przez drugą. Poniższy rysunek w dużym uproszczeniu obrazuje referencje i efekt wprowadzonych zmian:


return – instrukcja służąca do zwracania wartości w funkcjach i metodach. Przykład użycia:

def add_numbers(number_one, number_two):
   result = number_one + number_two
   return result

result = add_numbers(2, 3):
print(result)

Co w rezultacie wyświetli nam:

5

rzutowanie – oznacza zmianę jednego typu na drugi. Python posiada różne funkcje rzutujące np. int(), str(), float() ale też na typy złożone jak list(), dict() itp.

var_1 = 1
var_2 = '2'

print(f'Type of {var_1} is {type(var_1)}')
print(f'Type of {var_2} is {type(var_2)}')

var_1_str = str(var_1)
var_2_int = int(var_2)

print(f'Type of {var_1_str} is {type(var_1_str)}')
print(f'Type of {var_2_int} is {type(var_2_int)}')

Przy nieudanej próbie rzutowanie wystąpi wyjątek typu ValueError:

var_1 = 'a'

var_1_int = int(var_1)
ValueError: invalid literal for int() with base 10: 'a'

Sanity testy – (z ang. Testy Poczytalności) rodzaj testów wykonywany zazwyczaj po Smoke testach. Testy Sanity mają na celu sprawdzenie kilku prostych wybranych funkcjonalności programu, systemu, strony itp. i wykazanie czy wszystko działa tak jak powinno (czyli np. zgodnie z dokumentacją). Jeśli testy Sanity zakończą się pozytywnie to można przejść do dalszych, już znacznie dokładniejszych testów.
Testy Sanity oraz Smoke należą do grupy testów, które cechują się:

  • szybkością – zarówno pod względem działania jak i czasu po którym dostaniemy odpowiedź o systemie,
  • dużym zakresem, gdyż zazwyczaj testy te dotyczą kilku obszarów systemu,
  • ogólności, bez zagłębiania się w szczegóły działania testowanej funkcjonalności.

screen – (czyt. skrin) w żargonie informatycznym najczęściej odnosi się to do zrzutu całego ekranu roboczego (czyli to co jest wyświetlona na monitorze/monitorach) lub konkretnego programu bądź jego wycinka, zachowanego w formie obrazka. Poniżej screen programu PyCharm oraz kodu z zaznaczonymi wskazaniami:


Selenium – narzędzie, które pozwala na sterowanie przeglądarką z poziomu kodu


serwer – rodzaj komputera z oprogramowaniem pozwalającym na udostępnianiu treści w sieci. Najczęstszym przykładem są serwery stron internetowych oraz treści z nimi związanych takich jako grafiki czy czcionki.


setUp – metoda, zaimplementowana w bibliotece unittest, która wykonuje się przed każdym testem, które znajdują się w danej klasie testowej. Stosuje się ją w klasach z testami i służy do przygotowania wspólnych danych do testów, takich jak stworzenie plików testowych, otwarcie przeglądarki itp. Więcej pod linkiem


setUpClass – metoda, zaimplementowana w bibliotece unittest, która wykonuje się przed wszystkimi testem, które znajdują się w danej klasie testowej. Stosuje się ją w klasach z testami i służy do przygotowania wspólnych danych do testów, takich jak stworzenie plików testowych, otwarcie przeglądarki itp. Więcej pod linkiem


slider – (inaczej ang: carousel, slideshow) rodzaj dynamicznego baneru (dużej przestrzeni graficznej) umieszczanego zazwyczaj na stronie głównej serwisu/programu/strony internetowej. Dynamiczny oznacza w tym przypadku, że treści przewijają się automatycznie co kilka sekund w pętli (czyli np. slider zawiera 3 banery które cyklicznie są zmieniane). Przykładowy slider znajdziesz na https://www.w3schools.com/bootstrap/bootstrap_carousel.asp


Smoke testy – (z ang. Test Dymny) rodzaj testów, który ma na celu wykazać nam czy dany program lub system można uruchomić, czy interfejsy są dostępne i czy aplikacja reaguje na działania użytkownika. Przykładowo dla testów strony internetowej testy typu Smoke będą polegały np. na wejściu na podstrony i sprawdzeniu czy elementy wyświetlają się poprawnie, czy można nacisnąć przycisk ‘szukaj’ i otworzy się strona z wynikami (bez zagłębiania się w te wyniki) itp. Jeśli przejdą nasze Smoke testy to możemy przejść do testów typu Sanity.
Nazwa ta pochodzi od testów sprzętu elektronicznego. Taki test polegał na włączeniu nowego urządzenia i sprawdzeniu czy nie pojawił się dym lub ogień.


Środowisko uruchomieniowe Java – (ang. Java Runtime Environment w skrócie JRE) instalowane w systemie operacyjnym oprogramowanie umożliwiające uruchomienie programów napisanych w języku Java


stacktrace – (naprzemiennie używany z pojęciem traceback) informacja wypisana na konsolę uruchomieniową po wystąpieniu błędu w kodzie np:

 Traceback (most recent call last): 
   File "C:/user/jaktestowac/PycharmProjects/demo_tests/auto_test1.py", line 8, in <module>
      assert title == 'Demobank - Bankowość Internetowa - Logowanie' AssertionError 
Process finished with exit code 1

traceback należy dokładnie przeanalizować aby zlokalizować przyczynę błędu


StaleElementReferenceException – typ wyjątku, który występuje głównie w testach GUI, gdy odwołujemy się do elementu, który został usunięty lub zmodyfikowany. Standardowo występuje, gdy znaleźliśmy element, już się nim zajmujemy w kodzie i w tym czasie strona odświeży się co spowoduje, że nie możemy już wykonać operacji na tym elemencie. Wiecej o tym wyjatku mozna odnaleźć pod adresem Stale Element Reference Exception.


string – standardowa konstrukcja w językach programowania mająca na celach reprezentację ciągu znakowego: 'My words'. W języku Python string zaczyna się od pojedynczego lub podwójnego cudzysłowu ', " i musi się zakończyć identycznym cudzysłowem od jakiego został rozpoczęty. Przykładowa deklaracja i wypisanie wartości string:

title = 'Demobank - Bankowość Internetowa - Logowanie'
print(title)
title2 = "Domobank - Strona główna"
print(title2)
title3 = "Domobank's assets"
print(title3)
title4 = 'Domobank - promocja "Tania pożyczka"!'
print(title4)

struktura – ogólnie w językach programowania struktury oznaczają zbiór elementów. Struktury mogą reprezentować uporządkowany lub losowo rozmieszczony zbiór obiektów. W Pythonie podstawowe struktury to lista obiektów (np. lista obiektów string ['Ania', 'Marta', 'Ola']) oraz słownik (np. słownik kluczy i wartości {'name': 'Ala', 'age': 32}). Struktury posiadają wiele zaimplementowanych metod do ich przeglądania oraz modyfikacji https://docs.python.org/3/tutorial/datastructures.html


substring – część łańcucha znakowego, może to być początek, koniec lub jakiś element wewnętrzny łańcucha np:

sentence = "nie jestem z miasta"
# wypisanie wartości string bez czterech pierwszych znaków
print(sentence[4:])
# wynik: 'jestem z miasta'

Tym samym została wypisana składowa naszego bazowego string czyli substring.


system kontroli wersji – jest to oprogramowanie, za pomocą którego można śledzić zmiany w kodzie. W prosty sposób pozwala podejrzeć zmiany jakie zaszły w danym momencie oraz pokazuje jaki użytkownik je wprowadził.
Przykładowymi programami są Git i SVN.


tearDown – metoda, zaimplementowana w bibliotece unittest, która wykonuje się po każdym teście, które znajdują się w danej klasie testowej. Stosuje się ją w klasach z testami i służy do wyczyszczenia danych po testach, takich jak usunięcie plików, stworzonych podczas testów, zamknięcie przeglądarki itp. Więcej pod linkiem


tearDownClass – metoda, zaimplementowana w bibliotece unittest, która wykonuje się po wszystkich testach, które znajdują się w danej klasie testowej. Stosuje się ją w klasach z testami i służy do wyczyszczenia danych po testach, takich jak usunięcie plików, stworzonych podczas testów, zamknięcie przeglądarki itp. Więcej pod linkiem


Terminal w PyCharm – terminal w PyCharm jest ściśle powiązany z konsolą systemową. Uruchamiamy go używając skrótu Alt + F12 lub klikając zakładkę na samym dole okna PyCharm o nazwie Terminal (jeśli nie widzisz dolnych zakładek klknij ikonkę znajdującą się w lewym dolnym rogu wyglądającą tak: ). Terminal w PyCharm jest ułatwieniem dostępu do konsoli systemowej. Domyślnie dla Windowsa będzie to Command Line (cmd.exe). Możliwe jest też skonfigurowanie jego ustawień, tak aby zamiast Command Line uruchamiany był PowerShell albo bash.
Więcej o konsoli można poczytać na Working with Embedded Local Terminal (https://www.jetbrains.com/help/pycharm/working-with-system-console.html). Przygotowaliśmy także stronę o konsoli wraz z przykładami –https://jaktestowac.pl/konsola-cheat-sheet/


testy wydajnościowe – (ang. performance tests) rodzaj testów służących do oceny stanu aplikacji w różnych warunkach obciążeniowych. Typowym testem wydajnościowym dla stron internetowym jest zbadanie maksymalnej liczby użytkowników, którzy jednocześnie mogą korzystać z witryny bez utraty parametrów działania strony.


timeout – określenie limitu czasu po jakim kod przestanie wykonywać dane zadanie. timeout jest stosowany gdy występuje czekanie na jakąś akcję – aby uniknąć czekania w nieskończoność i blokowania systemu ustawia się wartość czasową po której następuje przerwanie czekania. W testach z wykorzystaniem Selenium mechanizm ten jest najczęściej stosowany do przerwania oczekiwania na element, który jest poszukiwany na stronie.


typy prymitywne – są to podstawowe struktury w Pythonie reprezentujące dane w najprostszych postaciach np. ciągu znakowych lub liczb. Przykładowo są to typy int, string. W odróżnieniu od struktur złożonych (np. lista) nie przekazuje się je za pomocą referencji tylko ich wartości przez co nie modyfikujemy ich np. w pętli:

cats = ['Mruczek', 'Filemon']
#by value
testers = ['Ana', 'Adam']
for tester in testers:
    tester = 'Jane'
print(testers)
# result
# ['Ana', 'Adam']


#by reference
dogs = ['Burek', 'Reksio']
cats = ['Mruczek', 'Filemon']
animals = [cats, dogs]

for list in animals:
    list[0] = 'Kotopies'

# print whole list
print(animals)
# result
# [['Kotopies', 'Filemon'], ['Kotopies', 'Reksio']]

traceback – (naprzemiennie używany z pojęciem stacktrace) informacja wypisana na konsolę uruchomieniową po wystąpieniu błędu w kodzie np:

 Traceback (most recent call last): 
   File "C:/user/jaktestowac/PycharmProjects/demo_tests/auto_test1.py", line 8, in <module>
      assert title == 'Demobank - Bankowość Internetowa - Logowanie' AssertionError 
Process finished with exit code 1

traceback należy dokładnie przeanalizować aby zlokalizować przyczynę błędu


tryb incognito – tryb przeglądarki w którym wyłączone są wszystkie dodatki i dodatkowo zablokowane jest śledzenie użytkownika oraz zapamiętywanie historii, jest to symulacja pierwszego wejścia na stronę w czystej przeglądarce (co nie zawsze działa). Do trybu incognito dostajemy się w Chrome poprzez kliknięcie menu w prawym górnym rogu i wybraniu opcji ‘Nowe okno incognito’ lub użyciu skrótu Ctrl+Shift+N


typ wbudowany – TODO


typ boolowski/logiczny – TODO


URL – TODO


Uruchamianie kodu testów bez TestRunnera – TODO
W pliku z testami należy dodać poniższe linie:

if __name__ == '__main__':
    unittest.main()

utrzymywalność kodu – TODO


Windows Explorer – (w Windows 8 znany jako File Explorer) przeglądarka do katalogów i plików w systemie Windows


wrapper – funkcje lub klasy opakowujące, których zadaniem jest jedynie wywołanie innych funkcji lub metod obiektów z opcjonalną dodatkową modyfikacją przekazywanych parametrów. Przykładami wrapperów mogą być następujące wzorce projektowe dekorator, façade czy proxy.


Wyjątek – (ang. Exception) błąd, który występuje podczas działania programu. W Pythonie do zabezpieczenia się przed Wyjątkami w kodzie służy konstrukcja try-catch. Jeśli wyjątek był nieoczekiwany i nie został poprawnie “złapany” to mówimy wtedy o Nieoczekiwanym Wyjątku (and. UnexpectedException) – taki wyjątek ma szansę przerwa działanie całej aplikacji.


Wzorce projektowe – (ang. Design patterns) jest to uniwersalne, sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych problemów projektowych.

Wzorce w programowaniu obiektowym możemy podzielić na następujące rodziny:

  • Kreacyjne (konstrukcyjne) – opisujące proces tworzenia nowych obiektów; ich zadaniem jest tworzenie, inicjalizacja oraz konfiguracja obiektów, klas oraz innych typów danych.
  • Strukturalne – opisujące struktury powiązanych ze sobą obiektów.
  • Czynnościowe – opisujące zachowanie i odpowiedzialność współpracujących ze sobą obiektów.

XPath – (ang. XML Path Language) język służący do nawigowania i odnajdywania elementów w dokumentach bazujących na znacznikach takich jak XML, HTML itp. Ściągę z wyrażeń XPath oraz praktyczne przykłady znajdziesz tutaj: XPath cheatsheet


zmienna – nazwa która przechowuje dowolne dane. Utworzenie zmiennej w Pythonie:

 
name = "Ala"
age = 20
home_town = "Katowice"

Zmienna przechowuje dane w taki sposób, że wskazuje miejsce w pamięci podręcznej (RAM) komputera gdzie zostają ulokowane dane


zmienna środowiskowa – w systemie Windows, rodzaj aliasu, który umożliwia podpinanie pod jedno proste wyrażenie np: MY_PATH dłuższego wyrażenia np: "C:\Program Files\MyProgram. System Windows posiada wiele zmiennych środowiskowych, których nazwy są rozpoznawane i czytane przez zainstalowane w systemie środowiska uruchomieniowego (Python, Java). Dzięki temu istnieje możliwość np. zastosowania dowolnej ścieżki dla środowiska uruchomieniowego, podczas gdy inne programy korzystają z ogólnie przyjętego aliasu, nie muszę dbać o to gdzie (w jakim folderze) dane środowisko jest zainstalowane, ważne aby alias był poprawny i wskazywał na odpowiednie miejsce. Dla przykładu zmienna: PYTHON może wskazywać na plik, który uruchamia program python.exe umożliwiający uruchamianie programów napisanych w języku Python. Programy, które potrzebują tego pliku, odpytują więc system Windows o zmienną środowiskową PYTHON i otrzymują od razu lokalizację pliku uruchomieniowego środowiska Python, bez względu na to gdzie go zainstalowaliśmy.


zmienna środowiskowa PATH – jest to rodzaj aliasu, który służy w systemach operacyjnych do określania zestawu katalogów, gdzie zlokalizowane są programy komputerowe w celu ich uruchomienia. Zmienna PATH zawiera ścieżki katalogów, które są przeszukiwane przez system w momencie gdy wywoływana jest dana komenda, czy to przez użytkownika czy też inny program. Przykładowo, gdy w konsoli spróbujemy wywołać polecenie python, system rozpocznie wyszukiwanie programu python kolejno we wszystkich katalogach podanych w zmiennej PATH. W przypadku dużej liczby katalogów dodanych do zmiennej PATH może nastąpić spowolnienie systemu przez szukanie programów w zbyt wielu miejscach lub lokalizacjach.

Aby zobaczyć, jakie katalogi wchodzą w skład zmiennej PATH, w konsoli wystarczy wpisać:

 
cmd> echo %PATH%

W wyniku czego dostaniemy następujący wynik (może on się różnić w zależności jakie katalogi mamy ustawione):

 
C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Users\Home\AppData\Local\Programs\Python\Python36-32\Scripts\;C:\Users\Home\AppData\Local\Programs\Python\Python36-32\;