我应该如何构建包含 Selenium 代码(用于设置页面)和客户端 Mocha 代码(用于实际在正在测试的客户端 JS 上执行测试)的混合测试?
我正在测试一个客户端 javascript 库。单元测试适用于 Karma、Mocha 和 Grunt。单元测试可以在本地运行,也可以通过 SauceLabs 运行。单元测试基本上能够测试所有内容,直到文件实际提交的部分。这部分需要浏览器自动化和/或手动交互,这就是我正在努力解决的问题。
有问题的库是一个 Javascript 文件上传库。它具有分块、自动恢复等功能。它不需要 jQuery,它适用于各种浏览器(IE7-10、FF、Safari(Mac 和 iOS)、Chrome、Android 库存浏览器)。因此,这些测试中需要涵盖很多案例和例外情况。
基本上,我需要使用 Selenium 来设置页面。由于我正在测试客户端 JS 文件上传库,我需要使用 Selenium 以编程方式提交文件,以便实际上传文件。提交此文件后(相当于从尝试在线上传一个或多个文件时出现的对话框窗口中选择一个文件),然后可以运行客户端测试以确保已正确绘制 UI,该文件已被发现等
我正在努力思考如何正确测试它,以及如何将我的测试套件设置为可扩展的、健壮的、简单/易于使用的未来。
我应该注入 JS 代码以使用 Selenium 在客户端运行吗?
一种想法是在适当的时候使用 Selenium 注入客户端 JS 代码。这是我在想的一些伪代码:
describe("A Test", function () {
it("injects some JS", function (done) {
// Assume `getClientSideScript` loads some .js file from the filesystem,
// reads its contents, and returns the contents as a string (to be executed).
browser.safeExecute(getClientSideScript('initialize'), function (err, result) {
// At this point, the client-side library is initialized on the page.
// Assume that `uploadFile` will submit a file to the `<input type='file'>`
// element
utils.uploadFile('file.jpg', function (file) {
browser.safeExecute(getClientSideScript('test_file_submission'), function (err, result) {
assert.ok(/* something about the result */);
});
});
});
});
});
对我来说,这会起作用,但看起来像一个巨大的 PITA。我必须想出一些约定来存储和加载加载的客户端脚本。此外,两个不同的测试将有两个不同的注入脚本,因此我们将在我们的 repo 中收集大量一次性使用的脚本。我也害怕沿着这条路走下去,发现这是一个错误的决定或不可能的决定。
有人对此有经验吗?
模拟服务器...我需要一个。
我可以使用Sinon.js制作客户端模拟服务器,或者使用nock拥有一个单独的服务器端模拟服务器。服务器非常简单,但我相信我需要能够在客户端断言来自服务器的响应是预期的。
拦截客户端测试结果
与上述类似,当使用 Selenium 自动化浏览器时,我如何能够
asserts
在客户端代码中进行拦截。例如,假设我想测试我的库和模拟服务器之间的请求-响应循环,并且我想验证如果我的库将请求 A 发送到服务器,它将期望响应 A。Selenium 无法测试它。我需要能够asserts
捕获客户端并通过 Selenium 输出。
一直在敲我的头,试图找出最好的方法来做到这一点。如果有人有类似的经验,请加入!