【发布时间】:2014-01-30 18:54:26
【问题描述】:
抱歉这里有争议的标题!
我已经使用 Selenium 和 Capybara 等基于 Selenium 的库进行了相当多的基于浏览器的测试(针对大量 JS 的网页)。让测试套件始终如一地工作一直是一件令人头疼的事情。是的,我知道不是在这里和那里插入对sleep() 的调用,而是应该等待DOM 元素变得可见,或者满足其他条件,yadda yadda。这一切都很好,它确实有点帮助。我会认为我做得不太对,如果不是为了......
如果不是当时,在我自己编写 Selenium 代码之前,我所咨询的公司聘请了一家专门编写 Selenium 测试套件的公司。他们派了一个据说是 Selenium 专家的人,他为我们的 Web 应用程序编写了一个完整的测试套件。需要我告诉你我们实际使用测试套件时发生了什么吗?
我得出的结论是,像 Selenium 这样的工具使用的整个方法都受到很大的竞争条件的影响。您有一个测试进程和一个单独的浏览器进程,它们通过套接字进行通信。测试过程向浏览器发送查询以找出 DOM 的状态,并且随着浏览器继续运行,计算要做什么。然后它向浏览器发送单独的消息,以模拟点击或击键等。
如果您曾经编写过多线程程序,您就会知道那是行不通的。这是一场“先检查后行动”的竞赛。如果测试过程可以冻结浏览器中的JS执行,查询其状态,模拟点击/击键,然后解冻浏览器,那么就OK了。 (就像使用锁来保护多线程程序的关键部分。)
我能想到绕过竞争条件的唯一方法是用 JS 编写每个测试用例。当然,这排除了跨越多个页面导航的测试用例。您还需要一种在每个测试用例开始时将页面重置为“干净”状态的方法。
有没有人知道用于测试浏览器内 JS“应用程序”的工具/方法,它允许像我这样的凡人编写测试套件,这些套件可以 100% 一致地运行,不会撕掉我所有的头发?
(PS。从使用 Selenium 的经验得出的另一个结论:很多免费的 jQuery 插件在人类使用页面时不会出现错误,仅仅是因为它们无法像 Selenium 那样快速点击!)
【问题讨论】:
标签: javascript unit-testing testing selenium