大约6个月前,我开始使用Protractor为我公司开发的AngularJS应用程序开发自动化测试套件。
在我做了几个月的工作之后,其他一些工作出现了,我不得不优先考虑测试套件,所以我从去年11月底/去年12月左右开始没看过它
当我停止工作时,我确保到目前为止我所做的一切都处于完全工作状态(评论/删除了我已经开始工作但尚未完成的测试等),以及承诺那个git分支。此时,我能够使用命令protractor conf.js
运行我之前编写的所有测试,我可以看到它们都按预期传递。
我最近再次检查了我的testing
分支,因为我在其他项目之间有一两天的时间,并认为我可以通过再次进行测试来利用时间。
我在检查testing
分支后做的第一件事就是尝试再次运行我的测试脚本,以确保到目前为止我实施的所有内容仍然有效。
然而,尽管大多数测试仍然通过,但是其中一些测试现在由于超时而失败,尽管我已经确保所有时序元素在我搁置测试一段时间之前仍然正常工作。
我已经尝试增加我的测试应该sleep
或wait
的时间,以确定它们失败的时间点,但这似乎没有什么区别。
现在由于超时而失败的特定测试是:
1
it('should navigate to the Config/Platform page & check the values are all correct', function() {
browser.waitForAngularEnabled(false);
browser.actions().mouseMove(configMenuBtn).perform();
browser.wait(EC.visibilityOf(pageConfigPlatformBtn), 8000).then(browser.sleep(5000).then( /*ERF(14/11/2017 @ 1630) browser.sleep() required to give DialogMgr service time to complete */
pageConfigPlatformBtn.click().then(function(){
browser.sleep(10000); /*ERF(14/11/2017 @ 1640) This line is needed- because of how the form HTML is created, it needs time to be replaced by configured HTML that is displaying the required fields */
var eth0Mode = element(by.model('modelinstances.platform.eth_0_mode'));
var eth0Address = element(by.model('modelinstances.platform.static_ip.eth_0_address'));
var eth0Netmask = element(by.model('modelinstances.platform.static_ip.eth_0_netmask'));
var eth0gateway = element(by.model('modelinstances.platform.static_ip.eth_0_gateway'));
var eth1mode = element(by.model('modelinstances.platform.eth_1_mode'));
var eth1Address = element(by.model('modelinstances.platform.static_ip.eth_1_address'));
var eth1netmask = element(by.model('modelinstances.platform.static_ip.eth_1_netmask'));
var eth1gateway = element(by.model('modelinstances.platform.static_ip.eth_1_gateway'));
expect(browser.getCurrentUrl()).toMatch(moxaConfigPlatformUrlRegExpPattern);
expect(eth0Mode.getAttribute('value')).toBe("Static IP");
expect(eth0Address.getAttribute('value')).toBe("192.168.1.127");
expect(eth0Netmask.getAttribute('value')).toBe("255.255.255.0");
expect(eth0gateway.getAttribute('value')).toBe("192.168.1.1");
expect(eth1mode.getAttribute('value')).toBe("Static IP");
expect(eth1Address.getAttribute('value')).toBe("192.168.2.127");
expect(eth1netmask.getAttribute('value')).toBe("255.255.255.0");
expect(eth1gateway.getAttribute('value')).toBe("");
})));
})
此测试的失败消息是:
应用程序应导航到“配置/平台”页面&检查值是否正确 信息: 失败:等待8002ms后超时 堆: TimeoutError:8002ms后等待超时
2
it('should navigate to the Config/Date/Time page', function() {
browser.waitForAngularEnabled(false);
browser.actions().mouseMove(configMenuBtn).perform();
browser.wait(EC.visibilityOf(pageConfigDateTimeBtn), 2000).then(browser.sleep(1000).then( /*ERF(14/11/2017 @ 1630) browser.sleep() required to give DialogMgr service time to complete */
pageConfigDateTimeBtn.click().then(function() {
expect(browser.getCurrentUrl()).toBe(VM + '/#/config/systemtime');
})));
})
此测试的失败消息是:
应用程序应导航到“配置/日期/时间”页面 信息: 失败:等待2023ms后超时 堆: TimeoutError:在2023ms之后等待超时
3
it('should navigate to the Tag Browser page (final test)', function() {
console.log("Start final Tag Browser page test");
browser.waitForAngularEnabled(false);
browser.wait(EC.visibilityOf(pagesMenuBtn), 10000).then(
browser.actions().mouseMove(pagesMenuBtn).perform().then(
browser.wait(EC.visibilityOf(pageConfigDateTimeBtn), 2000).then(browser.sleep(1000)).then( /*ERF(14/11/2017 @ 1650) browser.sleep() required to give DialogMgr service time to complete */
browser.wait(EC.visibilityOf(pageTagBrowserBtn), 12000).then(
pageTagBrowserBtn.click().then(
function() {
console.log("Tag Browser menu button clicked");
}).then(
browser.wait(EC.visibilityOf(tagBrowserPageTagsLink), 20000).then(
function(){
console.log("End Tag Browser page test (then call)");
expect(browser.getCurrentUrl()).toBe(VM + '/#/pages/tagbrowser');
}
)
)
)
)
)
);
});
此测试的失败消息是:
应用程序应导航到“标记浏览器”页面(最终测试) 信息: 失败:在2009ms之后等待超时 堆: TimeoutError:在2009ms之后等待超时
我已经尝试增加wait()
来电通过的次数,但这还没有解决问题。
我过去曾经读过,自动化测试可能非常复杂,而且运行环境的变化会导致它们失败 - 所以我猜测可能是因为我的计算机会发生变化测试最后一次成功运行(即安装了新软件),这可能导致测试失败......?
是否有一种“最佳实践”方法可以通过自动化测试来解决此类问题,或者只是需要返回并调整我的测试脚本直到它们再次开始传递?
值得一提的是,我的所有测试都是用spec.js
文件编写的,而这些失败的测试是该文件中18个测试脚本中的最后3个(即前15个仍然通过)。
任何人都有任何想法如何解决这个/让我的测试再次通过?