无头 JavaScript 测试 HTML5 音频/视频

Posted

技术标签:

【中文标题】无头 JavaScript 测试 HTML5 音频/视频【英文标题】:Headless JavaScript Testing HTML5 audio/ video 【发布时间】:2015-03-07 17:12:53 【问题描述】:

我知道还有很多其他类似的问题,但是答案并不能解决这个问题。

我在我的网站上使用了一个 javascript 文件,该文件使用 html 5 网络音频,并且想要对其进行单元测试。

我已经研究过将 QUnit 与 PhantomJS 一起使用,在你说任何话之前,我知道 Phantom 不支持它 (http://phantomjs.org/supported-web-standards.html) 但是我想知道是否有办法解决这个问题?

在浏览器中使用 QUnit 测试它可以正常工作,但我不想每次都使用浏览器测试它,我希望它在服务器上自动化。

其中一个测试失败的示例:

QUnit.test("isPlaying", function(assert)

    // true case
    My.Sound.play("background");
    assert.ok(My.Sound.isPlaying("background"), "The background audio is playing");

    // false case
    My.Sound.pause("background");
    assert.ok(!My.Sound.isPlaying("background"), "The background audio is not playing");
);

【问题讨论】:

我不知道 QUnit 是否与 SlimerJS 一起运行,但如果是的话,你也许可以用 SlimerJS+xvfb 做到这一点 你总是可以模拟出整个 Web Audio API...但看起来有点矫枉过正。您在这里测试的是 HTML5 Web Audio 作品,而不是您自己的代码。 使用 SlimerJS 和 xvfb 进行自动化测试相关:askubuntu.com/questions/430247/… 【参考方案1】:

正如@jakerella 已经指出的那样,测试第三方 api 是没有意义的。只关注您的功能。在这种情况下,您应该测试,无论何时您想要播放/暂停声音,都为您的声音对象(播放/暂停)调用正确的 api 方法,这些方法应该是原始实现的存根。

QUnit.test("play button should play sound when clicked", (assert) => 
    const button =  someButton; //...get your button / play trigger here
    const playStub = stub(My.Sound, 'play');

    //trigger button click

    assert.ok(playStub.called);
);

查看here 了解 QUnit 的存根功能。

【讨论】:

以上是关于无头 JavaScript 测试 HTML5 音频/视频的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的 HTML5 音频:我做错了啥?

Android不从间隔播放html5音频

使用 Javascript 播放音频元素 (html5)

如何在 iPad 上使用 HTML5/Javascript 合成音频

如何通过javascript删除html5音频播放器中的源音频文件

JavaScript + HTML5:音频在某些情况下只会播放一次