Testing 添加代码的唯一目的是使其更易于测试,这样可以吗?

Testing 添加代码的唯一目的是使其更易于测试,这样可以吗?,testing,Testing,我的情况,作为一些背景: 我正在编写一个小的javascript库,它使用window.requestAnimationFrame执行动画循环。由于该函数尚未在浏览器中标准化,因此在库的内部,它在闭包中创建了一个polyfill-ish函数 var requestAnim = window.requestAnimationFrame || window.webkitRequestAnimationFrame || ... || function () { ... };

我的情况,作为一些背景:

我正在编写一个小的javascript库,它使用
window.requestAnimationFrame
执行动画循环。由于该函数尚未在浏览器中标准化,因此在库的内部,它在闭包中创建了一个polyfill-ish函数

var requestAnim = window.requestAnimationFrame
    || window.webkitRequestAnimationFrame
    || ...
    || function () { ... };
这里的问题是,这使得我现在很难测试这段代码。以前,当它使用
setTimeout
时,我会在测试中覆盖该全局函数,以模拟同步传递的多个帧

总之,说到问题的关键:

现在,我的选择似乎是要么让我的一些代码未经测试,要么向库中添加无关的特性,唯一的目的是使其更易于测试。这两种选择对我来说都不是那么好

不用太担心我的具体情况,一般来说,在这种情况下你应该怎么做?

是的,没关系

我们编写测试不是为了测试。测试是对这样一个事实的承认,即在没有安全检查的情况下,我们还不够聪明,无法完美地编写和维护代码。所有的测试代码都有一个目的,而且只有一个目的:制造更好的产品。无论它位于/test文件夹还是/src文件夹中,都是如此。因此,认为“这在生产中从未调用过,因此将其放入/src是错误的!”

可以肯定的是,还有其他需要权衡的因素,例如大小(在嵌入式产品中,尽一切努力保持/src文件夹小是很有意义的)。但这是一个完全不同的原因,而不仅仅是“它与测试有关”。

是的,没关系

我们编写测试不是为了测试。测试是对这样一个事实的承认,即在没有安全检查的情况下,我们还不够聪明,无法完美地编写和维护代码。所有的测试代码都有一个目的,而且只有一个目的:制造更好的产品。无论它位于/test文件夹还是/src文件夹中,都是如此。因此,认为“这在生产中从未调用过,因此将其放入/src是错误的!”


可以肯定的是,还有其他需要权衡的因素,例如大小(在嵌入式产品中,尽一切努力保持/src文件夹小是很有意义的)。但这是一个完全不同于“它与测试相关”的原因。

我认为添加测试代码是可以的(除非您正在测试一些微优化)。正如基里安所说,没有人是完美的;这就是我们首先进行测试的原因

我+1d Kilian的答案,但我也想补充我自己的想法:

一般来说,在什么情况下您不能(轻松地)测试代码?这将是只在您无法在测试机器上重新创建的条件下运行的代码?也许设置一个变量来决定此代码是否应该运行会更容易,然后您可以设置一个断点并在调试时更改此变量(在JavaScript中,使用Firebug或Chrome的开发工具?)

或者,如您所说,添加一些测试代码—一组标志可能位于脚本顶部,以保持整洁?那么你的if语句可以是

if(shouldRunThisCode || isTestingThisCode) {
    doThisCode();
}

简而言之:当然,为了测试的目的添加代码是可以的。不过,我想不出有哪种情况下测试代码需要添加太多代码。如果代码已经实现并打算在特定条件下运行,那么测试就不会太困难。

我认为添加测试代码是可以的(除非您正在测试一些微优化)。正如基里安所说,没有人是完美的;这就是我们首先进行测试的原因

我+1d Kilian的答案,但我也想补充我自己的想法:

一般来说,在什么情况下您不能(轻松地)测试代码?这将是只在您无法在测试机器上重新创建的条件下运行的代码?也许设置一个变量来决定此代码是否应该运行会更容易,然后您可以设置一个断点并在调试时更改此变量(在JavaScript中,使用Firebug或Chrome的开发工具?)

或者,如您所说,添加一些测试代码—一组标志可能位于脚本顶部,以保持整洁?那么你的if语句可以是

if(shouldRunThisCode || isTestingThisCode) {
    doThisCode();
}

简而言之:当然,为了测试的目的添加代码是可以的。不过,我想不出有哪种情况下测试代码需要添加太多代码。如果代码已经实现,并且打算在特定条件下运行,那么测试就不会太难。

一般来说,难以测试的代码编写得很糟糕。找到测试困难告诉您的设计问题并解决这些问题比添加代码“只是为了使测试更容易”要好得多。有时我们会这样做,因为我们认为设计问题太难解决——但这应该是第二选择。在您的情况下,您公开的糟糕设计听起来像是在您无法控制的库中。在这种情况下,添加代码“只是为了简化测试”可能是最好的选择;您不太可能对外部库拥有足够的控制来改进其设计。

通常,难以测试的代码编写得很糟糕。找到测试困难告诉您的设计问题并解决这些问题比添加代码“只是为了使测试更容易”要好得多。有时我们会这样做,因为我们认为设计问题太难解决——但这应该是第二选择。在您的情况下,您公开的糟糕设计听起来像是在您无法控制的库中。在这种情况下,添加代码“只是为了简化测试”可能是最好的选择;你不太可能有这种想法