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

00d*_*ani 6 ruby bdd rspec mocha.js node.js

我已经用很多语言编程多年了,并且认为我一般都很擅长它.但是,我从未编写任何自动测试:没有单元测试,没有TDD,没有BDD,没有.

我已经尝试为我的项目开始编写适当的测试套件.我可以看到在进行任何更改后能够自动测试项目中所有代码的理论价值.我可以看到像RSpec和Mocha这样的测试框架应该如何设置和运行所述测试相当容易,我喜欢他们为编写测试提供的DSL.

但我从来没有设法为我的代码的任何部分编写实际的单元测试.我写的东西似乎从来没有以一种实际有用的方式测试.

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

我将如何开始正确的BDD测试?(我最好喜欢使用Mocha和Node.js这样做,但对BDD的一般建议也很好.)

Jon*_*rns 3

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

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

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

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

在测试 HTML 时,由于视图层的高度可变性,许多人根本不这样做。然而,有些东西确实值得测试,但绝不是完整的 HTML 字符串 - 正如您所发现的,只是一个微小的更改就意味着整个测试失败。在这种情况下,您真正​​测试的是什么,代码库不同部分中的两个字符串是否相同?

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

您可能还想了解的其他内容是集成测试(例如 Capybara、Selenium)。这将使用 JavaScript 引擎加载您的 Web 应用程序,以便您可以检查 HTML 元素和 JavaScript 事件。

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

至于测试资源,即使您不打算练习 TDD,我也建议您查看测试驱动开发书籍。主要原因是他们让你首先投入测试。以下是一些:

  1. Kent Beck 的书《测试驱动开发:举例》
  2. 关于 PHP 的 TDD、实用 PHP 测试的免费电子书
  3. 这个网站,单元测试的艺术
  4. Slideshare - 只需搜索单元测试或 BDD 并尽可能多地阅读!
  5. 大卫·切利姆斯基等。等人:RSpec 书