运行 在 E2E 测试中使用量角器 'it' 几个小测试

Run several small test within one 'it' in E2E test using Protractor

我正在为 Angular2 中的单页 Web 应用程序进行 E2E 测试。 页面上有很多可点击的标签(没有重定向到其他页面,但点击时有一些 css 效果),它们之间有一些逻辑。我想做的是,

我设置了两个常量totalRoundITER,我会加载网页totalRound次,然后在每个加载页面中,我会随机选择并点击按钮ITER次。

我的代码结构是这样的:

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(),等等。

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

我以为JS是单线程的。 (没拿OS,错了指正) 所以在for循环里,毕竟是async。函数完成初始化,全部嵌套异步。功能(每个循环一个)仍然需要 运行 一个一个,如我所愿?所以在大多数情况下,代码仍然像我希望的那样执行?

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

while(i > innerTurn){
    ;
}

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

最后用promise解决了问题

基本上,我将每个小 sync/async 函数放入单独的 promise 中,然后使用链接来确保后面的函数只会在前面的函数被解析后调用。

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

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

因此,每个单击测试在完成时都会 return 一个解析信号。只有这样,下一轮才会运行,numLeft减1,当numLeft为0时,整个测试结束

此外,我尝试使用Python重写整个程序。看起来代码可以很容易地按顺序 运行 。我没有遇到 Protractor 中的问题,我的第一次尝试一切正常。我需要测试的应用程序具有相对简单的逻辑,因此本机 Selenium 对我来说似乎是更好的选择,因为它不需要 运行 使用前端代码(只需访问 webapp url 并获取数据并进行处理),我对 Python 更有信心。