2012-05-24 41 views
1
  1. 我開發了一個jBehave故事來測試我們的系統中實現的一些工作流程。 假設這個故事叫做customer_registration.story如何多次使用不同參數運行故事

  2. 這個故事是我們系統支持的其他一些更復雜的工作流程的起點。 那些更復雜的工作流程也被不同的故事所覆蓋。 比方說,我們有我們的工作比較複雜的一個由customer_login.story覆蓋流動

所以customer_login.story看起來像某種方式如下:

Story: Customer Login 

Narrative: 

In order to access ABC application 
As a registered customer 
I want to login into the application 

Scenario: Successfully login into the application 

GivenStories: customer_registration.story 

Given I am at the login page 
When I type a valid password 
Then I am able to see the application main menu 

所有作品完美,我很高興接着就,隨即。

3.上面第1點(客戶註冊)的故事是我需要在不同的數據集上運行的。 假設我們的系統支持國際化,我們需要檢查客戶註冊的故事運行OK支持所有支持的語言,假設我們要測試我們的客戶註冊工程OK和en-gb和zh-tw

所以我需要實施multi_language_customer_registration.story將看起來類似的東西:

Story: Multi language customer registration 

Narrative: 

In order to access ABC application 
As a potential customer 
I want to register for using the application 

Scenario: Successfully customer registration using different supported languages 

GivenStories: customer_registration.story 

Then some clean up step so the customer registration story can run again 

Examples: 
|language| 
|en-gb | 
|zh-tw | 

,我怎麼能做到這一點任何想法? 請注意,下面的東西不是一個選項,因爲我需要運行之間的清理步驟。

GivenStories: customer_registration.story#{0},customer_registration.story#{1} 

移動客戶註冊故事中的清理步驟也不是一個選項,因爲登錄故事將停止工作。

在此先感謝。

P.S.正如你在現實中猜測的那樣,我們創建的故事更加複雜,重構它們並不是一件容易的事情,但我很樂意爲此獲得真正的收益。

回答

0

大多數單元測試框架都支持這一點。

看怎麼MSTEST可以指定數據源,NUnit的是類似 https://github.com/leblancmeneses/RobustHaven.IntegrationTests

不幸的是一些BDD框架我見過嘗試更換existng單元測試框架時,應該將共同努力,重複使用的基礎設施。

https://github.com/leblancmeneses/BddIsTddDoneRight 流利的bdd語法,可以與mstest/nunit一起使用,並且可以與現有的測試運行器一起使用。

+0

感謝您的文章,但我正在尋找一個jBehave解決方案。我們在Java方面(不是它真的很重要),在JUnit中,你也可以做很多事情。 但是,我在這裏發佈的問題是端到端測試套件的一部分。 JBehave會觸發REST和WS請求,或者按下各種網頁上的按鈕,來完成用戶和/或客戶端應用程序在現實世界中的操作。 當我說我很樂意做一些重構工作時,我並不意味着重寫超過一年的優秀工作開發所有這些場景:-) – Julian

+0

請看https://github.com/leblancmeneses/RobustHaven.IntegrationTests而不是在Java中 - 你有完整的源代碼可以轉換爲Java。我們使用selenium和watin,可以構建一些大型複合工作流程:序列(helper.DoPastDueFlow(xx,xx,xx,xx,xx)) 。序列(...) 。序列(...)轉換。您現有的記錄方案將進入訪問者內部,該訪問者將訪問組合中的每個節點以執行工作流程。 –

2

首先,BDD與測試不一樣。我不會將它用於每個國際化的場景。相反,隔離處理國際化和單元測試的位,手動測試一對夫婦並稱之爲完成。如果你真的需要更加徹底的話,那就用幾種語言來使用它,但是不要全部使用它們 - 只是爲了給你一些安全的例子。

現在爲客戶的位。首先,登錄和註冊真的很有趣?一旦你讓他們工作,你可能會改變他們嗎?登錄或登記有什麼特別的事情對您的企業有特殊意義嗎?如果不是,請儘量保留場景以外的場景 - 維護比其價值更爲痛苦,如果永遠不會改變,您可以手動測試一次。

顯示用戶登錄的場景對於通常對於業務(you are having conversations with the business, right?)更誘人和有趣。

否則,這裏有三種方式可以建立一個上下文(假設):

  • 通過黑客的數據(所以訪問直接對數據庫)
  • 通過UI(或控制器如果你從那個級別自動化)
  • 通過使用現有的數據。

你也可以看看數據是否存在,如果不存在,設置它。因此,例如,如果您的客戶已註冊並且您不希望他註冊,則​​可以刪除其註冊,作爲設置上下文的一部分(運行「給定」步驟);或者如果你需要他註冊,而他不需要,你可以通過UI來註冊他。

最後,JBehave有一個@AfterScenario註釋,您可以用它來表示該場景的清理步驟。步驟是可重複使用的 - 您可以在代碼的另一步驟中調用場景的步驟,而不是使用JBehave的機制(無論如何,IMO都可以更好地維護),這將允許您在登錄時避免清除註冊。

希望這些選項中的一個適合你!

2

從戰術的角度來看,我這樣做:

在你.story文件

Given I set my language to {language} 
When I type a valid password {pass} 
Then I am able to see the application main menu 

Examples: 
|language|pass| 
|en-gb |password1| 
|zh-tw |kpassword2| 

然後在您的Java文件,

@Given ("I set my language to $lang") 
@Alias ("I set my language to {language}") 

//方法放在這裏

@When ("I type a valid password $pwrd") 
@Alias ("I type a valid password {pass}") 

//我thod去這裏

@Then ("I am able to see the application main menu") 
相關問題