运行 在 E2E 测试中使用量角器 'it' 几个小测试
Run several small test within one 'it' in E2E test using Protractor
我正在为 Angular2 中的单页 Web 应用程序进行 E2E 测试。
页面上有很多可点击的标签(没有重定向到其他页面,但点击时有一些 css 效果),它们之间有一些逻辑。我想做的是,
- 随机点击一个标签,
- 检查页面的响应是否正确(需要从网络上获取许多组件才能做到这一点),
- 然后取消点击它。
我设置了两个常量totalRound
和ITER
,我会加载网页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 更有信心。
我正在为 Angular2 中的单页 Web 应用程序进行 E2E 测试。 页面上有很多可点击的标签(没有重定向到其他页面,但点击时有一些 css 效果),它们之间有一些逻辑。我想做的是,
- 随机点击一个标签,
- 检查页面的响应是否正确(需要从网络上获取许多组件才能做到这一点),
- 然后取消点击它。
我设置了两个常量totalRound
和ITER
,我会加载网页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 更有信心。