使用Specflow表的最佳方法

时间:2016-05-31 13:08:23

标签: selenium bdd specflow

我的问题是关于BDD(Specflow)的最佳实践。 在我正在测试的web应用程序中,我必须编写一个关于创建合同的功能。

要创建合约,用户必须传递By 8 Tabs,对于每个标签,用户将输入超过15个值(最小4,最多40个值)。

我的主张是

Given Go to the screen "Contrats"
    And Click on the button "New contract"
    When Enter in Tab1 
    | Field1     | Field2      | Field3    |
    | -----------| ------------| ----------|
    And Click on the Next button
    And Enter in Tab2
    | Field1          | Field2     |
    | --------------- | -----------|
    And Click on the Next button
    And Enter in Tab3
    | Field1 | Field2 | Field 3| Field4   | Field5    | Field6 |Field7           |
    | -------| -------| ------ | -------- | --------- | -------| ----------------|
    And Click on the Next button
    And Enter in Tab4
     | Field1 | Field2 | Field 3| Field4   | Field5    | Field6 |Field7          | Field8|
    | -------| -------| ------ | -------- | --------- | -------| ----------------| ------|
    And Click on the Next button 
    And Enter in Tab5
    | Field1 | Field2 | Field 3| Field4   | Field5    | Field6 
    | -------| -------| ------ | -------- | --------- | -------|
    And Click on the Next button
    And Enter in Tab6
    | Field1     | Field2      | Field3    |
    | -----------| ------------| ----------|

    And Click on the Next button
    And Click on the Next button
    And Cliquer sur Oui
    And Enter in Tab7
    | Field1     | Field2      | 
    | -----------| ------------| 
    And Click on confirm enregistration
    And Save the contract reference and close the popup
    And Click on button No
    Then Redirecting the Summary tab

所以在这个Case的每个Tab中我必须有例子的模型:

  public class Tab1{ 
  public string Field1 { get; set; }
  public string Field2 { get; set; }
  public string Field3 { get; set; }
  }

问题: 在此功能中,我尝试仅输入必填字段。 但在其他功能中,我必须输入更多字段,所以在Tab1中我将输入例如37个字段。 在这种情况下我能做些什么:

1 - 创建另一个模型?:我将有太多的模型

2 - 只创建一个具有最大字段的模型,对于第一种情况,我将为其他fiels设置一个空值(Field4-> Field37):模型的属性太多。

3 - 对于Tab1的每个bloc,我们创建类如:

  public Class Tab1{

  public Bloc1 Field1 { get; set; }
  public Bloc2 Field2 { get; set; }
  public Bloc3 Field3 { get; set; }


  public class Bloc1{ 
  public string Field1 { get; set; }
  public string Field2 { get; set; }
  public string Field3 { get; set; }
  }

  public Class Bloc2{
  public string Field1 { get; set; }
  public string Field2 { get; set; }
  public string Field3 { get; set; }
  }
  .
  .
  .
 }

但是使用此解决方案我如何编写我的功能?!

1 个答案:

答案 0 :(得分:0)

即使我的测试数据遇到了同样的问题。我需要为每个测试传递20到30个字段,因为它包含端到端工作流程。如果您使用表,因为您需要为每组输入值创建表类(在您的情况下为Tab1,Tab2等),这将非常困难。

您可以使用 Scenatio Outline 而不是 Scenario 来传递输入值。见下面的例子:

# Basic Login check
# Verifies whether user is able to login or not
Scenario Outline: REG - Login Check
Given I have logged in using "<username>" and "<password>"
When I should see my username after login
Then I will logout of Echo
Examples:
| username         | password         |Field1|Field2|Field3|Field4|Field5|
| lee kirby-walker | LKirby-Walker10* |input1|input2|input3|input4|input5|
| sample 1         | pwd1             |input6|input7|input8|input9|input10|

您可以将任意数量的测试数据行传递给测试。但它在VS中创建了许多测试用例。这些测试数据值将作为参数传递给步骤定义方法。

请参阅以下步骤定义步骤鉴于我已使用“用户名”和“密码”登录

        [Given(@"I have logged in using ""(.*)"" and ""(.*)""")]
        public void LogInUsingUsernameAndPassword(string userName, string password)
        {
            ScenarioContext.Current["userName"] = userName;
            UserHomePage = LoginPage.Login(userName, password);
            Reporter.ReportNote(string.Format("User {0} logged in successfully", userName), Status.Pass);
        }

但是使用 Scenario Outline ,您必须使用示例,否则specflow会引发错误。