Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Вопрос передачи данных от степа к степу в BDD/StepObject


(Zvonov) #1

К примеру создание новой записи.
Появляется новый рекорд, которому присваивается идентификатор.
Как лучше передать этот идентификатор следующему степу, который должен выполнять действия с новой записью?


(svim) #2

Если правильно понял вас, извлеките id-шник и передайте его в качестве параметра. При работе с базой, выполните sql запрос для получение максимального id(в вашем случае это будет последняя запись в таблице).

SQL запрос: SELECT MAX(id) FROM employee;

Здесь мы получаем id последней записи, дальше значение результата(к примеру - 18), возвращает функция в качестве параметра.



Если вы используете два разных объекта ObjectA, ObjectB, и вам в ObjectB нужно получить значение из поля объекта ObjectA, тогда:

  1. В ObjectА извлекаете id-шник, присваиваете его статическому полю, к примеру public static String myId = “18”;


  2. Затем, String val = ObjectA.myId;

  3. Теперь в у вас есть значение полученное из ObjectA, и вы можете выполнять свои действия с ним уже в другом объекте.

(Дмитрий Жарий) #3

Я использую передачу данных через поле класса, если все шаги реализованы непосредственно в этом классе.
Если же, дергаются разные шаги из разных классов, то тут, как советовал @svim – только через параметры метода.

Есть еще один способ – это так называемые, контексты. Зачастую, это глобальный объект, очень часто хэш (hash, map, hash-map, dictionary), к которому можно получить доступ из любого места. Но, это достаточно опасный подход, потому что непонятно кто и когда там меняет данные.


(Zvonov) #4

Спасибо,
Идея про поле класса ясна, про контексты тоже.
Непонятно про параметры. Как один степ может передавать другому значения?

К примеру
@When “user selects the latest transactionID”
@When “user adds the transaction to the report”


(svim) #5

Первые три варианта которые сразу пришли в голову.


Вариант 1.


Есть два класса StepA, StepB.

StepA - содержит метод который выполняет работы с базой, для получения последней записи.

И так мы имеем

public class StepA {
   
    public static String getLastId() 
    {
       // do some special magic
      return lastId;  
    }
}

В StepA - выполнили шаг1(sql запрос). Теперь, чтобы получить параметр из StepA, StepB выглядит следующим образом:

public class StepB {

    public void continueToDoSomeMagic() {

      String lastId = StepA.getLastId();

    }

}

В коде приведённом выше, мы получили значение из StepA и можем продолжать работать с ним в StepB.

Вариант 2.

Имеем эти же классы, только с небольшим изменением:

public class StepA {

    public static String getLastId() {

        // do some special magic 
        return lastId;
    }

    public static void main(String... args)
    {
       /**
        *  Здесь мы передаём результат getLastId  конструктору
        *  StepB, в качестве параметра
        */

       StepB objB = new StepB(getLastId());
       
    }

}

Класс StepB, будет иметь вид:

public class StepB {

    public StepB(String s)
    {
        this.getLastId = s;
    }

    public String getLastIdMethod()
    {
        return this.getLastId;
    }


    private String getLastId = null;

}

Вариант 3

Сделать оболочку в которой будут выполняться все степы по-порядку.
К примеру есть класс StepMaker в котором выполняются все Step - объекты, и передаются результаты от объекта к объекту в виде параметров.

public class StepMaker {

    private StepA stepA;
    private StepB stepB;
    private StepC stepC;

    public void initMethods() {
       stepA = new StepA();
       stepB = new StepB();
       stepC = new StepC();
    } 

    @Test
    public void TestCase() 
    {
       StepMaker sm = new StepMaker();
       sm.initMethods();
    
       String getId = stepA.getLastId();
       stepB.doSomething(getId);
       String getSomethingResult = stepB.getResult();
       stepC.makeReport(getSomethingResult);

    }

 }

(Alexey Dunin) #6

Если вы используете Specflow, то данные можно передавать через ScenarioContext