自动化Javascript单元测试..从哪里开始



我有一个网站,它的客户端使用JS,后端使用PHP,并支持MySQL数据库。我开始对所有内容进行单元测试,后端使用PHPUnit非常简单。

本着同样的精神,我想开始测试客户端,并选择了QUnit。然而,我们使用的是Kendo UI,我有点不知道如何在不重新设计轮子的情况下实现测试自动化。

假设我有一个modify.js文件,在我定义了所有内容后,我有以下jQuery:

$(document).ready(function() {
    $("#user-menu").kendoMenu();
    var modify = $('#modify');
    kendo.bind(modify, modifyViewModel);
    kendo.bind($('#numTagWindow'), numTagWindow);
    modifyViewModel.initForm();
    $(window).on("resize", function() {
        kendo.resize($("#trip"));
    });
});

这里,modify.php是一个带有一些PHP的html文件,对应于用户在修改相应设置时获得的视图。在modify.php中包含的一个单独的jsTest.js文件中,我有所有与modify.js相关的QUnit测试。

我的问题如下:这里的单元测试的标准方法是什么,自动化的还是其他的?目前,由于相同的HTML页面正在用于许多测试,我目前唯一的选择是手动尝试每个选项,看看断言是否通过。

在所述函数取决于预先选择的输入类型的情况下,情况会变得更糟。我不得不根据输入放置不同数量的预期断言(诚然,这可能是一个设计缺陷)。

我应该如何处理?是否可以使用多个$(document).ready"重置"页面并以这种方式运行测试?在这种情况下,向客户端代码提供用户输入的最简单方法是什么?

我以前从未用KendoUI测试过应用程序,但我认为它与任何其他前端库都类似。。。也就是说,您可以使用他们拥有的任何内置工具,模拟库,或者进行更多的"集成"测试,而不是单元测试。对于你上面的最简单的例子来说,嘲笑并没有那么糟糕,但你可以想象它会失控。因此,我认为集成测试是最好的,您可以使用QUnit(与jQuery一起),只需"编写"您正在测试的所有操作。

当然,您还需要有一些策略,通过重置HTML块,或者将不同的块分离到不同的测试文件中,或者其他一些方法来使测试成为原子。。。

下面是一个QUnit测试文件的超级基本示例,其中包含一个html fixture,每次测试后都会重置它。请注意,通过在源代码中使用document.ready()调用,您基本上否定了执行这些操作的能力。如果去掉这一点,使用某种init()方法,效果会更好。

<!doctype html>
<html>
  <head>
      <link rel="stylesheet" href="lib/qunit-1.14.0.css" />
  </head>
  <body>
    <div id="qunit"></div>   <!-- required! -->
    <div id="qunit-fixture">
      <!-- HTML to be reset for each test -->
      <div id="user-menu"> <!-- whatever you need in here --> </div>
      <!-- whatever other HTML you need for these tests -->
    </div>
    <script src="lib/qunit-1.14.0.js"></script>
    <script src="path/to/source-code.js"></script>
    <script>
      QUnit.test("Test some trigger", function(assert) {
        myCode.init(); // used to be in your document.ready()
        $("#someTriggerButton").click();
        assert.ok($("#someElement").hasClass("foobar"), "Ensure the element has the correct class after clicking trigger");
      });
      // Note that after this test runs, before the next test runs,
      // the HTML inside of #qunit-fixture will be reset to its value when freshly loaded
      QUnit.test("Another test", function(assert) {
        // ...
      });
    </script>
  </body>
</html>

所以有一些事情要从。。。这是用于HTML片段,而不是整个页面。当然,还有很多其他的做事方式。不幸的是,你的问题有点过于模糊,无法真正给你一个具体的"解决方案"。如果你尝试了一些东西,但遇到了问题,请在这里发布另一个问题,我们会尽力提供帮助。

最新更新