Akcja - automatyzacja! Część 3: Pierwsza klasa testowa

Rozpoczynając swoją przygodę z automatyzacją poznaliśmy prosty sposób na konfigurację naszego środowiska automatyzacji oraz mieliśmy okazję poznać dwie popularne biblioteki wspomagające tworzenie środowiska automatyzacji.

 

Postarajmy się jednak pójść o krok dalej.

Rozpoczynając od praktycznej strony tworzenie naszego projektu. Nie obędzie się bez przykładów podpartych kodem. Nauczymy się dobrych praktyk, no ale kto powiedział że nauka jest zła?

A więc zaczynajmy!

 

 

Poniższy tekst jest skrótowym przedstawieniem podstaw naszej pierwszej klasy testowej.

Zapraszamy jednak do zapoznania się z materiałem filmowym, w którym w ciągu kilku minut przedstawiamy skondensowaną wiedzę na temat klas zawierających testy, metod oraz podstawowych adnotacji potrzebnych na początku naszej drogi z projektem. W materiale filmowym znajdziecie również dodatkowy rozbudowany przykład pierwszych testów w naszym przykładowym środowisku z wykorzystaniem dobrych praktyk.

Jak już pamiętamy z pierwszej części naszego cyklu, aby rozpocząć pracę z naszym projektem musimy przeprowadzić prostą konfigurację naszego środowiska.

Jeśli nie pamiętacie jak przeprowadzić taką konfigurację, odsyłamy Was do naszego pierwszego materiału: 

 

 

Rozpoczynając budowę naszego projektu będziemy na wstępie korzystać z elementów takich jak środowisko programistyczne InteliiJ, narzędzie Maven, biblioteka Selenium oraz biblioteka TestNG. Będzie to baza, która stopniowo powiększy się o dodatkowe elementy (biblioteki czy pluginy), które będą omawiane wraz z rozwojem frameworka testowego.

 

Materiały potrzebne do rozpoczęcia pracy możecie znaleźć tutaj:

  • JDK - środowisko Java dla deweloperów

Wybieramy ostatnią stabilną wersję odpowiednią dla naszego systemu operacyjnego. W naszym przypadku będzie to nadal wersja 8.

  • IntelliJ Community - środowisko programistyczne

https://www.jetbrains.com/idea/download/#section=windows 

  • Repozytorium MAVEN

https://mvnrepository.com/ 

  • Biblioteka Selenium WebDriver:
odnośnik do dependencji dla ostatniej stabilnej wersji - 3.8.1 [11.12.2017] 

https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/3.8.1 

  • Chrome Driver - sterownik przeglądarki Chrome:

odnośnik do dependencji dla ostatniej stabilnej wersji - 2.33 [11.12.2017] https://chromedriver.storage.googleapis.com/index.html?path=2.33/

  • TestNG:
odnośnik do dependencji dla ostatniej stabilnej wersji - 6.13.1 [11.12.2017]

https://mvnrepository.com/artifact/org.testng/testng/6.13.1 

 

Testy, metody i adnotacje

Po przejściu do projektu udostępnionego w pierwszym materiale serii lub konfiguracji nowego projektu tworzymy nową klasę. Pamiętajmy, by po stworzeniu nowej klasy nie tworzyć metody main, gdyż będzie ona zbędna, jednak do tego tematu wrócimy przy okazji omawiania adnotacji @Test. Dla przykładu nazwijmy ją “LoginTests”, pamiętając o dobrych praktykach tworząc nazwę klasy zawsze rozpoczynamy od wielkiej litery, jeśli nazwa składa się z kilku fraz, każdą następną rozpoczynamy również z wielkiej litery, nie dodając odstępu pomiędzy nimi. Styl ten nazywany jest: “PascalCase”. Więcej na temat stylu możecie przeczytać tutaj >>

Następnie pomiędzy nawiasy zamknięcia i otwarcia naszej klasy wprowadzamy podstawowe adnotacje (@BeforeTest, @AfterTest, @Test) wraz z metodami.

Pamiętajmy, że tworząc metodę jej nazwę rozpoczynamy z małej litery, a każde następne słowo wchodzące w skład nazwy rozpoczynamy z wielkiej litery. Jest to różnica między tworzeniem nazwy klasy a metody, jednak dobrą praktyką jest znajomość i wykorzystanie konwencji nazewnictwa. Styl ten nazywany jest “CamelCase”. Więcej na temat stylu możecie przeczytać tutaj>> W naszym projekcie zastosujemy również tzw. styl wielbłądzi.

Pamiętajmy również o ważnej zasadzie - nazwa testu powinna przekazywać nam informację, jaki test będzie wykonywany, np. “LoginAsAdminTest”. Więcej o konwencjach nazewnictwa możecie przeczytać tutaj >>

Następnie pod adnotacją @BeforeTest wprowadzamy linię kodu odpowiedzialną za określenie ścieżki do naszego drivera (chromedriver.exe). Adnotacja @BeforeTest oznacza że metoda zostanie uruchomiona zanim zostanie uruchomiona jakakolwiek metoda testowa należąca do klas wewnątrz znacznika.

Następnie pod adnotacją @AfterTest wprowadzamy linię odpowiedzialną za zamknięcie naszego drivera (przeglądarki) po zakończeniu testów. Adnotacja @AfterTest oznacza że metoda zostanie uruchomiona po uruchomieniu wszystkich metod testowych należących do klas wewnątrz znacznika .

Następnie pod adnotacją @Test wprowadzamy kod odpowiedzialny za wykonanie naszego testu. Jak już wspomnieliśmy wcześniej, metoda główna main nie będzie nam potrzebna, gdyż biblioteka TestNG udostępnia własną metodę testową, którą będziemy wykorzystywać. Dla wzbogacenia przykładu naszej pierwszej klasy testowej stwórzmy sobie dwa przykładowe testy dla prawidłowych i nieprawidłowych danych logowania.

Uwaga! Aby mieć pewność, że nasze testy uruchomią się w ustalonej przez nas kolejności, musimy ustalić dla naszych testów priorytet. W tym celu w nawiasie przy adnotacji @Test dla każdego testu wprowadzamy dodatkową wartość, a mianowicie: priority = x (gdzie x to cyfra zależna od tego, który test chcemy uruchomić jako pierwszy). Przykład: @Test(priority = 0) dla pierwszego testu.

 

Nasza przykładowa klasa testowa będzie wyglądała zatem tak:
 
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import static org.testng.Assert.assertEquals;

public class LoginTests
{
	protected static WebDriver driver;

	@BeforeTest()
	public void beforeTest()
	{
    	System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
	}
	@AfterTest()
	public void afterTest()
	{
    	driver.quit();
	}

	@Test(priority = 0)
	public void successLoginAsAdminTest()
	{
    	driver = new ChromeDriver();

    	driver.get("http://demo.testarena.pl/zaloguj");

    	driver.findElement(By.id("email")).sendKeys("
 Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie obsługi JavaScript.
 ");
    	driver.findElement(By.id("password")).sendKeys("sumXQQ72$L");
    	driver.findElement(By.id("login")).click();

    	assertEquals(driver.getTitle(),"Kokpit - TestArena Demo");

    	System.out.println("Poprawne logowanie");
	}

	@Test(priority = 1)
	public void failLoginWithWrongPasswordTest()
	{
    	driver = new ChromeDriver();

    	driver.get("http://demo.testarena.pl/zaloguj");

    	driver.findElement(By.id("email")).sendKeys("
 Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie obsługi JavaScript.
 ");
    	driver.findElement(By.id("password")).sendKeys("sum666");
    	driver.findElement(By.id("login")).click();

    	assertEquals(driver.getTitle(),"Logowanie - TestArena Demo");

    	System.out.println("Próba nieudana, błędne logowanie");
	}
}

 

Jak widzimy w powyższym przykładzie, wykorzystując omawiane praktyki, już od samego początku mogliśmy określić czytelną strukturę naszego projektu. Nieocenioną wartością jest również intuicyjność samej biblioteki TestNG. Na tym kończymy i zapraszamy tym samym do zapoznania się z materiałem filmowym, w którym przedstawiamy dodatkowy bardziej rozbudowany przykład naszej klasy testowej. Oczywiście z omówieniem dodatkowych dobrych praktyk przy rozbudowie naszej klasy testowej.

Już w następnej części rozbudujemy naszą klasę o kolejne adnotacje. Omówimy również, wykorzystując przykładowe asercje ściśle związane z naszymi testami. Zapraszamy do subskrypcji naszego kanału, by żaden materiał Was nie ominął >>

Trzymajcie się!

 

Autor: Krzysztof Kołodziejczyk

 

 

SPRAWDŹ TAKŻE
Akcja - automatyzacja! Część 1: Konfiguracja 
Akcja - automatyzacja! Część 2: JUnit / TestNG - porównanie 

 

 

 

 

Najbliższe terminy szkoleń

Partnerzy

Narzędzia testerskie