Выполните несколько небольших тестов в одном «it» в тесте E2E с помощью Protractor - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в JavaScript и работаю над тестом E2E для одностраничного веб-приложения в Angular2.По сути, на странице есть много кликабельных тегов (не перенаправляемых на другие страницы, но имеющих некоторый эффект CSS), с некоторой логикой между ними.Я пытаюсь сделать следующее: {случайно щелкнуть тег, проверить правильность ответа на странице или нет (для этого нужно извлечь много компонентов из Интернета), а затем снять его}.

Итак, я установил два const как totalRound и ITER, которые я загружал бы на totalRound веб-страницы, затем на каждой странице загрузки я выбирал случайным образом и нажимал кнопку ITER times.

Моя структура кода выглядит следующим образом:

let totalRound: number = 10;
let ITER: number = 100;

describe('XX Test', () => {
    let page: AppPage;

    beforeEach(() => {
       page = new AppPage();
    });

    describe('Simulate User\'s Click & Unclick',() => {
        for(let round = 0; round < totalRound; round++){
            it('Click Simulation Round ' + round, () =>{
                page.navigateTo('');
                let allTagFinder = element.all(by.css('someCSS'));
                allTagFinder.getText().then(function(tags){
                let isMatched: boolean = True;
                let innerTurn = 0;

                for(let i = 0; i < ITER; i++){

                    /* Randomly select a button from allTagFinder,
                      using async func. eg. getText() to get more info
                      about the page, then check if the logic is correct or not.
                      If not correct, set isMatchTemp, a local variable to False*/

                    isMatched = isMatched && isMatchTemp;
                    innerTurn += 1;
                    if(innerTurn == ITER - 1){
                        expect(isMatched).toEqual(true);
                    }
                }                   

                });
            });
        }

    });
});

, поэтому я хочу получить результат после каждой проверки кнопки ITER со страницы загрузки.Внутри цикла for код вложен для асинхронных функций, таких как getText () и т. Д.

В большинстве случаев код работает правильно (выглядит, что проверки кнопок выполняются последовательно).Но все же иногда кажется, что информация двух итераций была противоречивой.Я предполагаю, что есть некоторая проблема с моей структурой кода для асинхронности.

Я думал, что JS является однопоточным.(не брал ОС, поправьте меня, если не так) Так что в цикле for, после всего асинхронного.инициализация функции завершена, все вложено асинхронно.Функция (одна для каждого цикла) все еще должна запускаться одна за другой, что я хочу?Так что в большинстве случаев код по-прежнему работает так, как я надеюсь?

Я пытался добавить блокировку в цикл for, например:

while(i > innerTurn){
    ;
}

Я хотел бы, чтобы это могло заставить цикл работатьбыть запущенным последовательно.Так что за асинхронность.func из индекса 1 ~ ITER-1, он должен ожидать первую асинхронность.закончите свою работу и увеличьте innerTurn на 1. Но он просто не может даже вернуть первый асинхронный сигнал (i = 0) ...

Заранее благодарим за любые предложения.

1 Ответ

0 голосов
/ 17 декабря 2018

Наконец, я использовал обещание для решения проблемы.

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

В ITER для проблемы с циклом я использовал подход с рекурсией и обещанием:

var clickTest = function(prefix, numLeft, ITER, tagList, tagGsLen){
  if(numLeft == 0){
    return Promise.resolve();
  }

  return singleClickTest(prefix, numLeft, ITER, tagList, tagGsLen).then(function(){
    clickTest(prefix, numLeft - 1, ITER, tagList, tagGsLen);
  }).catch((hasError) => { expect(hasError).toEqual(false); });
}

Таким образом, каждый отдельный тест щелчка будет возвращать сигнал разрешения после завершения.Только тогда будет запущен следующий раунд, и numLeft уменьшится на 1. Весь тест закончится, когда numLeft достигнет 0.

Также я попытался использовать Python для перезаписи всей программы.Кажется, код может легко работать последовательно.Я не встретил проблем в Protractor, и все работает с моей первой попытки.Приложение, которое мне нужно протестировать, имеет относительно простую логику, поэтому родной Selenium мне показался лучшим выбором, так как ему не нужно работать с кодом Frond (просто зайдите в URL веб-приложения и получите данные и выполните процесс), и яболее уверенно с Python.

...