Cypress условно бросить бегун / тест - PullRequest
0 голосов
/ 10 июня 2019

Итак, я построил команду, которую я использую в нескольких тестах, которая просматривает страницу, и, если есть приглашение, страница перенаправляется на другую страницу для обработки запроса (в этом случае утверждение расписания). Затем он дополнительно просматривает эту новую страницу и, если вместо этого на странице есть какой-то текст, он перенаправляет на домашнюю страницу (где находится проблема) ИЛИ нажимает кнопку для подтверждения и перенаправляет на домашнюю страницу и обычно проходит тестирование.

Cypress.Commands.add('approval_redirect', () => {
  cy.get('body').then(($body) => {
    if ($body.text().includes(
        'You must approve your weekly schedule before starting!'
      )) {
      cy.get('.container a')
        .first()
        .click()
      cy.get('main').then(($main) => {
        if ($main.text().includes('schedule')) {
          cy.get('button')
            .click()
          cy.pause()
        } else {
          cy.get('ul > button')
            .click()
        }
      })
    }
  })
})

Прямо сейчас, если он идет на новую страницу, чтобы проверить расписание, и НЕ имеет кнопки, чтобы нажать, он возвращается домой и затем останавливается. Я поставил на паузу, потому что тогда он продолжил бы тест с большими сбоями.

Так, например, в одном тесте у меня есть:

it('starts here', function (){
 cy.login()
   .wait(1000)
 cy.approval_redirect()
 cy.get('#Route')
   .click()
   .wait(1000)
})

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

Есть ли способ полностью остановить бегуна? Как мне вставить это в мой тест, чтобы проверить команду на сбой?

Я думал, что мог бы просто обернуть функцию вокруг команды что-то вроде:

function findFailure(failure,success){cy.get...}

Тогда вместо cy.pause () я ставлю

failure();
return;

А под кнопкой ul> ставлю

success();
return;

Тогда в моем тесте я сделал:

it('starts here', function (){
 cy.login()
   .wait(1000)
 cy.approval_redirect()
 const failure = function(){
  this.skip()
 }
 const success = function(){
  cy.get('#Route')
    .click()
    .wait(1000)
 }
})

Нет ошибок, и тест выполняется, но сейчас он фактически не проходит через команду. Так как мне условно прекратить кипарис?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Через некоторое время я заметил проблему с моим условным выражением, так как он искал, было ли приглашение, затем перейдите к расписанию;затем, если определенного текста там не было, тогда идите домой (где жила пауза / желание прервать) ИЛИ нажмите на кнопку, идите домой и закончите.Я заметил, что я не вставил еще одно условие при первом условии.

Мое решение состояло в том, чтобы просто создать функцию, которая содержала бы все шаги для полного теста, без перенаправлений / перенаправлений, которые имели нажатие кнопки.Затем я вставил в сбои консольный журнал о том, что случилось, чтобы закончить тест.Что-то вроде:

cy.log('Schedule not approved, redirected, no published schedule. Test ended.')

Это дает чистый конец / разрыв теста.Хоть бы завершение успеха / неудачи было бы замечательно.

0 голосов
/ 19 июня 2019

Это интересно. Я высоко ценю вашу находчивость, особенно потому, что Cypress испытывает сильные чувства, когда дело доходит до условного тестирования из-за его асинхронного характера.

У меня недавно была похожая проблема. Для меня ничего на странице не было кликабельно в определенный момент, если была активность в сети, и появлялся тост с надписью «Загрузка ...», и ничего нельзя было сделать, пока не было выполнено сетевое действие и тост не исчез. По сути, мне нужно было, чтобы страница ждала столько времени, сколько нужно, чтобы тост исчез, прежде чем продолжить (таким образом, условное тестирование).

То, что я сделал, было примерно так: В commands.js:

Cypress.Commands.add('waitForToast', () => {
  cy.get('toast-loading', {timeout: 20000}).should('not.exist');
});

Затем в фактическом test.spec.js, используя команду:

cy.waitForToast();

Здесь происходит то, что Cypress приостанавливает тестирование, ищет тост и ждет с тайм-аутом 20000 миллисекунд. Если тост застрянет, тест завершится неудачей. Если тост исчезнет, ​​тест продолжится.

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

В вашем случае вы можете утверждать, что не пошли домой.

С другой стороны

Если вы хотите, чтобы тест просто завершился без подтверждения и сбоя, вы можете попробовать что-то вроде этого:

cy.get('home-page-item`)
   .its('length')
   .then(numberOfItems => {
      if (numberOfItems > 0) {
      DO-NOTHING-ASSERT
      } else {
      CONTINUE-TEST
      }
   });

В противном случае я не думаю, что у Cypress есть что-то вроде cy.abortTest(), поэтому вам придется обойти их методологию антикондиционного тестирования с утверждениями или, если что-то еще.

...