把人類語言直接變成測試程式

把人類語言直接變成測試程式

這篇文章主要介紹如何將人類語言(英語)直接變成可以執行的測試程式。為什麼要這樣做呢?

這樣一來產品功能描述與測試結果報告就可以很清楚的讓非技術人員也可以看懂。

應用在測試領域上,這就是所謂的  Behaviour-Driven Development (BDD).

用最終使用者驗收的觀點來看整個系統的測試,也就是acceptance-test driven。

整個測試個案的寫法也會變成使用情境導向的寫法。

最後,我們會以 Java為範例實作,如何達到這樣的目的。

 

五大步驟

要達到將人類語言變成可執行測試程式,有五大步驟。

這邊指的人類語言的寫法還是有一定的規範。不能完全像寫散文一般。

1. User Story

將測試個案寫成 User story的格式,例如下面例子。格式為

這個步驟我們會產生 “Google_Search.Story”檔案,這個檔案為文字檔。

User Story

 

2. 翻譯User Story

這個步驟主要定義每一個 user story 語句對應 Java  程式的關係,也就是逐句翻譯!

這個步驟我們會產生 “GoogleSearch.java”檔案

userStroyMap

3. 環境設定檔

這個環境設定原則上只會寫一次。之後可以通用所有的測試程式與 user story。

當然,也可以 copy & paste 使用。

這個步驟我們會產生 “StoryBase.java”檔案

4. 程式執行

執行。要執行這樣的BDD測試程式。我們會需要下列套件:

如果是使用 eclipse 的設定需要注意兩個地方,

1. 設定Jbehave  的lib。

首先先下載 jbehave lib  jbehave-web-distribution-3.5-bin.zip,接著設定 Add lib 如下

jbehave lib

 

2. 加入 Junit ,步驟如下

add Junit

環境都設定完畢之後。我們就可以開始我們第一個 BDD 的測試程式。

測試情境

首先我們先建立一個 “Google_Search.Story”

Narrative: I should be able to do Google Search

Scenario: I should see my Google Search results on “Selenium”

When I open Google Home Page
When I enter search key word as ‘Selenium’
When I click on the Search button
Then I should see Search results with ‘Selenium – Web Browser Automation’

StoryBase.Java

接著這個檔案可以直接 Copy 使用。因為所有的 BDD 測試都需要而且都相同。

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

package mySelenium;

import java.util.List;

import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.io.LoadFromClasspath;
import org.jbehave.core.junit.JUnitStory;
import org.jbehave.core.reporters.Format;
import org.jbehave.core.reporters.StoryReporterBuilder;
import org.jbehave.core.steps.InstanceStepsFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public abstract class StoryBase extends JUnitStory { 
	
	protected final static WebDriver driver = new FirefoxDriver();
	
	@Override    
	public Configuration configuration() {
		return new MostUsefulConfiguration()
		.useStoryLoader(new LoadFromClasspath(this.getClass().getClassLoader()))
		.useStoryReporterBuilder(
					new StoryReporterBuilder()
					.withDefaultFormats()
					.withFormats(Format.HTML, Format.CONSOLE)
					.withRelativeDirectory("jbehave-report")
					);
		}
	
	@Override    
	public List candidateSteps() {
		return new InstanceStepsFactory(configuration(), this).createCandidateSteps(); 
		
	} 
} 

[/pastacode]

GoogleSearch.java

這個程式就是定義 user story 人類語言與 Java程式的執行關係

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

package mySelenium;


/* GoogleSearch.Story
  
Narrative: I should be able to do Google Search

Scenario: I should see my Google Search results on "Selenium"

When I open Google Home Page
When I enter search key word as 'Selenium'
When I click on the Search button 
Then I should see Search results with 'Selenium - Web Browser Automation'

*/

import junit.framework.Assert;

import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

public class GoogleSearch extends StoryBase {
	
	@When("I open Google Home Page")
	public void VisitGoogle()
	{    
		driver.get("https://www.google.com/");
	}	
	@When("I enter search key word as '$Selenium'")
	public void SearchSelenium(String keyword) 
	{         
		WebElement Searchfield = driver.findElement(By.name("q"));
		Searchfield.sendKeys(keyword);
	}		
	@When("I click on the Search button")
	public void ClickOnTheButton() 
	{         
		WebElement button = driver.findElement(By.name("btnK"));
		button.click();
	}	
	@Then("I should see Search results with '$Selenium'") 
	public void Search_Result(String search_result) throws InterruptedException
	{		
		Thread.sleep(300);
		WebElement SearchResultLink =driver.findElement(By.xpath("//a[contains(.,'Selenium - Web Browser Automation')]"));
		Assert.assertEquals(search_result, SearchResultLink.getText());					
		driver.quit(); 
	}
} 

[/pastacode]

測試報告

執行結果會在 target/jbehave目錄下產生測試報告。測試報告會將每一個步驟的成功與否記錄下來。

錯誤的步驟與原因,我們就可以很容易知道哪一個步驟有問題。例如下面例子

 

Jbehave results

 

小結

user Story and Java將人類語言 (user story)直接變成可執行的測試碼的主要目的是希望藉由 User story  觀點進行系統的測試,

另外一個目的也是讓 Product Manager 所撰寫的 User story 可以直接變成可驗證的程式碼。

讓 Product Manager 使用的 User Story 與程式開發人員所使用的 Java 測試程式能夠有所連結

最後的測試報告可以直接提供給 product Manager 參考,因為哪一個步驟成功失敗都是根據 user story 步驟執行

也可以提供測試開發人員參考,因為每一個步驟都會對應到Java 的測試程式碼。

同樣的BDD不是萬能丹,要導入 BDD 的測試,當然還是需要團隊共識與預期的目的。

 

 

參考資料:http://jbehave.org/reference/stable/index.html

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *