测试驱动开发体现了开发人员对软件产品各部分运作方式的理解,而行为驱动开发则关注于开发人员对软件产品最终表现的行为的预期。
TDD更像是一种范式而不是一个过程。它描述了一种先编写测试,然后实现,并伴随可能的代码重构这样的一系列步骤。但其并没有关于以下的内容:
测试驱动开发这个命名也让人疑惑,人怎么能够对不存在的东西进行测试呢。
Dan North对这些问题进行了研究,建议开发人员更应该考虑关注软件的特征行为而不是编写测试。
如果开发是行为驱动的,开发应该从对用户最重要的部分功能开始。可以看做放下开发者的帽子,而戴上用户的帽子,从用户的角度思考。实际上,分情况下,最难的部分也在此处,很多时候,你无法知道用户最关注的最重要的行为特性。但是,经过实践和多次的迭代,这一过程终将变得透明和有效。
那么接下来应该怎么表现行为了,一个基于Test::Unit的测试可能是这样的:
class="csharpcode">class UserTest < Test::Unit::TestCase def test_name_set user = User.new "Audrey" assert_equal(user.name, "Audrey") end end
代码可以工作,但有一些缺陷:
在BDD中,行为应该随处可见,如下面的红色内容:
describe User do it "lets me assign a name" do user = User.new "Paul" user.name.should == "Paul" end end
这段测试代码的价值在于:
尽管测试语法对软件的功能行为特性做了描述,它需要一些工作来表明用户的意图。Dan North认为,可以通过定义一个模板通过自然语言来描述这些特性:
Story: Returns go to stock In order to keep track of stock As a store owner I want to add items back to stock when they're returned Scenario 1: Refunded items should be returned to stock Given a customer previously bought a black sweater from me And I currently have three black sweaters left in stock When he returns the sweater for a refund Then I should have four black sweaters in stock Scenario 2: Replaced items should be returned to stock Given that a customer buys a blue garment And I have two blue garments in stock And three black garments in stock. When he returns the garment for a replacement in black, Then I should have three blue garments in stock And two black garments in stock
每一个故事都有一个标题和简短的描述。描述的格式一般包括:
描述通过还附有一系列包含了给定步骤的场景,包含前置事件,用例行为,后置事件等。
由于BDD一直期望从用户最关注的行为开始,应该坚持以下准则:
藉此,你可以一直站在用户需求的角度进行开发,并关注于真正有效的目标。
很多人将BDD看做是“正确的TDD”,因为它包含了一系列以用户为中心的最佳开发实践,改变了以往技术方案为中心的方式,将用户意图当做首位。因此,将有助于创建更好的软件,实现用户的需求。