specflow /在所有场景中使用相同的随机变量

时间:2018-04-14 21:00:23

标签: c# visual-studio random specflow

我有3个场景,在第一个我用随机Id创建一个用户。 我需要在其他场景中使用该SAME随机ID。 我尝试过featurecontext来存储Id值。但是当我尝试将存储的值放在一个新的变量“user”中时,它总是为空 (我没有任何错误消息。在我的REST API中正确创建用户,错误消息是API级别,因为我搜索空用户) 这是我的代码

Feature
Scenario: Create User
    Given a random user 
    When  I create that user throught the API
            | Field     | Value             |
            | Firstname | Firstname         |
            | Lastname  | Lastname          |   
    Then  the API should returns a "Created" response

Scenario: Check the User-API
    Given the user already created 
    When  i make a Get request of this user
    Then  the API should returns an "OK" response

Stepdefinition

        [Binding]

            public class CreationUtilisateurSteps
            {
                private string Id;
                private string user;

        [Given(@"a random user)]
                public void GivenARandomUser()
                {
                   id = RandomUtil.GetRandomString();
                   FeatureContext.Current["mystoredid"]=id;
                }

        [When(@"I create that user throught the API")]
            public void WhenICreateThatUserThroughtTheAPI(Table table)
            {
                var user = table.CreateInstance<UserProfile>();
                var client = new RestClient(Settings.Default);
                var request = new RestRequest(Method.POST);
                request.AddHeader("Token", "");
                request.AddHeader("Cache-Control", "no-cache");
                request.AddHeader("Content-Type", "");
                request.AddHeader("Accept", "");
                request.AddHeader("Authorization", "");
                request.AddParameter("undefined", @"
                 {
                 ""id"":""" + Id + @""",
                 ""profile"":
                 {""firstname"":""" + user.Firstname + @""",
                 ""lastname"":""" + user.Lastname + @""",
                 }", ParameterType.RequestBody);

                response = client.Execute(request);
            }

    [Then(@"the API should returns a (.*) response")]
            public void ThenTheAPIShouldReturnsACreatedResponse(string statusCode)
            {
                Assert.Equal(Enum.Parse(typeof(HttpStatusCode), statusCode), response.StatusCode);
                var jsonResponse = JsonConvert.DeserializeObject<dynamic>(response.Content);

            }

  [Given(@"the user already created ")]
        public void GivenLUtilisateurDejaCree()
        {
            user=FeatureContext.Current["mystoredid"].tostring();
        }

提前谢谢

1 个答案:

答案 0 :(得分:0)

根据我使用specflow的经验,将一个测试的测试数据依赖于另一个测试数据并不是一个好主意。我发现它太脆弱了,但也许这只是我。

话虽如此,也许我错过了一些东西,如果给定的步骤是相同的​​约束,你就不能改变 private string idprivate static string id以便它们在测试之间保持不变?

<强>更新

以下示例显示静态变量将在测试之间保持不变:

namespace specflow
{
    [Binding]
    public class Class1
    {
        private static string id;

        [Given(@"I have a new user")]
        public void GivenIHaveANewUser()
        {
            id = "5";
        }

        [Given(@"I have the same user")]
        public void GivenIHaveTheSameUser()
        {
            Assert.That(id, Is.EqualTo("5"));
        }
    }
}

Feature: SpecFlowFeature1

Scenario: new user
    Given I have a new user

Scenario: same user
    Given I have the same user

据说在我看来,您的验收测试还有其他问题。在测试运行完毕后,您听起来好像没有删除这些用户。如果你在一个你不关心的环境中运行,这很好。如果您在共享环境或生产环境中运行,那么您可能会有很多随机用户坐在那里。你应该有一个[AfterFeature]从数据库中删除用户。 此外,最好为每个测试创建和删除用户。这样你就不会依赖另一个测试数据,因为你的测试不那么脆弱。