Di artikel ini dijelaskan dari A-Z bagaimana melakukan automation testing pada web dari instalasi sampai membuat report untuk automation testing.
Supaya lebih jelas, pembaca dapat membaca artikel sebelumnya yang membahas tentang:
Persiapan
1. Download dan Install
Download dan instal untuk setiap item di bawah ini:
Item | URL |
---|---|
Editor | Intellij IDEA Community https://www.jetbrains.com/idea/download/ |
Web Driver | Chrome https://chromedriver.chromium.org/ Mozilla Firefox https://github.com/mozilla/geckodriver/releases |
Java | JDK 8 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html |
Browser versi terbaru | Chrome https://www.google.com/chrome/ Mozilla https://www.mozilla.org/en-US/firefox/new/ |
2. Memulai project
Sesuai design pattern yang digunakan, maka kita perlu membuat package pages dan steps beserta package atau folder lainnya sesuai yang kita butuhkan. Berikut contoh struktur folder-nya:
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-16.36.04-1.png?w=594)
Keterangan:
- helpers: package untuk menyimpan class atau method yang tidak unik, dan sering digunakan. Misal: class Runner, class ScreenSction, dll.
- pages: semua screen atau page web yang dijadikan class, semuanya ada di package ini.
- setups: class-class atau method yang digunakan untuk mengkonfigurasi automation, semuanya ada di package ini.
- steps: package yang berisi class-class step definitions.
- features: untuk menyimpan skenario automation yang ditulis menggunakan Gherkin.
3. Instalasi Web Driver
Pada artikel ini, web driver yang akan digunakan adalah chromedriver untuk browser Chrome dan geckodriver untuk Mozilla Firefox.
Windows, Linux, dan Mac OS
Salin chromedriver
dan geckodriver
yang sudah diunduh ke direktory/folder resources yang ada di dalam struktur folder project.
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-16.47.00.png?w=520)
4. Environment Variable
Untuk pengaturan environment, dapat dilakukan dengan membaca artikel sebelumnya di sini.
5. Import dependency dari Maven Repository
Untuk memahami dependency, dapat membaca artikel sebelumnya di sini.
Berikut minimal dependency yang di-import ke file pom.xml:
artifactId | groupId | version |
---|---|---|
selenium-java | org.seleniumhq.selenium | 3.141.59 |
selenium-firefox-driver | org.seleniumhq.selenium | 3.12.0 |
selenium-safari-driver | org.seleniumhq.selenium | 3.12.0 |
selenium-chrome-driver | org.seleniumhq.selenium | 3.12.0 |
cucumber-junit | info.cukes | 1.2.5 |
cucumber-java | info.cukes | 1.2.5 |
cucumber-java | io.cucumber | 6.9.1 |
cucumber-core | info.cukes | 1.2.5 |
gherkin | info.cukes | 2.12.2 |
java-client | io.appium | 7.2.0 |
selenium-api | org.seleniumhq.selenium | 3.141.59 |
testng | org.testng | 6.14.3 |
Tambahkan kode di bawah di bawah tag <project> pada pom.xml.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-20-at-21.54.54.png?w=1024)
Memulai Web Automation Testing
Kita akan menggunakan web Google Search sebagai contoh automation testing-nya.
1. Menulis skenario dengan Gherkin
Tentang Gherkin, rekan pembaca dapat membaca artikel sebelumnya di sini.
Semua skenario disimpan di dalam folder features, sebagai berikut langkahnya:
Pada artikel ini, kita membuat 1 feature yaitu Searching.
- Dengan menggunakan editor Intellij Idea, kita buat file baru.
- Tuliskan 1 feature di bawah.
- Jika sudah, simpan dengan ekstensi
.feature
Searching.feature
@SearchingGoogle
Feature: Searching Google
@sosmed @smoke
Scenario Outline: User want to search sosmed
Given User open google web
Then User type the keyword "<sosmed>"
Then User want to check the result "<sosmed>"
Examples:
| sosmed |
| @twitter |
| @facebook |
| @instagram |
@price @smoke
Scenario: User want to search a price
Given User open google web
Then User type the keyword "camera harga Rp 300000"
Then User want to check the result "camera harga Rp 300000"
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-21.37.27.png?w=1024)
Step-step di atas terlihat seperti ter-highlight, dikarenakan belum ada glue step-nya, yang artinya, step-step pada skenario di atas belum dibuat step definition-nya. Saat dibuat step definition-nya, maka highlight kuning akan hilang dengan sendirinya.
Rekan pembaca dapat menambahkan step pada feature Searching, atau juga dapat menambahkan file feature sendiri.
3. Men-setup automation
Berikutnya kita akan mengatur automation-nya dengan membuat class-class pada package setups:
- BrowserPool.java
- BrowserSetup.java
- Hook.java
BrowserPool.java
package setups;
import org.openqa.selenium.WebDriver;
public class BrowserPool {
private static WebDriver browserInstance;
public static WebDriver getBrowserInstance() {
return BrowserPool.browserInstance;
}
public void setBrowserInstance(WebDriver instance) {
BrowserPool.browserInstance = instance;
}
}
Class BrowserPool ini merupakan setter getter untuk browser yang ada di class BrowserSetup.
BrowserSetup.java
package setups;
import org.openqa.selenium.chrome.ChromeDriver;
public class BrowserSetup extends BrowserPool{
ChromeDriver browser;
protected void startBrowser() {
System.setProperty("webdriver.chrome.driver","src/test/resources/chromedriver");
browser = new ChromeDriver();
setBrowserInstance(browser);
}
protected void stopBrowser() {
browser.close();
}
}
Hook.java
package setups;
import cucumber.api.java.After;
import cucumber.api.java.Before;
public class Hook extends BrowserSetup{
@Before
public void before() throws Exception {
startBrowser();
}
@After
public void after() throws Exception {
stopBrowser();
}
}
Anotasi @Before
, berarti method akan dijalankan sebelum step definition dijalankan.
Anotasi @After
, berarti method akan dijalankan setelah step definition selesai dijalankan.
4. Membuat pages
Karena menggunakan design pattern POM, maka kita perlu membuat pages. Untuk konsep design pattern POM dapat membaca artikel sebelumnya di sini.
Berdasarkan skenario di atas, kita akan membuat 2 pages: Home Page dan Search Page.
Untuk mendapatkan nama-nama element, dapat membaca artikel sebelumnya di sini.
HomePage.java
package pages;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class HomePage {
private WebDriver browser;
public HomePage(){
}
public HomePage(WebDriver browser){
this.browser = browser;
PageFactory.initElements(browser, this);
}
@FindBy(name = "q")
private WebElement searchField;
@FindBy(name = "btnK")
private WebElement searchBtn;
@FindBy(name = "btnI")
private WebElement luckyBtn;
public void inputKeyword(String keyword) throws InterruptedException {
searchField.sendKeys(keyword);
Thread.sleep(2000);
}
public void clickSearchBtn() throws InterruptedException {
searchBtn.click();
Thread.sleep(2000);
}
public void clickLuckyBtn() throws InterruptedException {
luckyBtn.click();
Thread.sleep(2000);
}
public void pressEnter(){
searchField.sendKeys(Keys.RETURN);
}
}
SearchPage.java
package pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class SearchPage {
private WebDriver browser;
public SearchPage(){
}
public SearchPage(WebDriver browser){
this.browser = browser;
PageFactory.initElements(browser, this);
}
@FindBy(name = "q")
private WebElement searchField;
public void inputKeyword(String keyword) throws InterruptedException {
searchField.sendKeys(keyword);
Thread.sleep(2000);
}
public void clearKeyword() throws InterruptedException {
searchField.clear();
Thread.sleep(2000);
}
}
5. Mendefinisikan step
Step inilah yang nantinya akan melakukan interaksi-interaksi seperti yang dilakukan secara manual oleh tangan manusia. Di dalam step definition, kode-kode automation dituliskan.
File steps diletakkan di dalam folder step_definitions.
Step definition di-generate berdasarkan skenario yang sudah ditulis menggunakan Gherkin tadi. Tiap step pada Gherkin menjadi method-method pada Java.
Cara men-generate step-nya adalah sebagai berikut:
1. Buka file skenario.
2. Letakkan kursor pada baris pertama atau baris step yang belum di-generate step-nya.
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-21.41.03.png?w=584)
3. Tekan kombinasi tombol pada keyboard Alt + Enter untuk Windows/Linux atau Option + Enter untuk MacOS.
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-21.39.58.png?w=766)
4. Klik Create step definition.
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-21.53.29.png?w=970)
5. Berikan nama class step definition dan pilih Java, pastikan file location di dalam package steps, lalu klik OK.
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-21.53.40.png?w=594)
Ulangi langkah di atas untuk semua step yang belum di-generate.
Pilih class SearchingStep setelah klik Create step definition.
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-21.55.06-1.png?w=386)
Jika semua sudah di-generate, maka tampilan SearchingStep.java menjadi seperti berikut:
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-18-at-21.55.55.png?w=1024)
SearchingStep.java
Dari step di atas, dimodifikasi untuk disesuaikan dengan class pages yang sudah dibuat di atas tadi. Menjadi demikian:
package steps;
import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import pages.HomePage;
import static setups.BrowserPool.getBrowserInstance;
public class SearchingStep {
HomePage homePage = new HomePage(getBrowserInstance());
@Given("^User open google web$")
public void userOpenGoogleWeb() {
getBrowserInstance().navigate().to("https://www.google.com/");
}
@Then("^User type the keyword \"([^\"]*)\"$")
public void userTypeTheKeyword(String keyword) throws Throwable {
homePage.inputKeyword(keyword);
homePage.pressEnter();
}
@Then("^User want to check the result \"([^\"]*)\"$")
public void userWantToCheckTheResult(String arg0) throws Throwable {
}
}
6. Membuat helper
Package helper akan diisi class Runner dan class ScreenAction.
Class Runner menjadi class yang dipanggil untuk menjalankan automation-nya, tetapi juga class yang memiliki method untuk men-generate report secara otomatis. Sedangkan class ScreenAction digunakan untuk jenis-jenis interaksi seperti scroll, screenshot, dll.
Kedua class tersebut dibuat di dalam package helper.
Runner.java
package helpers;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(
features = {"src/test/resources/features"},
// tags = {"@sosmed"},
glue = {""},
plugin = {"pretty","json:target/cucumber.json","html:target/report"},
monochrome = true
)
public class Runner {
}
ScreenAction.java
package helpers;
import cucumber.api.Scenario;
import io.cucumber.java.AfterStep;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import static setups.BrowserPool.getBrowserInstance;
public class ScreenAction {
@AfterStep
public void screenShot(Scenario scenario){
TakesScreenshot take = (TakesScreenshot) getBrowserInstance();
byte[] tempImg = take.getScreenshotAs(OutputType.BYTES);
scenario.embed(tempImg, "image/png");
}
}
7. Menjalankan automation
- Buka class Runner.java.
- Klik kanan pada class tersebut.
- Klik Play
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/screen-shot-2021-02-20-at-22.01.55.png?w=1024)
8. Screenshot contoh report
Dengan konfigurasi option pada Runner.java, maka report HTML akan ter-generate otomatis di folder target/report.
![](https://pojokqa.wordpress.com/wp-content/uploads/2021/02/web-capture_20-2-2021_214158_.jpeg?w=1024)