2014-04-30 94 views
2

我有一個包含3個場景的功能文件,用於在C#項目上執行一些BDD測試。每個場景都使用大型示例表(約40行)進行演示。示例表格是相同的。這裏的功能文件的外觀如下:在場景之間共享示例表

Scenario Outline: scenario1 
<stmt set 1> 
Examples: 
<LargeTable> 

Scenario Outline: scenario2 
<stmt set 2> 
Examples: 
<LargeTable> 

Scenario Outline: scenario3 
<stmt set 3> 
Examples: 
<LargeTable> 

我不喜歡重複每個場景的相同示例。有沒有辦法寫一個示例表一次,並使場景參考它,即這樣的事情:

Scenario Outline: scenario1 
<stmt set 1> 
Examples: 
<ref LargeTable> 

Scenario Outline: scenario2 
<stmt set 2> 
Examples: 
<ref LargeTable> 

Scenario Outline: scenario3 
<stmt set 3> 
Examples: 
<ref LargeTable> 

LargeTable: 
<bla> 

是否有可能這樣做?

回答

1

您可以使用SpecFlow的「背景」關鍵字。

Background: 
    Given my table looks like 
    | .... | .... | 

將此放在您的方案之前。然後,您可以像對其他任何Given一樣包含該表,並且該文件將適用於該文件中的每個場景。

+0

似乎可以解決這個問題,但這樣做是否是一個好習慣?請記住,我的示例表大約有40行?謝謝。 –

+2

關於使用的最佳實踐背景:https://github.com/cucumber/cucumber/wiki/Background – drets

+1

做任何事情都有助於喚起場景之間以及不同場景之間的區別。如果表格中只有幾行對於場景中的結果很重要,請考慮只將這些行添加到文件中,並在後臺默默地設置表格的其餘部分,或者使用類似於「and forty其他客戶「(或任何您的數據代表)。幫助引起對不同情境的關注將有助於情景更容易閱讀和理解。 – Lunivore

2

不,SpecFlow不支持這個。
請參閱http://dannorth.net/2008/06/30/let-your-examples-flow/瞭解有關此功能未在BDD框架中實現的一些線索。

+1

對此答案+1。 @J.Josef,雖然你可以用Lunivore的方法來實現你想要的,但這種方法被認爲是反模式(參見North的文章)。 –

+0

但是像這樣的情況可能會發生,應該有一個解決方案,在我的情況下,示例表**是**規範。即它準確地列出了域(A)的元素應該如何映射到域(B)的元素。場景描述了基於此映射的更復雜的交互。因此,我必須複製每個場景的示例表。 –

+1

在這篇文章中,丹特別指的是人們在重複使用的方法等中設置模擬,當設置實際上與結果相關時 - 隱藏「魔法」。如果您的環境與場景的特定結果相關,請將其包含在內。如果它只是現實的背景數據,不要。還記得丹說,*流量勝過DRY *。這並不意味着DRY不好;它只是意味着不要讓可讀性受損。特別是,如果讓你的場景更具有可讀性,那麼就可以將東西排除在外。看看他在這裏提出的原則,並遵循這些原則。 – Lunivore