2014-12-22 85 views
2

我有一個測試項目,其中包含我想測試的所有Selenium方案,並且我想向此解決方案添加一個SpecFlow項目,顯然將使用一些WebDriver方法。 我不想複製我的代碼,但是SpecFlow與Selenium無法正常工作(例如Selenium正在使用SpecFlow中不允許的[TestInitialize]屬性)。 將兩者結合的最佳方式是什麼?Selenium和SpecFlow之間的共享方法

我想要做與「SomeTestMethod」,但與SpecFlow相同的步驟。

這是該項目的一個例子:

public class SeleniumBaseTest : BaseTest 
{ 
    [AssemblyInitialize] 
    public static void Initialize(TestContext testContext) 
    { 
    } 

    Public SomeMethod() 
    { 
    } 
} 
[TestClass] 
public class SeleniumFeature : SeleniumBaseTest 
{ 
    [TestInitialize] 
    public void SeleInitialize() 
    { 
    } 

    [TestMethod] 
    public void SomeTestMethod() 
    {    
    } 
} 

回答

1

由於SpecFlow步驟是在從System.Object繼承的類真的只是公共方法,只是實例化步驟定義類並調用從您的Selenium測試的公共方法。

DataSteps.cs

[Binding] 
public class DataSteps 
{ 
    [Given("Something exists in the database")] 
    public void GivenSomethingExistsInTheDatabase() 
    { 
     // ... 
    } 
} 

在你的Selenium測試類:

[TestClass] 
public class SeleniumFeature : SeleniumBaseTest 
{ 
    private DataSteps dataSteps; 

    [TestInitialize] 
    public void SeleInitialize() 
    { 
     dataSteps = new DataSteps(); 
    } 

    [TestMethod] 
    public void SomeTestMethod() 
    { 
     dataSteps.GivenSomethingExistsInTheDatabase(); 
    } 
} 

唯一的真正的痛苦是當你需要使用一個TechTalk.SpecFlow.Table對象作爲參數的步驟定義。要找出該語法,請查看使用Gherkin表語法的.feature文件之一的設計器生成的源文件,例如

Scenario: Testing something important 
    Given a Foo exists with the following attributes: 
     | Field | Name | 
     | Name | Foo | 
     | Fruit | Apple | 

如果有幫助,您可以將步驟定義保留在它們自己的程序集中。

+0

這是一個可能的解決方案,但我的硒的項目中使用一些複雜的模式,以便它不幫助我。 我需要維護當前的設計並添加SpecFlow。 但這是一個很好的解決方案,謝謝。 – Udiy

+0

我明白了。有兩個不同的項目可能會更好。在SpecFlow中創建場景時,請刪除Selenium項目中的冗餘覆蓋。 –

0

您可以使用屬性又名象鉤:

[BeforeTestRun] [AfterTestRun]

[BeforeFeature] [AfterFeature]

[BeforeScenario]或[前] [AfterScenario]或[後]

[BeforeScenarioBlock] [AfterScenarioBlock]

[BeforeStep] [AfterStep的信息]

有關掛鉤詳細信息,請here

+0

@udiy,有沒有更新? –

+0

@udiy,請讓我們知道您的更新。 –