11

在开发一个包含越来越多 JavaScript 代码的大型 Web 应用程序时,我们就如何提高代码质量进行了一次头脑风暴会议。

最初的想法之一是引入单元测试。这将是一个长期目标;然而,这并不能解决最常见的回归原因:不断变化的 DOM 和浏览器特定问题。

单元测试在模拟的、无 DOM 的环境中运行,并且不在页面上。

我正在寻找的是一个断言框架,它可以像这样插入到代码中:

var $div = $("div.fooBarClass");
assertNotEmpty($div);
$div.fooBarAction();

我找到了可以做到这一点的断言框架,但它们要么登录到控制台或登录到 DOM,要么打开一个愚蠢的弹出窗口。这些都不能与(数千个)自动化测试一起工作。 我正在寻找的是一个运行时断言框架,它通过 AJAX 记录失败的断言!理想情况下,它应该是:

  • 内置通用断言。
  • 与 JQuery 模块、闭包集成。
  • 记录(通过 Ajax)断言、文件名、页面、行号、失败原因、环境的一些预配置变量(浏览器、发布版本等)。
  • 支持失败时的回调。(如果任何断言框架都可以做到这一点,我很乐意编写回调来做 Ajax 部分。)
  • 适用于所有浏览器。
  • 从生产版本中排除是微不足道的。
  • 维护的代码库。
4

3 回答 3

2

我们一直在使用YUI 测试库。它似乎工作得很好。

拥有多种针对不同类型的断言方法

断言存在于相等、相同、真、假、对象类型,甚至数组项比较。

允许模拟对象测试 DOM 对象和其他功能 我们的代码执行大量 AJAX 调用,或者需要不需要测试的方法/对象(因为它们在其他地方进行了测试)。使用 Mock 对象,我们可以告诉测试期望什么。例如:

var mockXhr = Y.Mock();

//I expect the open() method to be called with the given arguments
Y.Mock.expect(mockXhr, {
    method: "open",
    args: ["get", "/log.php?msg=hi", true]                            
});

适用于所有浏览器

我们在 IE、Chrome 和 Firefox 中运行我们的测试,除了测试运行器本身外观的一些差异之外,它可以工作!

从生产版本中排除很简单

我们将所有测试代码放在一个单独的文件夹中,该文件夹可以访问所有生产代码。从生产中排除测试就像排除文件夹一样简单。

维护的代码库

YUI 3 在 Yahoo 主页上使用,并且似乎维护得很好。

于 2011-03-02T02:29:31.123 回答
0

似乎没有我正在寻找的类似解决方案。

我要自己写一个,重写console.assert 以在参数评估为false 时进行ajax 调用。

更新:来了,仍在开发中,https://github.com/gaboom/qassert

于 2011-03-11T13:17:46.430 回答
0

我知道这不是您所要求的,但我强烈推荐Selenium用于 Web 应用程序的自动化测试。

  • 内置了常见的断言。
  • 它可以测试任何 JS 框架,因为它驱动运行代码的浏览器。
  • 它具有强大的日志记录功能。
  • 浏览器支持取决于您的操作系统,但支持所有主要浏览器。
  • 生产版本中没有什么可以排除的,因为测试在应用程序之外。
  • 代码库维护良好,您可以完全控制测试用例。
于 2011-02-15T16:43:46.410 回答