其他分享
首页 > 其他分享> > CodeGo.net>如何使步骤参数取决于配置?

CodeGo.net>如何使步骤参数取决于配置?

作者:互联网

问题

我正在使用SpecFlow为REST服务创建集成测试套件.

我正在以多种不同的配置运行套件. (我有多个Build配置,每个配置都有自己的一组app.config转换.)
在C#代码中,检查配置并基于它执行不同的代码非常简单.我可以简单地做这样的事情.

[Given(@"I set the test parameter to ""(.*)""")]
public void GivenISetTheTestParameter(string parameter)
{
    if(CurrentConfiguration == Config.Test)
        this.testParameter = parameter + "Test";
    else if(CurrentConfiguration == Config.Prod)
        this.testParameter = parameter + "Prod";
}

这种方法的问题在于,此步骤的每次执行都以相同的方式工作,但是我不会在每种情况下都以不同的方式参数化该步骤的与配置相关的部分.
在功能文件中有什么方法可以做到这一点?我想做这样的事情(伪代码,这当然是行不通的):

If (CurrentConfiguration == Config.Test)
Given I set the test parameter to "ParameterTest"
Else If (CurrentConfiguration == Config.Prod)
Given I set the test parameter to "ParameterProd"

然后,我可以在每种情况下以不同的方式使用此参数化:

Scenario: Test 1
    If (CurrentConfiguration == Config.Test)
    Given I set the test parameter to "ParameterTest1"
    Else If (CurrentConfiguration == Config.Prod)
    Given I set the test parameter to "ParameterProd1"
    ...

Scenario: Test 2
    If (CurrentConfiguration == Config.Test)
    Given I set the test parameter to "ParameterTest2"
    Else If (CurrentConfiguration == Config.Prod)
    Given I set the test parameter to "ParameterProd2"
    ...

如果该条件是在该步骤的C#代码中实现的,那么这是不可能的.

现实世界的例子

我想将此用于集成测试REST服务.假设我使用基本身份验证,为此我需要在RestClient对象上设置标头.
我有一个帮助步骤,用于将auth标头设置为特定的用户名和密码.

棘手的部分是,我有多个构建配置(例如,Staging和Prod),为此我需要不同的测试凭据.另外,我在功能的不同场景中调用了不同的API,这些API也需要不同的凭据.

因此,使用上面介绍的伪语法,这就是我想要做的:

Scenario: Test LoggingService
    If (CurrentConfiguration == Config.Test)
        Given I set the auth header for the user "logging_test_user" and password "p4ssword"
    Else If (CurrentConfiguration == Config.Prod)
        Given I set the auth header for the user "logging_prod_user" and password "p4ssword"
    ...
    When I call the LoggingService
    ...

Scenario: Test PaymentService
    If (CurrentConfiguration == Config.Test)
        Given I set the auth header for the user "payment_test_user" and password "p4ssword"
    Else If (CurrentConfiguration == Config.Prod)
        Given I set the auth header for the user "payment_prod_user" and password "p4ssword"
    ...
    When I call the PaymentService
    ...

如果我只能将条件放入“给出我设置的auth标头…”步骤的C#实现中,那么我将无法为不同的情况指定不同的用户名.

解决方法:

您根本不需要功能文件中的可配置数据.相反,创建一个通用步骤,其定义将读取配置文件:

Scenario: Test LoggingService
    Given I set the auth header

在C#中:

[Given(@"I set the auth header")]
public void GivenISetTheAuthHeader()
{
    string username = System.Configuration.ConfigurationManager.AppSettings["RestServiceUserName"];
    string password = System.Configuration.ConfigurationManager.AppSettings["RestServicePassword"];
}

并在App.config中:

<appSettings>
  <add key="RestServiceUserName" value="..."/>
  <add key="RestServicePassword" value="..."/>

如果不同的用户名在系统中具有不同的权限,请考虑使用方案大纲:

Scenario Outline: Testing the LoggingService
    Given I set the auth header for user "<Username>" and password "<Password>"

Examples:
    | Username | Password |
    | user1    | pass1    |
    | user2    | pass2    |

它们成为您步骤定义的常规参数:

[Given("I set the auth header for user """(.*)""" and password """(.*)"""")]
public void GivenISetTheAuthHeaderForUserAndPassword(string username, string password)
{
    // set the user and password on the auth header
}

标签:specflow,gherkin,c
来源: https://codeday.me/bug/20191028/1950758.html