我应该如何构建包含Selenium代码(用于设置页面)和客户端Mocha代码(用于在正在测试的客户端JS上实际执行测试)的测试?
我正在测试客户端javascript库。单元测试与Karma,Mocha和Grunt配合使用。单元测试可以在本地运行,也可以通过SauceLabs运行。单元测试基本上可以测试文件实际提交的部分。这部分需要浏览器自动化和/或手动交互,这就是我正在努力解决的问题。
有问题的库是一个Javascript文件上传库。它具有分块,自动恢复等功能。它不需要jQuery,它适用于各种浏览器(IE7-10,FF,Safari(Mac& iOS),Chrome,Android股票浏览器)。因此,这些测试中涉及很多案例和例外。
基本上,我需要使用Selenium来设置页面。由于我正在测试客户端JS文件上传库,我需要使用Selenium以编程方式提交文件,以便实际上传。提交此文件后(相当于从尝试上传文件或文件时出现的对话框窗口中选择文件)然后可以运行客户端测试以确保UI具有已正确绘制,已找到该文件等。
我正在尝试如何正确地测试这一点,以及如何设置我的测试套件以便将来可扩展,强大,简单/易于使用。
我应该使用Selenium注入JS代码以运行客户端吗?
一个想法是在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。我必须提出一些存储和加载加载的客户端脚本的约定。另外,两个不同的测试将有两个不同的注入脚本,所以我们在我们的回购中有大量的一次性使用脚本。我也害怕走这条路,发现这是一个糟糕的决定或不可能。
任何人都有这方面的经验吗?
模拟服务器......我需要一个。
我可以使用Sinon.js使客户端模拟服务器,或nock具有单独的服务器端模拟服务器。服务器超级简单,但我相信我需要能够断言客户端来自服务器的响应是预期的。
拦截客户端测试结果
与上述类似,在使用Selenium自动化浏览器时,如何在客户端代码中拦截asserts
。例如,假设我想测试我的库和模拟服务器之间的请求 - 响应周期,我想验证如果我的库向服务器发送请求A,它将期望响应A. Selenium无法测试。我需要能够asserts
捕获客户端并通过Selenium输出。
在我的脑袋里试图找出最好的方法。如果有人有任何类似的经验,请,请加入!
答案 0 :(得分:1)
我根本不会混用这两种类型的测试。你有几个不同的顾虑。您仍然可以获得完整的测试覆盖率,而无需像您所描述的那样组合测试。
您可以创建Karma / Mocha单元测试,以验证该文件上载操作可能存在的任何处理的详细信息。在这里,您应该在UI下测试各个JavaScript函数的边缘情况。
然后,您可以创建Selenium测试,以纯粹测试上传操作和上传文件的预期结果。您可以验证页面上是否存在正确的元素,并在上载后具有预期的属性。在这种情况下,JavaScript是一个黑盒子。您正在从用户的角度进行测试。这将执行您已经过单元测试的一些代码,但重点是测试前端和后端之间的连接。