Есть ли способ выполнить конкретный тест Транспортира в зависимости от результата другого теста? - PullRequest
0 голосов
/ 05 июля 2019

Этот вопрос задавался ранее, но большая часть этого вопроса имеет довольно сложный фон.Сценарий прост.Допустим, мы тестируем наше любимое приложение TODO.Ниже приведены контрольные примеры: TC00 - «Пользователь должен иметь возможность добавить элемент TODO в список TODO» TC01 - «Пользователь должен иметь возможность переименовать элемент TODO» TC02 - «Пользователь должен иметь возможность удалить элемент TODO» Я нехотите запустить TC01 и TC02 в случае сбоя TC00 (элемент TODO не добавлен, поэтому мне нечего удалять или переименовывать)

Итак, я изучал этот вопрос в течение последних 3 дней и наиболее частоОтветы на этот вопрос таковы: • Ваши тесты не должны зависеть друг от друга • У транспортира / Жасмина нет функции динамического включения / выключения тестов (блоки it) Причина, по которой я задаю этот вопрос, заключается в том, что он выглядиткак очень распространенный случай и до сих пор нет четкого предложения, чтобы справиться с этим (я имею в виду, я не мог найти какие-либо) Мои навыки javascript плохие, но я понимаю, что мне нужно поиграть, скажем, «прохождение» сделано или добавление if с помощьюtest inside ...

it('should add a todo' ()=> {
  todoInput.sendKeys('test')
  addButton.click();
  let item = element(by.cssContainingText('.list-item','test')
  expect(item.isPresent()).toBe(true)
}

В моем случае после добавления элемента в список примерно 15 тестов (блоков 'it').И я хочу пропустить НЕКОТОРЫЕ из тестов, если «родительский» тест не пройден.ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Существует решение, которое позволяет пропустить ВСЕ оставшиеся испытания, если они не пройдены.Это не соответствует моим потребностям

Ответы [ 2 ]

1 голос
/ 05 июля 2019

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

РЕШЕНИЕ НИЖЕ ПОСЛЕ КРАТКОЙ ТЕОРИИ

1) Если вы попытаетесь передать асинхронную функцию вdescribe вы видите, что он потерпит неудачу, потому что он принимает только синхронную функцию

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

if (conditionIsTrue) { // can't be Promise
  it('name', () => {
  })
}

Это первое, что нужно учитывать ... 2) Когда вы запускаететранспортир, он выбирает спецификации файлов, указанных в конфигурации, и создает очередь из блоков describe/it AND beforeAll/afterAll.ВАЖНАЯ ИНФОРМАЦИЯ ЗДЕСЬ, ЧТО ЭТО ПРОИСХОДИТ ПЕРЕД НАЧАЛОМ БРАУЗЕРА.

Посмотрите на этот пример

let conditionIsTrue; // undefined
  it('name', () => {
    conditionIsTrue = true;
  })
if (conditionIsTrue) { // still undefined
  it('name', () => {
  })
}

К тому времени, когда транспортир достигнет утверждения if(), значение conditionIsTrue все ещеundefined.И он может быть перезаписан внутри блока it при запуске браузера позднее, но не при построении очереди.Поэтому он пропускает его.

ВОЗМОЖНОЕ РЕШЕНИЕ Определите глобальную переменную вне describe

let conditionIsTrue; // undefined
describe("describe", () => {
  it('name1', async () => {
    conditionIsTrue = await element.isPresent(); // NOW IT'S TRUE if element is present
  })

  it('name2', async () => {
    if (conditionIsTrue) {
      //do whatever you want if the element is present
    } else {
      console.log("Skipping 'name2' test")
    }
  })
})

Так что вы не пропустите сам блок it,однако вы можете пропустить что-нибудь внутри it

Еще одна возможность, которую я обнаружил, но у которой никогда не было возможности проверить, - это использовать средство запуска задач Grunt, которое может помочь вам реализовать следующий сценарий

  • Запуск транспортира для выполнения одной спецификации
  • Проверка нужного условия
  • Экспорт этого условия в переменную среды
  • Выход из транспортира
  • В вашей реализации задачи Gruntусловная логика для выполнения остатков условных спецификаций путем повторного запуска транспортира

Но, честно говоря, я не понимаю, почему вы захотите пройти этот трудоемкий маршрут, который требует много кода... но как FYI

0 голосов
/ 05 июля 2019

Protractor предлагает один способ, который может достичь того, чего вы хотите достичь. В конфигурационном файле транспортира вы можете использовать функцию onPrepare. На самом деле это функция обратного вызова, вызываемая, когда транспортир готов и доступен, и до того, как спецификации будут выполнены. Если запущено несколько возможностей, они будут запускаться один раз для каждой возможности.

Теперь, насколько я понимаю, вам нужно выполнить тест, или мы можем сказать, выполнить родительскую функцию, а затем, основываясь на ее результатах, вы хотите запустить некоторые тесты и не хотите запускать другие тесты.

Функция onPrepare в конфигурационном файле транспортира будет выглядеть так:

onPrepare: async () => {
        await browser.manage().window().maximize();
        await browser.driver.get('url')
        // continue your parent test steps for adding an item and at the last of function you can assign a global variable say global.itemAdded = true/false based on the result of above test steps. Note that you need to use 'global.' here to make it a global variable which will then be available in all specs 
}

Теперь в вашем файле спецификаций вы можете запускать тесты (it ()) на основе значения переменной global.itemAdded

if(global.itemAdded === true) {
  it('This test should be running' () => {
  })
}

if(global.itemAdded === false) {
  it('This test should not be running' () => {
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...