正如标题所述,Nightwatch.js 和 Webdriver.io 有什么区别?
似乎它们具有相同的语法并且做几乎相同的事情。它们有何不同?
我需要在它们之间做出选择。
正如标题所述,Nightwatch.js 和 Webdriver.io 有什么区别?
似乎它们具有相同的语法并且做几乎相同的事情。它们有何不同?
我需要在它们之间做出选择。
我已经使用这些工具中的每一个编写了几次测试套件。
Webdriver.io 允许您“从头开始”编写测试用例,并且可以很好地控制报告,例如,使用 slack npm 和其他软件包与 slack 集成。您需要了解或快速学习 node.js。除了与桌面浏览器很好地配合外,它还与 Appium、Android Studio 和 Xcode 很好地集成,因此您可以在本地 Android 模拟器和 iOS 模拟器上运行自动化测试。您将需要安装这些东西并编写一些代码来告诉 Appium 要使用哪些驱动程序,并选择功能等。
Nightwatch 是一个相当广泛的解决方案,它使用迭代器在测试失败时自动重试多达 3 次。Nightwatch 对与 SauceLabs 等 VM 工具的集成提供了不错的支持,因此理论上您可以针对 700 多种不同的平台/浏览器/版本组合运行测试用例,而无需编写代码来管理每个驱动程序. Nightwatch 为您处理启动和关闭 selenium。虽然这最后一个听起来非常令人印象深刻,但实际上要达到并保持该级别的测试覆盖率需要做很多工作。Nightwatch 还具有相当内置的关注点分离,允许您定义自定义命令并在基本测试用例或单个测试中需要它们。您可以将测试的某些部分模块化并导入它们,这样您就不必不断地重写例如登录测试以供在多种情况下使用。此外,您可以使用自定义命令将选择器作为键值对导入。
使用过每一个后,我会这样总结:
webdriver.io:如果您正在寻找更多控制,一个非常自定义的解决方案并且您不需要迭代器,并且您有信心编写代码来选择您的浏览器驱动程序,设置功能并且您想要自定义控制你的报告。
Nightwatch:如果您想快速开始编写测试,要知道在特定平台/浏览器/版本上运行它们会相对容易,并且仍然允许您通过编写自定义命令来灵活地扩展测试。
现在的另一个选择是 Dalek.js,它具有 Nightwatch 的简单脚本创建,但没有所有的花里胡哨。
在运行 nightwatch 之前,您可以在 Magellan.json 文件中配置浏览器,然后在运行测试时调用浏览器或一组浏览器(“配置文件”)作为命令行参数,因此:
对于本地浏览器:
./node_modules/.bin/magellan --serial --browsers=chrome,firefox
假设您已经设置了一个 saucelabs 帐户并添加了您的用户名和访问密钥,您可以像这样调用浏览器的配置文件:
./node_modules/.bin/magellan --serial --profile=myBrowsers
这假设您在 Magellan.json 文件中设置了一个名为 myBrowsers 的配置文件,如下所示:
{
"profiles": {
"myBrowsers": [
{ "browser": "chrome_46_OS_X_10_10_Desktop" },
{ "browser": "firefox_42_Windows_2012_R2_Desktop" },
{ "browser": "safari_8_OS_X_10_10_Desktop" },
{ "browser": "safari_7_OS_X_10_9_Desktop" },
{ "browser": "safari_9_OS_X_10_11_Desktop" },
{ "browser": "IE_10_Windows_2012_Desktop" },
{ "browser": "IE_11_Windows_2012_R2_Desktop" },
{ "browser": "chrome_45_OS_X_10_8_Desktop" },
{ "browser": "chrome_45_OS_X_10_9_Desktop" },
{ "browser": "chrome_45_OS_X_10_10_Desktop" },
{ "browser": "chrome_45_OS_X_10_11_Desktop" },
{ "browser": "chrome_46_OS_X_10_10_Desktop" },
{ "browser": "chrome_45_Windows_10_Desktop" },
{ "browser": "chrome_45_Windows_2003_Desktop" },
{ "browser": "chrome_45_Windows_2008_Desktop" },
{ "browser": "chrome_45_Windows_2012_Desktop" },
{ "browser": "chrome_45_Windows_2012_R2_Desktop" },
{ "browser": "chrome_46_Windows_10_Desktop" },
{ "browser": "chrome_46_Windows_2003_Desktop" },
{ "browser": "chrome_46_Windows_2008_Desktop" },
{ "browser": "chrome_46_Windows_2012_Desktop" },
{ "browser": "chrome_46_Windows_2012_R2_Desktop" },
{ "browser": "firefox_42_OS_X_10_9_Desktop" },
{ "browser": "firefox_42_Windows_2012_R2_Desktop" },
{ "browser": "android_4_4_Linux_Samsung_Galaxy_S4_Emulator", "orientation": "portrait" },
{ "browser": "ipad_8_4_iOS_iPad_Simulator", "orientation": "landscape"},
{ "browser": "ipad_8_4_iOS_iPad_Simulator", "orientation": "landscape"},
{ "browser": "ipad_9_0_iOS_iPad_Simulator", "orientation": "landscape"},
{ "browser": "ipad_9_0_iOS_iPad_Simulator", "orientation": "portrait"},
{ "browser": "ipad_9_1_iOS_iPad_Simulator", "orientation": "landscape"},
{ "browser": "ipad_9_1_iOS_iPad_Simulator", "orientation": "portrait"},
{ "browser": "iphone_9_1_iOS_iPhone_Simulator", "orientation": "portrait"},
{ "browser": "iphone_9_1_iOS_iPhone_Simulator", "orientation": "landscape"}
]
}
}
一些更有用(可选)的命令行参数:
切换 --serial 参数会导致测试执行被序列化,并具有更详细的测试体验,您可以在其中查看运行期间返回的错误。在等待测试完成时运行也需要更长的时间。
一旦您的测试用例适用于本地计算机上存在的浏览器,添加 --sauce 参数,您就可以利用 Sauce Labs 支持的(当前)760 个浏览器。继续将其粘贴到终端并点击返回:
./node_modules/.bin/magellan --serial --list_browsers
对于您要测试的每个设备/浏览器,您只需在执行脚本时在 --browser= 之后将列表作为逗号分隔值添加到 Copy-Paste Command-Line Option 列中。注意:在没有 --sauce 的情况下运行时,您可以使用 --browser=chrome 或 --browser=chrome,firefox
BREAKING IT DOWN:
使用不带 --sauce 但带 --serial 的 nightwatch 是一个很好的入门方法。在你的脚本上工作,直到你验证了你想要检查的东西,并且当你确信所有应该通过的测试,做,用酱实验室和你想要测试的主要浏览器运行它。一旦您确信涵盖了主要浏览器,您就可以在不使用 --serial 的情况下运行它以减少运行时间(在 Sauce Labs 上很有用,这需要花钱)。
但是足够的传教,你可以在这里找到你需要的关于 Saucelabs 的东西: https ://wiki.saucelabs.com/display/DOCS/The+Sauce+Labs+Cookbook+Home
对于 Nightwatch 的样板示例来做规范的 hello world:试试这个样板
更新:人们提出的几点,自发布后我就想到了。
Webdriver.io:由于没有迭代器,因此在测试执行期间从失败中恢复的能力较少,这意味着失败更加确定。因为这纯粹是异步的,所以您可能很难追踪故障的确切来源。您可能最终还必须为您创建的任何数据创建单独的拆卸脚本,以避免在执行期间发生数据冲突。
Nightwatch.js:由于迭代器允许您重试,您通常能够找到脚本失败的地方。这可以让您更快地找到缺陷,而不是专注于脚本失败的原因。关闭您的单个脚本也更容易。
更新 2:
对于 Nightwatch,较短的测试是有用的/鼓励的。因为迭代器在每次迭代执行前立即将测试文件读入内存,所以您可以非常准确地在迭代执行之间编辑测试。让我换一种方式说:您的守夜人套件:
test_1 starts
test_1 FAIL // because you made a trivial error in your test case
test-2 starts // while it is running, you make the change, save it
test-2 PASS
test_1 starts // the iteration starts * with your change! *
test_1 PASS
============= Suite Complete =============
Status: PASSED
Runtime: 2m 48.3s
Total tests: 2
Successful: 2 / 2
1 test(s) have retried: 1 time(s)
另一方面,使用 node/webdriver.io 设置 Slack webhooks 很容易。这意味着您可以设置 node/webdriver.io 测试以在完成时向 Slack 报告。客户对此表示赞赏,因为在构建完成后,他们很快就会看到自动化的结果,例如:
✅ [client/product name here] Sprint ##.#.# 使用 OS X Firefox 59.0.2 在 [server URL or IP address] 上传递的自动化测试
❌ 使用 OS X Firefox 59.0.2 在 [服务器 URL 或 IP 地址] 上对 [客户端/产品名称] Sprint ##.#.# 进行自动化测试失败
更新 3(2017 年 8 月 6 日)
又花了一年半的时间每天都在与两者一起工作,我想补充以下几点。
有类似数量的 NPM 包与每个包集成,但您会注意到关于 Nightwatch (4x) 的 Stackoverflow 问题要多得多。我相信这是因为 Webdriver.io 更像是一种自己动手的自动化测试方法[这是我的观点,我欢迎反馈/回击]。那些使用它的人不会有关于如何使用它的问题,他们会有关于技术的具体问题。
对于拥有丰富的 Selenium IDE 和扎实的 JavaScript 经验的人来说,Nightwatch 将是一个更好的切入点。它有很多开箱即用的有用解决方案。我对 Dalek 的一点经验表明,这同样是一个不错的选择。
拥有更多 javascript 以及一些面向对象编程和 unix 经验的人可能会发现 Webdriver.io 更好。正如我目前正在做的那样,构建自己的自定义框架只是一个很好的选择。如果您可以设想您希望您的初始化、流程控制和报告如何工作,并且愿意投入大量资金,那就很合适了。
下面有人问我更喜欢哪个,到目前为止,我更喜欢 Webdriver.io 进行广泛的 e2e 测试。虽然我经常将个性化的 Nightwatch 存储库用于构建在我们平台之上的大多数客户工作,但随着我构建自己的 Webdriver.io 解决方案,这种情况可能会在不久的将来发生变化。
更新 4(2018 年 5 月 2 日)
更新了关于控制 Selenium 和浏览器驱动程序的清晰性,并添加了一些关于使用 Appium 和 Xcode/Android Studio 的细节。