specflow/ использовать одну и ту же случайную величину во всех сценариях
У меня есть 3 сценария, в первом я создаю пользователя со случайным идентификатором. и мне нужно использовать тот же случайный идентификатор в других сценариях. Я пробовал 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 ответ
По моему опыту использования specflow не стоит полагаться на тестовые данные из одного теста для другого. Я нахожу это слишком хрупким, но, возможно, это только я.
Это, как говорится, и, возможно, я что-то упускаю, если данные шаги находятся в той же привязке, вы не могли бы изменить private string id
в private 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]
удаление пользователей из базы данных. Также было бы лучше создать и удалить пользователя для каждого теста. Таким образом, вы не полагаетесь на другой тест для данных, поэтому ваш тест менее хрупок.