Thứ Hai, 16 tháng 6, 2014

Cucumber #03: Behavior-driven development with Cucumber and Page Object

Behavior-driven development with Cucumber & Page Object : Xây dựng một dự án test theo xu hướng Behavior với Cucumber và mô hình đối tượng trang.



1. Create a maven project with Eclipse: Tạo một dự án bằng Maven trên Eclipse

Configure dependencies and plugins in maven pom.xml: Cấu hình dependencies và plugins trong POM file.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.rhino.auto</groupId>
  <artifactId>cucumber_lesson1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>Cucumber - WebDriver - Page Object Mode</name>
 
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <cucumber.version>1.1.7</cucumber.version>
        <webdriver.version>2.42.0</webdriver.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>gherkin</artifactId>
            <version>2.12.2</version>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
        </dependency>

        <dependency>
            <groupId>com.rubiconproject.oss</groupId>
            <artifactId>jchronic</artifactId>
            <version>0.2.6</version>
            <scope>test</scope>
        </dependency>

        <!-- Webdriver -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-server</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-support</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <!-- Cucumber -->
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-core</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-html</artifactId>
            <version>0.2.3</version>
        </dependency>
    </dependencies>
   
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.2</version>
                <configuration>               
                    <useFile>false</useFile>
                </configuration>
            </plugin>
        </plugins>
    </build>
    </project>


2. Describe behaviour in plain text by writing test cases in a natural language that non-programmer can read. Users describe features and scenarios to test these features in plain text files using Gherkin language in Given, When and Then structure. : https://github.com/cucumber/cucumber/wiki
: Mô tả hoạt động ( hành vi ) của hệ thống bằng cách sử dụng văn bản để viết test case theo ngôn ngữ tự nhiên, Người không lập trình cũng có thể đọc hiểu. Users mô tả các tính năng và kịch bản kiểm tra bằng file văn bản. Việc mô tả này sử dụng ngôn ngữ Gherkin và tuân theo những quy chuẩn cấu trúc với những từ khóa Given, When, and Then: https://github.com/cucumber/cucumber/wiki

Feature: Send contact message
 
  In order to contact with administrator
  As a customer
  I want to send contact message to administrator

  Scenario: Send contact message
    Given I am on home page
    When I navigate to Contact page
    And I fill form with data
    And I submit my information
    Then I get confirmation message


3. Write a step definition in Java: Viết mã bằng ngôn ngữ java để định nghĩa các bước cho kịch bản trên

package com.rhino.auto;

import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import com.rhino.pages.ContactPage;
import com.rhino.pages.ContactResultPage;
import com.rhino.pages.HomePage;

import cucumber.api.java.After;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class ContactMessgeTest {
   
    WebDriver driver = new FirefoxDriver();
    HomePage onHomepage = new HomePage(driver);;
    ContactPage onContactPage = new ContactPage(driver);
    ContactResultPage onContactResultPage = new ContactResultPage(driver);

    @Given("^I am on home page$")
    public void i_am_on_home_page() throws Throwable {
        onHomepage.navigateToWebApp();
    }

    @When("^I navigate to Contact page$")
    public void i_navigate_to_Contact_page() throws Throwable {
         onContactPage = onHomepage.clickOnContact();
    }

    @When("^I fill form with data$")
    public void i_fill_form_with_data() throws Throwable {
          onContactPage.fillFormWithData();
    }

    @When("^I submit my information$")
    public void i_submit_my_information() throws Throwable {
        onContactResultPage =  onContactPage.submitForm();
    }

    @Then("^I get confirmation message$")
    public void i_get_confirmation_message() throws Throwable {
        Assert.assertTrue(onContactResultPage.getConfirmationMessage().contains("Many thanks for your message. We will contact you about your query as soon as possible"));
    }
   
    @After
    public void Shutdown(){
        driver.quit();
    }
}






4. Create a support class RunCukesTest that will define the Cucumber-JVM configurations : Tạo ra một lớp hỗ trợ RunCukesTest để  xác định các cấu Cucumber-JVM:

 package com.rhino.auto;

import org.junit.runner.RunWith;

import cucumber.api.junit.Cucumber;

@SuppressWarnings("deprecation")
@RunWith(Cucumber.class)
@Cucumber.Options(
        format = {"pretty", "html:target/cucumber-html-report"}
        ,features={"src/test/resources/"}
        )

public class RunCukesTest {
  
}


5. Create a class ContactPage that using Page Object Mode and Page Factory: Tạo lớp ContactPage sử dụng mô hình Page Object và Page factory

package com.rhino.pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;

public class ContactPage extends AbstractPage{
   
    @FindBy(how = How.NAME, using = "name_field")
    WebElement nameField;

    @FindBy(how = How.NAME, using = "address_field")
    WebElement addressField;

    @FindBy(how = How.NAME, using = "postcode_field")
    WebElement postCodeField;

    @FindBy(how = How.NAME, using = "email_field")
    WebElement emailField;

    @FindBy(how = How.ID, using = "submit_message")
    WebElement submitBtn;

    public ContactPage(WebDriver driver) {
        super(driver);
        PageFactory.initElements(driver, this);
    }

    public ContactPage fillFormWithData() {
        nameField.sendKeys("linh.vu");
        addressField.sendKeys("HCMC Vietnam");
        postCodeField.sendKeys("20000");
        emailField.sendKeys("vuthelinh@outlook.com");

        return new ContactPage(driver);
    }

    public ContactResultPage submitForm() {
        submitBtn.click();
        return new ContactResultPage(driver);

    }

}


Download Zip Source Code:

https://github.com/vuthelinh/behaviour_template


Thứ Sáu, 13 tháng 6, 2014

Cucumber #02: Cơ bản giữa WebDriver & Cucumber




Bước 1: Tạo một project bằng maven


Bước 2: Cấu hình POM cho project:


Tương tự như hướng dẫn trong video: 


 

Nhưng chúng ta thêm vào các thư viện liên quan tới WebDriver như là:


selenium-api

selenium-chrome-driver

selenium-firefox-driver

selenium-java

selenium-server

selenium-support



Các bạn có thể tìm thêm dependencies của selenium tại


http://mvnrepository.com/artifact/org.seleniumhq.selenium

Nội dung POM file

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cucumber</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cucumber_webdriver</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <cucumber.version>1.1.7</cucumber.version>
        <webdriver.version>2.42.0</webdriver.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>gherkin</artifactId>
            <version>2.12.2</version>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
        </dependency>

        <dependency>
            <groupId>com.rubiconproject.oss</groupId>
            <artifactId>jchronic</artifactId>
            <version>0.2.6</version>
            <scope>test</scope>
        </dependency>

        <!-- Webdriver -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-server</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-support</artifactId>
            <version>${webdriver.version}</version>
        </dependency>

        <!-- Cucumber -->
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-core</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>${cucumber.version}</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-html</artifactId>
            <version>0.2.3</version>
        </dependency>
    </dependencies>
</project>



Bước 3: Viết kịch bản test bằng Gherkin


Feature: Login gmail account
Scenario: Login with blank fields
Given I open webmail "http://accounts.google.com"
When I click login button
Then I see a error message appears, it requires type email or pass

Bước 4: Viết các dòng lệnh tương ứng với những bước trong kịch bản trên

package com.cucumber;

import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import cucumber.api.java.After;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class DefineSteps {
   
    WebDriver driver = new FirefoxDriver();
   
   
    @Given("^I open webmail \"(.*?)\"$")
    public void i_open_webmail(String baseUrl) throws Throwable {
        driver.get(baseUrl);
    }

    @When("^I click login button$")
    public void i_click_login_button() throws Throwable {
        driver.findElement(By.id("signIn")).click();
    }

    @Then("^I see a error message appears, it requires type email or pass$")
    public void i_see_a_error_message_appears_it_requires_type_email_or_pass(){
        String ErrMsg = driver.findElement(By.id("errormsg_0_Email")).getText();
       
           Assert.assertTrue(ErrMsg.contains("Hãy nhập địa chỉ email của bạn."));
    }
   
    @After
    public void Shutdown(){
        driver.quit();
    }
}
 

Chúng ta đã hoàn thành một kịch bản tự động cơ bản
Cám ơn các bạn đã theo dõi
 


Cucumber #01: Thiết lập Cucumber trên Eclipse


Bước I: Cài đặt plugin cucumber vào Eclipse

http://cucumber.github.com/cucumber-eclipse/update-site
 
Bước II: Tạo dự án sử dụng Maven trên Eclipse bằng Maven Plugin. 

Bước III: Tải những thư viện cần thiết cho việc dùng cucumber

Bước IV: Thực hiện các bươc được miêu tả bởi http://cukes.info/

A :  Describe behaviour in plain text

Mô tả các hành vi, hoạt động bằng văn bản theo một cấu trúc nhất định được quy định bởi gherkin.
Ở đây các từ khóa như Feature, Scenario, Given, When, Then, And....được quy định bởi Gherkin. Còn những mô tả kia chính là các bước các bạn muốn làm.

B: Write a step definition in java: Viết code bằng java mã hóa từng bước của kịch bản test này


Thứ Năm, 12 tháng 6, 2014

#4: Tích hợp Maven với Eclipse

==== TẠO MAVEN PROJECT ====

Mở cửa sổ cmd lên và sử dụng câu lệnh maven dưới đây để tạo một project. Trước đó bạn nên tạo một workspae để làm việc. Sau đó di chuyển con nhắc hệ thống tới thư mục vừa tạo này và gõ lệnh dưới đây

mvn archetype:generate

Khi gặp các dòng sau:

Dòng 1 . Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 399:

Ấn Enter để chọn theo mặc định là 399 : remote -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)

Dòng 2. Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1


Ấn Enter để chọn theo mặc định là 6

Dòng 3. Define value for property 'groupId': :

Điền tên groupID là com.yourcompany rồi ấn Enter

Dòng 4. Define value for property 'artifactId': :

Điền tên artifactID là gì các bạn muốn, ví dụ: automation-test

Dòng 5. Define value for property 'version':  1.0-SNAPSHOT: :

Ấn Enter để chọn theo mặc định

Dòng 6. Define value for property 'package':  com.wellbarrier: :

Ấn Enter để chọn theo mặc định

Dòng 7. Confirm properties configuration:
groupId: com.wellbarrier
artifactId: automation-test
version: 1.0-SNAPSHOT
package: com.wellbarrier
 Y: :


Ấn Enter để chọn theo mặc định  để đồng ý với confirm trên

Di chuyển con nhắc hệ thống vào dự án vừa tạo gõ lệnh

mvn test

Một thông báo sẽ hiện ra xác nhận quá trình bạn chạy test có thành công hay không

Chi  tiết xem tại  video hướng dẫn hướng đây.




Trong video cũng hướng dẫn một số vấn đề sau:

1. Import maven project vào trong Eclipse (Xem phút 3:12)

Gõ lệnh :
mvn eclipse:eclipse
2. Cài đặt Maven plugin để tích hợp Maven với Eclipse
 Mở Eclipse Editor chọn Help > Instal New Software… thêm link


Và tiến hành cài đặt ( Xem phút thứ 4:34)

#3 : Tải trình soạn thảo Eclipse


Truy cập vào trang web dưới đây


Căn cứ vào hệ điều hành của bạn là gì và bao nhiêu bits để lựa chọn Eclipse Editor cho phù hợp.

Trong trường hợp của bạn viết này thì hệ điều hành là Win7 - 64 bits.

Trong phần cuối cùng có phần Donate. Vì sao lại có phần này ?

Tất cả những phần mềnh viết giới thiệu từ bài đầu tiên tới giờ đều là phần mềm mã nguồn mở. Nghĩa là bạn sẽ không phải trả một đồng tiền bản quyền nào cho chúng và ngay cả một phần mền soạn thảo code thông dụng như Eclipse. Do đó mình khuyến cáo các bạn không nên dùng những phần mềm bản quyền bị bẻ khóa ( crack) điều này vi phạm tinh thần đạo đức nghề nghiệp một cách sâu sắc và cá nhân mình kịch liệt lên án và phản đối hành vi này. Đây là hành vi TRỘM CẮP không thể chấp nhận.

Thế giới mã nguồn mở có rất nhiều phần những công cụ đáp ứng nhu cầu công việc của các bạn. Nếu các bạn có điều kiện mua những phần mềm có bản quyền thì hãy tìm tới những phần mềm free như Hệ điều hành thì có Ubuntu, Fedora....Soạn thảo văn bản thì có Open Office, trình duyệt thì có Firefox, công cụ automation thì có rất nhiều selenium là điển hình .

Nếu sau khi các bạn dùng những phần mềm này phục vụ cho công việc và có điều kiện thì hãy quay lại DONATE cho những tổ chức này.

Cám ơn các bạn đã đọc và theo dõi video.

#2 : Hướng dẫn cài đặt Maven

1. Cài đặt Maven 

 

Maven chỉ được cài đặt sau khi đã cài đặt JAVA.

Trước khi cài đặt thì chúng ta nên kiểm tra xem Maven đã được cài đặt trước đó chưa

mvn -version

''mvn' is not recognized as an internal or external command,
operable program or batch file.
 Điều đó có nghĩa là máy bạn chưa cài đặt môi trường MAVEN.

         Các bước dưới đây sẽ hướng dẫn cách thức để cài đặt MAVEN.

         Mở trang chủ của Apache-Maven:


Tìm và tải gói binary mới nhất của maven.

apache-maven-3.2.1-bin.zip ( Tại thời điểm viết bài này phiên bản của maven là 3.2.1) hoặc truy cập  http://mirrors.digipower.vn/apache/maven/ để kiểm tra tất cả các phiên bản mà maven đang lưu giữ.

Sau khi tải xong chúng ta cũng thiết lập biến môi trường cho MAVEN tương tự như với biến môi trường của JAVA.
  1. Click chuột phải vào biểu tượng My Computer và chọn “Properties”  >>  “Advanced” và  click vào nút “Environment Variables”

  2. Tiếp theo chỗ “System variables” ta chon New để bắt đầu tạo biến môi trường “M2_HOME”, bạn sẽ thấy dialog hiện ra để nhập thông tin vào bao gồm: Variable name (bạn gõ vào là “M2_HOME”) và Variable value (là thư mục bạn đã đặt gói binary maven vừa tải trước đó, trong phạm vi bài viết này sẽ là nằm ở thư mục “C:\maven″) sau đó bạn chọn OK.

  3. Tìm đến “Path”  chọn nút “Edit” rồi di chuyển đến cuối  gõ thêm vào “;%M2_HOME%\bin;”.Click “OK” ở các dialog để hoàn tất.

  4. Để xác nhận lại việc thiết lập biến môi trường thì tại màn CMD (Terminal) bạn dùng lệnh: echo %M2_HOME%, nếu bạn nhận được kết quả là đường dẫn tới thư mục cài đặt maven là đúng.


Thực hiện lại lên mvn -version sẽ thấy hệ thống thông báo như sau

Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-15T00:37:52+07:00)
Maven home: C:\maven\bin\..
Java version: 1.7.0_60, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_60\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

# 1 : Hướng dẫn cài đặt JAVA

Trước tiên kiểm tra trên máy đã được cài JAVA chưa bằng cách mở của sổ Command Line lên và gõ lệnh dưới đây:


java -version


''java' is not recognized as an internal or external command,
operable program or batch file.
         Điều đó có nghĩa là máy bạn chưa cài đặt môi trường JAVA.

         Các bước dưới đây sẽ hướng dẫn cách thức để cài đặt JAVA.

         Mở trang chủ của Oracle:

http://www.oracle.com/us/downloads/index.html
  1. Click vào mục: Java >> Java SE (includes JavaFX) | Early Access
  2. Kéo màn hình xuống và click vào mục Java SE 7u60 (trong ví dụ này version 7 là lựa chọn, các version khác cũng tương tự)
  3. Click vào checkbox có label là: Accept License Agreement
  4. Lựa chọn gói JDK phù hợp với hệ điều hành mà bạn đang dùng
  • Nếu là hệ điều hành (OS) 32 bits thì chọn gói : 
jdk-7u60-windows-i586.exe
  • Nếu là hệ điều hành (OS) 64 bits thì chọn gói: 
jdk-7u60-windows-x64.exe
         Để kiểm tra hệ điều hành bao nhiêu bits: Click chuột phải lên My Computer chọn  properties và xem thông tin ở phần System. Ví dụ trên máy của mình nó sẽ hiện thị là

System type: 64-bit Operating System
         Cài đặt giống như cài các phần mềm khác, không có gì chú ý đặc biệt. Theo mặc định sau khi cài xong cái bạn sẽ thấy thư mục java xuất hiện trong C:\Program Files\Java

         Trong thư mục này sẽ có hai thư mục con tên là : jdk1.7.0_60jre7

Thực hiện lại lên java -version sẽ thấy hệ thống thông báo như sau

java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
Bước tiếp theo là cài đặt biến môi trường cho JAVA

  1. Click chuột phải vào biểu tượng My Computer và chọn “Properties”  >>  “Advanced” và  click vào nút “Environment Variables”

  2. Tiếp theo chỗ “System variables” ta chon New để bắt đầu tạo biến môi trường “JAVA_HOME”, bạn sẽ thấy dialog hiện ra để nhập thông tin vào bao gồm: Variable name (bạn gõ vào là “JAVA_HOME”) và Variable value (là thư mục bạn đã cài đặt jdk trước đó, thông thường sẽ nằm ở thư mục “C:\Program Files\Java\jdk1.7.0_60″) sau đó bạn chọn OK.

  3. Tìm đến “Path”  chọn nút “Edit” rồi di chuyển đến cuối  gõ thêm vào “;%JAVA_HOME%\bin;”.Click “OK” ở các dialog để hoàn tất.

  4. Để xác nhận lại việc thiết lập biến môi trường thì tại màn CMD (Terminal) bạn dùng lệnh: echo %JAVA_HOME%, nếu bạn nhận được kết quả là đường dẫn tới thư mục cài đặt jdk là đúng.