Перейти к содержимому

Фотография

Автоматизация больших бизнес процессов


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 29 мая 2018 - 13:20

Всем еще раз привет!

Только учусь - так что не судите строго.

 

И так...вопрос вот в чем. Имеется очень длинный бизнес процесс (дальше БП). Код например заполнения карточки документа прикрепляю ниже:

@Test(priority = 1)
    public void createOrgTest() throws InterruptedException {
        driver.get(ConfigFile.createCabinetURL);
        OrganizationCabRegister orgCabReg = new OrganizationCabRegister(driver,wait);
        orgCabReg.selectOrgRegistrationReason();
        orgCabReg.setFullOrgNameField(Variables.getOrgName());
        orgCabReg.setShortOrgName(Variables.getOrgName());
        orgCabReg.setEdrpou("33"+ConfigFile.addToName);
        orgCabReg.setIndex("0011"+ConfigFile.addToName);
        orgCabReg.selectCityType();
        orgCabReg.setCityName("Вінниця"+ConfigFile.addToName);
        orgCabReg.selectStreetType();
        orgCabReg.setStreetName("Келецька"+ConfigFile.addToName);
        orgCabReg.setHouseNumber("32"+ConfigFile.addToName);
        orgCabReg.setHeadLastName(Variables.getHeadLastName());
        orgCabReg.setHeadFirstName(Variables.getHeadFirstName());
        orgCabReg.setHeadMiddleName(Variables.getHeadMiddleName());
        orgCabReg.setHeadPhone("+38066545574"+ConfigFile.addToName);
        orgCabReg.setHeadEmail(ConfigFile.headEmail);
        orgCabReg.setResponsibleLastName(Variables.getResponsibleLastName());
        orgCabReg.setResponsibleFirstName(Variables.getResponsibleFirstName());
        orgCabReg.setResponsibleMiddleName(Variables.getResponsibleMiddleName());
        orgCabReg.setResponsiblePhone("+3877447755"+ConfigFile.addToName);
        orgCabReg.setResponsibleEmail(ConfigFile.respEmail);
        orgCabReg.createButtonClick();
        orgCabReg.setLinkToHead();
    }

Заполнение этой карточки это всегда первый шаг БП, дальше уже идет проверка, отклонение и т.д. То есть мне этот метод нужно использовать много раз, для разных веток БП. Как правильно это сделать?

 

 

У меня сейчас просто копитаст в этого куска в разные классы. Так конечно нельзя, а как правильно?

Вынести этот метод в отдельный класс? 

 

Хочу что бы всего один екземпляр этого кода был, что бы случае изменений быстро поправить в одном месте.

 

Надеюсь что понятно изложил. Буду рад помощи!

 

 

 

 


  • 0

#2 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 29 мая 2018 - 16:24

createOrgTest() - это уже отдельный метод. Сейчас он у вас запускается один раз, первым приоритетом.

Можно просто убрать аннотацию @Test и поставить вместо неё @BeforeMethod. Тогда перед выполнением каждого теста в этом классе - будет вызываться createOrgTest() и делать вам "первый шаг БП".

Если тесты, которым нужен этот шаг - в разных классах, то просто вызывайте в коде тех тестов первой строкой метод createOrgTest() (в этом случае аннотация @BeforeMethod уже не требуется, можно оставить @Test для отдельной проверки этого процесса). 


  • 1

#3 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 30 мая 2018 - 06:38

createOrgTest() - это уже отдельный метод. Сейчас он у вас запускается один раз, первым приоритетом.

Можно просто убрать аннотацию @Test и поставить вместо неё @BeforeMethod. Тогда перед выполнением каждого теста в этом классе - будет вызываться createOrgTest() и делать вам "первый шаг БП".

Если тесты, которым нужен этот шаг - в разных классах, то просто вызывайте в коде тех тестов первой строкой метод createOrgTest() (в этом случае аннотация @BeforeMethod уже не требуется, можно оставить @Test для отдельной проверки этого процесса). 

 

Тогда еще одно уточнение, даже наверное два.

 

1. Кроме первого метода, у меня есть еще много которые будут повторяться каждый раз, например

 - заполняю поля карточки и кликаю на кнопку "Отправить" (метод 1)

 - проверяю почту на наличия письма, открываю его и сравниваю текст письма с ожидаемым результатом. (метод 2)

 - открываю ссылку в письме и подписываю документ который открылся. (метод 3)

..... метод (N)

 

То есть у меня например будет 4-5 методов которые всегда нужно вызывать для разных веток БП (так как на данном этапе нет никаких ветвлений в БП). А дальше идет метод который отличается от того что например был в пред идущей ветки БП.

 

В пред идущей ветке я подписал документ и БП пошел в одном направлении, а тут я отклонил документ и БП пошел по другому пути.

 

А теперь само уточнение: В первом класcе (Class1), я создаю все эти методы, аналогично тому, что я показал выше (то есть у меня будет "простыня"), а дальше например в классе (Class2) я создаю метод в котором создаю обьект класса Class1 и вызываю метод который мне нужен с этого класса?

 

2. Тут вопрос уже по testng

 

Есть первая ветка БП. Есть два класса которые проверяют эту ветку. В каждом классе 8 методов. 5 первых абсолютно одинаковые(это то что я спрашивал в первом уточнении) а 6 метод у меня идет с ветвлением (там можно либо отклонить, либо подтвердить действие) и от этого уже нужно выполнить либо метод 6,7 либо метод 7,8

 

 Код метода ниже:

@Parameters({"isFull"})
    @Test(priority = 4)
    public void registerOrgCabinet(String isFull) throws InterruptedException, AWTException {
        driver.get(ConfigFile.loginCabinetURL);
        Login login = new Login(driver,wait);
        login.setUserName(ConfigFile.loginVORVDEIR);
        login.setPassword(ConfigFile.passwordVORVDEIR);
        login.logInButtonClick();
        TaskList taskList = new TaskList(driver,wait);
        taskList.requestAndPapersLeftMenuButtonClick();
        taskList.viewAllSearchFieldsButtonClick();
        taskList.setTaskNameSearchField(Variables.getOrgName());
        taskList.searchButtonClick();
        taskList.taskLinkClick();
        Signing signing = new Signing(driver,wait);
        signing.contentWait();
        taskList.takeToWorkButtonClick();
        signing.contentWait();

        if(isFull.equals("1")) {
            taskList.approveButtonClick();
        }
        else {
            taskList.setRejectReasonField();
            taskList.rejectButtonClick();
        }
    }

Можна не обращать внимание на все что выше блока if(). 

 

Дальше сразу покажу код testng.xml

<classes
            <class name="FirstBranch_YES_YES">
                <methods>
                    <include name="initialize"/>
                    <include name="cardFillYesYes"/>
                    <include name="emailCheckForECP"/>
                    <include name="signByHead"/>
                    <include name="emailCheckAfterECPByResp"/>
                    <parameter name="isFull" value="1">
                    <include name="registerOrgCabinet"/>
                    <include name="emailCheckAfterApproveDEIRByHead"/>
                    <include name="emailCheckAfterApproveDEIRByResp"/>
                    </parameter>
                </methods>
            </class>
        </classes>

И так, поясню как я это вижу. В testng.xml я запускаю методы в том порядке котором идет БП. Дальше в методе registerOrgCabinet я передаю параметр (либо 1 - подтверждаем и выполняем методы emailCheckAfterApproveDEIRByHead и emailCheckAfterApproveDEIRByResp, либо 0 - и мне тогда нужно выполнить методы emailCheckAfterRejectDEIRByHead и emailCheckAfterRejectDEIRByResp)

 

Таким образом полный testng.xml выглядит так:

<classes
            <class name="FirstBranch_YES_YES">
                <methods>
                    <include name="initialize"/>
                    <include name="cardFillYesYes"/>
                    <include name="emailCheckForECP"/>
                    <include name="signByHead"/>
                    <include name="emailCheckAfterECPByResp"/>
                    <parameter name="isFull" value="1">
                    <include name="registerOrgCabinet"/>
                    <include name="emailCheckAfterApproveDEIRByHead"/>
                    <include name="emailCheckAfterApproveDEIRByResp"/>
                    </parameter>
                </methods>

                 <methods>
                    <include name="initialize"/>
                    <include name="cardFillYesYes"/>
                    <include name="emailCheckForECP"/>
                    <include name="signByHead"/>
                    <include name="emailCheckAfterECPByResp"/>
                    <parameter name="isFull" value="0">
                    <include name="registerOrgCabinet"/>
                    <include name="emailCheckAfterRejectDEIRByHead"/>
                    <include name="emailCheckAfterRejectDEIRByResp"/>
                    </parameter>
                </methods>

            </class>
        </classes>

Но есть подозрения что я сделал не так как надо. Может надо было два метода делать и не делать блок if, или средствами testng это можно сделать по другому

 

Извините, что так много текста вышло, но если я пойму для себя эти два момента, то дальше все станет намного проще. 


  • 0

#4 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 30 мая 2018 - 07:15

1. Селениум - это библиотека, позволяющая эмулировать Ваши действия в браузере, а testNG - делает из Ваших методов "тесты". Но если абстрагироваться от этого, Ваш код это просто обычный код на выбранном Вами ЯП (в данном случае Java) со всеми вытекающими из этого возможностями. 

Поэтому на Ваш первый вопрос, ответ - да, Вы можете создать объект другого класса и использовать его методы.

Или можете сделать их статичными и использовать их без создания объекта.

 

2. Не претендую на то, что мой подход самый-самый правильный. но в моём понимании, в xml'ке должны быть только такие тесты, порядок выполнения которых не принципиален. 

А по поводу if'а - если Ваша цель проверить две разные ситуации - то, на мой взгляд, это все же должно быть два отдельных теста (вроде registerOrgCabinetWithApprove и registerOrgCabinetWithReject) . Даже если они во многом похожи - похожую часть можно в отдельный метод вынести (это же Java, почему нет?).


  • 2

#5 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 30 мая 2018 - 08:36

1. Селениум - это библиотека, позволяющая эмулировать Ваши действия в браузере, а testNG - делает из Ваших методов "тесты". Но если абстрагироваться от этого, Ваш код это просто обычный код на выбранном Вами ЯП (в данном случае Java) со всеми вытекающими из этого возможностями. 

Поэтому на Ваш первый вопрос, ответ - да, Вы можете создать объект другого класса и использовать его методы.

Или можете сделать их статичными и использовать их без создания объекта.

 

2. Не претендую на то, что мой подход самый-самый правильный. но в моём понимании, в xml'ке должны быть только такие тесты, порядок выполнения которых не принципиален. 

А по поводу if'а - если Ваша цель проверить две разные ситуации - то, на мой взгляд, это все же должно быть два отдельных теста (вроде registerOrgCabinetWithApprove и registerOrgCabinetWithReject) . Даже если они во многом похожи - похожую часть можно в отдельный метод вынести (это же Java, почему нет?).

И еще раз спасибо! Это то что я хотел услышать, теперь со спокойной душой пойду переделывать то что уже "насоздавал", хотя подозреваю что с нуля буде проще написать.


  • 0

#6 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 30 мая 2018 - 10:05

надо использовать factory для создания объектов

 

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


  • 1


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных