例子

  假设我们要测试一个restful web服务。通过这个web服务,我们可以用电话作为关键字搜索客户信息。
  要调用这个web服务,需要发起以下格式的HTTP请求:
  http://{endpoint}/subscribers?telephoneNumber={telephoneNumber}
  服务端返回的以竖线分割的数据包含客户的姓名、电话、地址及其他信息:
  13120205504|ST|C|SQ|112|||FIRST|ST|W|Riverfront|BC|010|68930432|
  测试这个服务的用例为:(1)用能精确匹配一个用户的电话作为关键字搜索,(2)用能精确匹配多个用户的电话作为关键字搜索,(3)用 不完整电话作为关键字搜索等。用例的完整程度完全取决于QA的想象能力。
  对于每个测试用例,执行的数据基本上都一样:(1)拼装包含电话号码关键字的URL,(2)用HTTP库发出HTTP GET请求,(3)解析数据, (4)把真实值与期望值做比较。为了避免上面提到的问题,我们在这里采用分层结构:

  测试用例层

  这一层的具体实现方式与采用的测试框架有关。在这个例子中,我们采用C#及NBehave。

  [Story]

  public class SearchCustomerbyTelephoneNumberStory: TestBase

  {

  [Scenario]

  public void SearchWithAPhoneNumberWhichHasAnExactMatch()

  {

  story.WithScenario("Search with a phone number which has a exact match")

  .Given(AN_ACCOUNT_WITH_PHONE_NUMBER, "01068930432", EMPTY_ACTION)

  .When(SEARCH_WITH, "01068930432",

  SEARCH_WITH_ACTION)

  .Then(ACCOUNT_INFORMATION_SHOULD_BE_RETURNED, "13120205504",
  ACCOUNT_INFORMATION_SHOULD_BE_RETURNED_ACTION)

  .Given(AN_ACCOUNT_WITH_PHONE_NUMBER, "01062736745")

  .When(SEARCH_WITH, "01062736745")

  .Then(ACCOUNT_INFORMATION_SHOULD_BE_RETURNED, "12666056628");

  }

  [Scenario]

  public void SearchWithPartialPhoneNumber()

  {

  story.WithScenario("Search with partial phone number")

  .Given(THREE_ACCOUNTS_WITH_PHONE_NUMBER_STARTS_WITH, "0106", EMPTY_ACTION)

  .When(SEARCH_WITH, "0106", SEARCH_WITH_ACTION)

  .Then(ACCOUNT_INFORMATION_SHOULD_BE_RETURNED, "13120205504",

  ACCOUNT_INFORMATION_SHOULD_BE_RETURNED_ACTION)

  .And(ACCOUNT_INFORMATION_SHOULD_BE_RETURNED, "12666056628")

  .And(ACCOUNT_INFORMATION_SHOULD_BE_RETURNED, "17948552843");

  }

  [Scenario]

  public void SearchWithAPhoneNumberWhichHasSeveralExactMatches() {...}

  [Scenario]

  public void SearchWithNonExistentPhoneNumbers() {...}

  [Scenario]

  public void SearchWithInvalidPhoneNumberValues() {...}

  ...

  ...

  }