Node.js 由于从未编写过任何自动化测试,我应该如何开始行为驱动的开发?

Node.js 由于从未编写过任何自动化测试,我应该如何开始行为驱动的开发?,node.js,ruby,rspec,bdd,ruby-mocha,Node.js,Ruby,Rspec,Bdd,Ruby Mocha,我已经用很多种语言编程多年了,总的来说我觉得自己相当擅长。然而,我从来没有写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有 我已经开始为我的项目编写合适的测试套件。我可以看到,在进行任何更改后,能够自动测试项目中所有代码的理论价值。我可以看到像RSpec和Mocha这样的测试框架如何使设置和运行上述测试变得相当简单,我喜欢它们为编写测试提供的dsl 但我从来没有为代码的任何部分编写过实际的单元测试。我写的东西在某种程度上似乎从来都不是很可测试的,实际上是有用的 函数在使用它

我已经用很多种语言编程多年了,总的来说我觉得自己相当擅长。然而,我从来没有写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有

我已经开始为我的项目编写合适的测试套件。我可以看到,在进行任何更改后,能够自动测试项目中所有代码的理论价值。我可以看到像RSpec和Mocha这样的测试框架如何使设置和运行上述测试变得相当简单,我喜欢它们为编写测试提供的dsl

但我从来没有为代码的任何部分编写过实际的单元测试。我写的东西在某种程度上似乎从来都不是很可测试的,实际上是有用的

  • 函数在使用它们的上下文之外似乎不太可调用。我编写的许多函数进行HTTP请求调用、数据库查询或其他一些不易测试的调用
  • 有些函数返回HTML字符串。我可以将HTML字符串与同一字符串的硬编码版本进行比较,但这似乎限制了我更改该部分代码的能力。另外,在我的测试代码中加载HTML是一团混乱
  • 我可以将mock/spy对象传递到一个方法中,并确保它们得到某些方法调用,但据我所知,这只是测试我正在“测试”的方法的实现细节

我如何着手开始正确的BDD测试?(我更愿意使用Mocha和Node.js来实现这一点,但是关于BDD的一般建议也可以。)

看起来您要问的主要问题是,“如何编写可测试代码”

作为面向对象编程的爱好者,我知道我有偏见,但根据我的经验,测试以OO风格编写的代码要容易得多。这是因为单元测试旨在测试系统中小型的、孤立的组件,而设计良好的面向对象代码(大部分)提供了这一点

我同意函数经常与它们所处的环境相关联,这使得它们很难测试。我对函数式编程没有太多经验,但我知道上下文经常在某种变量中传递,这使得很难区分函数的关注点

通过OO编程,我成功地测试了围绕HTTP请求、数据库查询等的对象,方法是模拟执行实际网络请求的对象以返回一组已知数据。然后测试包装器对象是否以正确的方式处理该数据。您还可以测试故障和意外数据。另一种方法是设置一个您使用的本地服务器,而不是普通的端点,但这会给您的测试套件带来一个外部依赖性,在可能的情况下应该避免这种依赖性

在测试HTML时,许多人根本不这样做,因为视图层具有高度可变的特性。然而,有些东西确实值得测试,但从来没有完整的HTML字符串——正如您所发现的,仅仅一个微小的变化就意味着整个测试都会中断。在这种情况下,代码库中不同部分中的两个字符串是相同的,您真正测试的是什么

最好的做法是将HTML字符串从函数/对象加载到HTML解析器库中,通常可以使用Xpath或CSS选择器检查具有特定类、ID或其他属性的标记,并检查符合特定要求的元素数量。Rspec和许多测试库都内置了这个方法(have_tag()方法)

您可能还想了解集成测试(例如,水豚、硒)。这将使用JavaScript引擎加载您的web应用程序,因此您可以检查HTML元素和JavaScript事件

在整个模拟/存根过程中,您通常只希望对作为所测试对象的依赖项的对象执行此操作。否则,您几乎可以操纵任何东西来断言为真

至于测试方面的资源,我建议您阅读测试驱动的开发书籍,即使您不打算实践TDD。主要的原因是他们让你首先进入测试。以下是一些:

  • 肯特·贝克的书
  • 使用PHP在TDD上提供免费电子书
  • 这个网站,
  • -只需搜索单元测试或BDD,并尽可能多地阅读
  • David Chelimsky等人:

  • TDD或BDD,没关系,它们是同构的,正如摩卡咖啡所证明的,它们只是可插拔的前端

    我可以将mock/spy对象传递到一个方法中,并确保它们得到某些方法调用,但据我所知,这只是测试我正在“测试”的方法的实现细节


    这正是单元测试的要点:您只测试您正在测试的代码,而不是更多。更多测试的问题在于,失败的测试通常不能准确地标记问题。单元测试的承诺是可以在很大程度上避免调试。过于粗糙的测试会抵消这一点。当然,平衡是必需的,任何有UT经验的人都会告诉你,很容易陷入“我想测试什么”和“我没注意到什么”的陷阱,你的测试可能都是绿色的,实际的代码不起作用。

    +1对于TDDBE书中提到的。我只想补充一点,支持测试的不是OOP,而是关注点和可替代依赖项的坚决分离。@我同意,这就是为什么我要警告自己有偏见:)“TDD或BDD,没关系,它们是同构的,正如摩卡所证明的,它们只是可插拔的前端。”嘿,很高兴知道。我真的不知道它们有什么不同,但我更喜欢BDD的描述/it风格,因此我问了一下P“这正是单元测试的要点:您只测试您正在测试的代码,而不是更多。”我倾向于找到一个类似“此方法是否有效?”