从来没有写过任何自动化testing,我应该如何开始行为驱动开发?

我已经用很多语言进行了多年的编程,并且喜欢认为我一般都很擅长。 但是,我从来没有写过任何自动化testing:没有unit testing,没有TDD,没有BDD,什么都没有。

试图开始为我的项目编写适当的testing套件。 我可以看到在进行任何更改后能够自动testing项目中的所有代码的理论价值。 我可以看到像RSpec和Mocha这样的testing框架应该如何设置和运行所述testing非常简单,我喜欢他们提供的用于编写testing的DSL。

但我从来没有设法为我的代码的任何部分写一个实际的unit testing。 我写的东西似乎从来没有以一种实际有用的方式进行testing。

  • 函数在使用它们的上下文之外似乎不是很可调用的。 我写的许多函数都会进行HTTP请求调用或数据库查询,或者其他一些不易testing的调用。
  • 一些函数返回HTML的string。 我可以将HTMLstring与相同string的硬编码版本进行比较,但似乎只能限制我更改代码部分的能力。 另外在我的testing代码中加载HTML是一团糟。
  • 我可以传递模拟/间谍对象到一个方法,并确保他们得到某些方法调用,但据我所知,只是testing我正在“testing”的方法的实现细节。

我将如何开始正确的BDDtesting? (我最好喜欢用Mocha和Node.js来做这个,但是关于BDD的一般build议也可以。)

它看起来像你问的主要问题是,“我如何编写可testing的代码”?

作为面向对象编程的粉丝,我知道自己有偏见,但以我的经验来看,testing用OO风格编写的代码要容易得多。 原因在于unit testing是为了testing系统中小的,孤立的组件,而devise良好的面向对象代码(主要是)提供了这个function。

我同意,函数经常与他们所处的环境联系在一起,使他们难以testing。 我在函数式编程方面没有太多的经验,但是我知道上下文往往是以某种variables的forms出现的,所以很难区分函数的问题。

通过OO编程,我已经成功testing了包装HTTP请求,数据库查询等的对象,方法是模拟实际networking请求返回已知数据集的对象。 然后testing你的包装器对象以正确的方式处理这些数据。 您还可以testing故障和意外的数据。 另一种方法是通过build立一个你使用的本地服务器来代替普通的端点,但是这会给你的testing套件一个外部的依赖关系,这个应该尽可能的避免。

在testingHTML时,由于视图层的高度可变性,许多人完全不这样做。 然而,有些东西确实值得testing,但从来没有一个完整的HTMLstring – 就像你发现的那样,只是一个微小的改变就意味着整个testing都会中断。 在这种情况下你真的testing了什么,你的代码库中的两个string是相同的?

最好的办法是将函数/对象中的HTMLstring加载到HTMLparsing器库中,通常可以使用Xpath或CSSselect器来检查具有特定类,ID或其他属性的标记,并检查元素的数量符合一定的要求。 Rspec拥有内置的( have_tag()方法),就像许多testing库一样。

你可能想看的其他东西是集成testing(例如Capybara,Selenium)。 这将加载您的Web应用程序与JavaScript引擎,所以你可以检查HTML元素和JavaScript事件。

在整个嘲弄/残桩的事情上,你通常只想用你正在testing的对象的依赖对象来做到这一点。 否则,你几乎可以操纵任何东西来声明为真!

至于testing资源,即使您不打算实践TDD,我也build议您查看testing驱动的开发书籍。 主要原因是他们首先把你的头扔进testing。 这里有几个:

  1. Kent Beck的书“ Test Driven Development:By Example”
  2. 用PHP实现的免费电子书TDD, 实用的PHPtesting
  3. 这个网站, unit testing的艺术
  4. Slideshare – 只要searchunit testing或BDD,尽可能多地阅读!
  5. 大卫Chelimsky等。 RSpec书

TDD或BDD,无所谓,它们同构,如摩卡所certificate的那样,它们只是可插拔的前端。

我可以传递模拟/间谍对象到一个方法,并确保他们得到某些方法调用,但据我所知,只是testing我正在“testing”的方法的实现细节。

这正是unit testing的要点:你只是testing你正在testing的代码,而不是更多。 testing更多的问题是,失败的testing通常不会正确地标记问题。 unit testing的承诺是可以在很大程度上避免debugging。 太粗糙的testing会使其无效。 当然,需要一个平衡,任何有UT经验的人都会告诉你,很容易陷入我想要testing并没有注意到的陷阱,你的testing可能都是绿色的,实际的代码不工作。