背景:基于JavaScript的自动化框架在很大程度上依赖于异步执行,承诺,回调,匿名函数等,它们固有地复杂,对于UI测试自动化等直截了当的任务来说可能是过大的杀伤力,因为我们需要根据一些定位符来识别对象并执行操作。 br />
问题陈述:考虑到JavaScript的基本异步特性,为什么我们应该选择JavaScript作为UI测试自动化的语言?
选择JavaScript作为测试自动化的语言有何取​​舍? />
免责声明:我使用量角器设计了几个大型自动化框架,用于多个应用程序,但是我想了解选择JavaScript作为UI测试自动化语言的折衷方案吗?

注意:我最初是在Stack Overflow上提出这个问题的,但是由于没有得到太多的回应,因此认为这可能是一个更好的平台,因为它只专注于质量检查。

其他类似的问题:我也看到了其他较接近的问题(如Peter所言),但我认为这个问题是基于这样的前提,即我们已经拥有大量使用python /其他语言编写的测试库,但我又往后退一步,在该测试中甚至没有任何测试考虑到它固有的复杂性和对UI自动化之类的直接任务的古怪之处,我们甚至应该甚至将JavaScript视为用于UI测试自动化的语言吗?

评论

使用Python后端对Angular应用进行E2E测试的可能重复:Protractor / JavaScript与Webdriver / Python

或解释为什么您的问题与众不同

彼得,我认为这个问题是基于这样一个前提,即我们已经拥有大量使用python /其他语言编写的测试基础,但我又向前迈进了一步,我们甚至没有使用任何语言进行任何测试。作为UI测试自动化的语言?

有道理。在这种情况下,它不是重复的。就我个人而言,我非常喜欢Python而不是JavaScript,并且几乎会做任何避免JavaScript的事情。我以前曾经被类似的语言(Perl)所困扰,并且不想再经历相同的经历。

感谢Peter理解我的观点。我还非常喜欢Python / Ruby而不是javascript,特别是在我只处理UI测试自动化的情况下。我看不出将JavaScript及其所有怪癖用于UI测试自动化的意义。 />

#1 楼

是的-对于Java单元测试
,过去几年来我一直在使用这种概念,下面是多层方法:

后端的单元测试。例如,在服务器代码上使用Ruby或Java。
使用Selenium在UI上进行用户接受测试,例如使用Capybara的Ruby等编程语言在
在Jasmine,Konacha进行前端单元测试(Mocha / Chai )等。

所以我最近将javascript测试视为第三项。它使用固定的HTML片段对实际网页进行模拟和存根,以使js可以使用-这就是使其成为一个单元而不是集成或功能测试的原因。最初,我一直对此表示抵触(“但是,如果页面更改了怎么办?”),直到我理解了这种分类并且Selenium测试将涵盖Web页面更改的情况。
茉莉花:行为驱动的开发框架用于测试JavaScript代码。它不依赖于任何其他JavaScript框架。它不需要DOM。它具有简洁明了的语法,使您可以轻松编写测试。
量角器:用于Angular和AngularJS应用程序的端到端测试框架。量角器针对在真实浏览器中运行的应用程序运行测试,并与用户进行交互。
Mocha:在Node.js和浏览器中运行的功能丰富的JavaScript测试框架,使异步测试变得简单而有趣。
Chai:Chai是用于节点和浏览器的BDD / TDD断言库,可以与任何javascript测试框架完美地配对。
QUnit:QUnit是功能强大,易于使用的JavaScript单元测试框架。 。它由jQuery,jQuery UI和jQuery Mobile项目使用,并能够测试任何通用JavaScript代码,包括其自身!

评论


感谢Michael提出了一个有趣的想法。能否请您详细说明一下如何在前端使用JavaScript进行单元测试,可能是一个链接或几个基本代码示例将非常有用。再次感谢,这是相当新的东西对我来说很有趣

– Vishal Aggarwal
17-4-29在10:31



添加了到各种库的链接。您需要阅读并根据需要提出更多(特定)问题。在这个具体问题上无法详细说明。

–迈克尔·杜兰特(Michael Durrant)
17年5月2日,11:19

我们用来专门测试我们编写的javascript代码

–迈克尔·杜兰特(Michael Durrant)
17年5月2日,11:20

感谢Michael的信息,但是我已经知道我正在使用量角器进行e2e测试,并使用/开发了这些库,但是我的具体问题是关于使用JavaScript从UI进行单元测试。无论如何,再次感谢您提出了一个有趣的想法。

– Vishal Aggarwal
17年5月2日,11:33

+1 @AlanLarimer添加了QUnit thx!

–迈克尔·杜兰特(Michael Durrant)
18年4月3日在19:00

#2 楼

我们最近开始使用JavaScript编写WebDriver测试,我必须同意异步执行会增加不必要的复杂性。

专业版:


相同的测试-作为其他(前端)单元测试的亚军
每个人都了解JavaScript(例如,使用Angular,Vue或React进行前端开发)
如果您还在后端使用JavaScript(例如,NodeJS),坚持使用一种语言是有道理的JavaScript几乎无济于事)

我们之所以选择JavaScript,是因为Java是不行的,因为我们的后端在C#中。同样的经验告诉我不要在堆栈中添加更多的编程语言,当然不是任何开发人员都没有经验的。对于Google来说,C#WebDriver问题和JavaScript一样难。另外,我认为C#绑定与Java和JavaScript不一样,因为它们在github上提交的次数更少。

JavaScript UI测试框架:

可以隐藏Async的复杂性使用JavaScript测试框架,例如:



CodeceptJS

噩梦

Nightwatch.js


Cypress(Cypress完全取代了Selenium)

我们之所以选择不研究或使用这些框架,主要是因为我们的其他团队之一决定使用纯硒Web驱动程序进行测试。

通过Nightwatch.JS,我创建了一个最小的测试(使用PageObject模型),并且运行良好。 br />

评论


感谢Neils提供的详细答案,但是我在几点上仍不清楚您的答案。您是否建议我们在应用程序开发的前端和后端使用JavaScript,那么我们也应该在测试自动化中使用JavaScript吗?

– Vishal Aggarwal
17年1月26日在23:02

是的,我建议。主要原因是,除非您非常精通某种语言,否则在编程语言之间进行上下文切换非常昂贵。对我而言,使用Python意味着每次我都要编写一个UI测试,而且每个功能我们只编写1或2个UI测试(我们主要尝试使用单元测试来测试代码),因此我会使用Google谷歌搜索语法。我永远都不会变得很好。我认为,即使简单了十倍,我们的团队也会变慢。另外,我们当前的IDE不支持Python,因此我们需要使用两个IDE。

– Niels van Reijmersdal
17年1月27日在6:11

我注意到,向团队添加额外的编程语言不是一个好主意,对于初级的团队成员来说肯定不是。现在,如果您有专门的测试人员,也许可以使用,但是如果高级开发人员可以协助他们创建测试,仍然比较麻烦。如果每个人都使用他们熟悉的语言,那将非常方便。最后让团队决定。他们将需要长时间维持测试。

– Niels van Reijmersdal
17年1月27日在6:14



#3 楼

正如您所提到的,“ selenium-webdriver” NPM程序包中以及夜表,量角器,testcafe,赛普拉斯,实习生和wd.js等中看到的异步链接API可能很难理解。

幸运的是有一种方法可以在Node中编写E2E测试,并且仍然可以获得直观且同步的API,即http://webdriver.io

Webdriver.io之所以能够做到这一点,是因为它使用了node-fiber包中的协程来暂停执行直到异步webdriver操作完成为止。

我还对Javascript E2E框架进行了深入比较,涵盖了JS的E2E测试这一方面。它还有一部分讨论了为什么JavaScript E2E与用Java编写测试用例相比是个好主意。