如何写测试 十

这里我们说下TDD和BDD两种测试实践。首先是TDD,测试驱动开发

TDD对于很多来说,会简化的理解为先写测试,在写代码。但是这只是测试先行开发,而不是测试驱动开发。

那么什么样是测试驱动开发呢?

对于TDD来说 其可以理解为一个圆

红色是书写了一个新的测试,绿色是写了功能测试,重构就是完成之后,再度调整代码。

其和测试先行开发的区别在于,测试先行开发只是先写测试,在完成代码功能。并没有引入重构的阶段。

如果只是先写测试,在写作业代码的话,会出现因为新增代码而导致的坏味道。因为我们再定了测试之后,往往在写代码的过程中,就会出现为了符合测试而调整的坏代码。

所以在这里引入了重构,在重构之中,会将味道不对的代码进行调整。

在这个过程中,测试和重构相辅相成,一旦有了测试,就可以大胆的进行重构了,重构中也能保证后续开发中测试代码的书写难易。

再之后就是TDD的实践

这里给出的方案是进行合理的任务分解。

如果是一个任务,那么我们就可以将需求分级为一个个子任务,然后驱动着我们给出一个个可以测试的设计,那么具体的写代码阶段,我们会先给出测试代码,然后给出实际业务代码,最后重构修改写出来的代码。

最后补充一点,如果要使用TDD开发,那么就需要从测试的视角来看待代码。

除此外就是讨论下BDD这个测试框架。

BDD的全称是行为驱动开发。

这个框架的测试的方向是面向业务。由测试框架去模拟用户的行为。从而叫做行为驱动开发。

这里我们就看下使用流行的BDD框架,该如何进行开发,这里以Cucumber为例。

其是一个支持不同语言的测试框架,支持的语言有常见的Java,Javascript,PHP等。

这里我们看下BDD的示例,其场景就是我们常见的内容。

Scenario: List todo item

Given todo item “foo” is added

And todo item “bar” is added

When list todo items

Then todo item “foo” should be contained

And todo item “bar” should be contained

上面的示例中,BDD展示了他们框架具有很强的可读性,其利用自身的一种领域语言实现了测试流程的编写。

核心描述就是Given When Then 这三个特定描述

其中Given是前提假设,When是具体操作,Then则是要验证的结果。

对应的就是准备,执行, 断言,那么去掉这些特定描述,剩下的通用描述才是我们该实现的。

这里我们就是要实现一个胶水层,或者说步骤定义。

public class TodoItemStepDefinitions … {

private RestTemplate restTemplate;

public TodoItemStepDefinitions() {

Given(“todo item {string} is added”, (String content) ->

addTodoItem(content)

);

}

private void addTodoItem(final String content) {

AddTodoItemRequest request = new AddTodoItemRequest(content);

final ResponseEntity<String> entity =

restTemplate.postForEntity(“http://localhost:8080/todo-items”, request, String.class);

}

}

上面我们利用函数,来完成了应用和BDD特定语言描述文件的牵线搭桥。

除此外需要注意就是在then的函数中,需要利用利用断言来说明是否达成目的。

除此外就是一些对于BDD测试的眼神,比如还有一些类似BDD的单元测试框架。比如RSpec,其更加适合于单元测试。

RSpec.describe Order do

it “sums the prices of its line items” do

order = Order.new

order.add_entry(LineItem.new(:item => Item.new(

:price => Money.new(1.11, :USD)

)))

order.add_entry(LineItem.new(:item => Item.new(

:price => Money.new(2.22, :USD),

:quantity => 2

)))

expect(order.total).to eq(Money.new(5.55, :USD))

end

end

还有就是对业务需求的文档话描述,其可以将BDD相关的领域语言转换为相关文档。就比如Cucumber就有着对于活文档的支持,可以和JIRA进行集成,将Cucumber测试变为文档。

通过这种方式,可以让测试更加贴近于业务。

发表评论

邮箱地址不会被公开。 必填项已用*标注