使用量角器在E2E测试的一个'it'中运行多个小型测试

时间:2018-11-22 04:15:14

标签: javascript angularjs protractor angularjs-e2e

我不熟悉JavaScript,并且正在Angular2中针对单页Web应用程序进行E2E测试。 基本上,页面上有很多可点击的标签(未重定向到其他页面,但在单击时具有一些CSS效果),并且它们之间具有一些逻辑。我想做的是,{随机单击一个标签,检查页面的响应是否正确(需要从Web上获取许多组件才能执行此操作),然后取消单击它}。

因此,我将两个const设置为totalRound和ITER,这将加载网页totalRound时间,然后在每个加载页面中,我会随机选择并单击按钮ITER次。

我的代码结构如下:

==

所以我想从加载页面检查完每个ITER按钮后得到结果。在for循环内,该代码嵌套了诸如getText()等异步函数。

在大多数情况下,代码可以正常执行(看起来按钮检查是顺序进行的)。但是仍然有时,似乎2个迭代的信息有冲突。我猜我的异步代码结构有问题。

我认为JS是单线程的。 (没有操作系统,如果有错请纠正我)所以在for循环中,毕竟是异步的。函数完成初始化,全部嵌套异步。函数(每个循环一个)仍然必须一个接一个地运行,如我所愿?因此,在大多数情况下,代码仍能按我希望的那样执行?

我试图在for循环中添加一个锁, 喜欢:

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);
                    }
                }                   

                });
            });
        }

    });
});

我希望这可以强制循环按顺序运行。因此对于异步。从索引1〜ITER-1开始的func,它必须等待第一个异步。完成其工作并将innerTurn增大1。但是它甚至无法获得第一个异步。(i = 0)返回...

非常感谢您提出任何建议。

1 个答案:

答案 0 :(得分:0)

最后我用了诺言来解决这个问题。

基本上,我将每个小型同步/异步函数放入单独的Promise中,然后使用链接确保仅在解决前一个函数之后才调用后一个函数。

对于ITER for循环问题,我使用了递归加承诺方法:

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重写整个程序。看起来代码可以轻松地按顺序运行。我没有遇到量角器中的问题,并且一切正常。我需要测试的应用程序具有相对简单的逻辑,因此本机Selenium对我来说似乎是一个更好的选择,因为它不需要运行Frond端代码(只需访问webapp url并获取数据并进行处理)即可,对Python更自信。