自動化測試的分層結構(2)

發表于:2014-12-17來源:uml.org.cn作者:李貝點擊數: 標簽:自動化測試
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

  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() {...}

  ...

  ...

  }

  這些測試用例用C#寫成,但是很接近英語,即使非技術人員也可以讀懂。 (請參照Martin Fowler的 BusinessReadableDSL )。這樣,其他的團隊成員,特別是對領域更熟悉的業務人員,可以很容易的讀懂測試用例, 因此也更可能指出測試中遺漏的案例及場景。

  若采用支持以自然語言形式書寫測試用例的框架(例如Ruby平臺下的Cucumber)則會更好。

  以"ACTION"結尾的變量為lambda表達式。他們是真正的測試邏輯。

  SEARCH_WITH_ACTION會向web服務發出請求,并會解析返回的以豎線分割的數據。類CustomerService和Subscriber在領域層中,他們 會在多個測試中重復使用。

  SEARCH_WITH_ACTION =

  phoneNumber =>

  {

  subscribers = customerService.SearchWithTelephoneNumber(phoneNumber);

  };

  ACCOUNT_INFORMATION_SHOULD_BE_RETURNED_ACTION is for verifying the data

  ACCOUNT_INFORMATION_SHOULD_BE_RETURNED_ACTION =

  accountNumber =>

  {

  //Get expected subscriber from fixture

  Subscriber expected = SubscriberFixture.Get(accountNumber);

  CustomAssert.Contains(expected, subscribers);

  };

  領域層

  CustomerService類以真實web服務的名稱命名。在需求文檔、日常對話、架構圖以及代碼中,都用這個名稱來指代此web服務。 使用統一的名稱,能除去二義,提高溝通效率。

  public class CustomerService

  {

  public Subscriber SearchWithTelephoneNumber(string telephoneNumber)

  {

  string url =

  string.Format(

  "{0}/subscribers?telephoneNumber={1}",

  endpoint, telephoneNumber);

  //Send http request to web service, parse the xml returned,

  //populate the subscriber object and etc.

  return GetResponse(url);

  }

  ...

  }

  Subscriber類建模了用戶。比起用豎線分割的字符串,增加一層數據抽象,用對象表示返回的數據,能使 測試更容易理解(你應該不會偏好用pipedData[101]表示電話號碼吧?)。

  public class Subscriber

  {

  public string AccountNumber { get; set; }

  public string FirstName { get; set; }

  public string Surname { get; set; }

  public string TelephoneNumber { get; set; }

  ...

  }

  有了這些領域模型,測試就能直接構建在這些對象上了。例如,可以如此驗證所返回的用戶名為'Bei':

  Assert.AreEqual("Bei", subscriber.FirstName);

  或者電話號碼以'010'開始:

  Assert.IsTrue(subscriber.TelephoneNumber.StartsWith("010"));

  點擊這里可以下載到樣例代碼。代碼中演示了如何用分層架構組織測試自動化代碼。 你可以在Visual Studio 2008中打開項目,也可以在命令行運行執行'go.bat’來運行所有測試。 'go.bat’運行完后會將測試結果保存在'artifacts’文件夾。源代碼中包含三個項目。 名稱以with ‘Client’的項目包含領域層。以'Client.Spec’結尾的項目為領域層對應的單元測試(TDD)。'Stories’項目包含測試用例層。這份源代碼由真實項目中來,并作了相應修改。某些類返回了硬編碼的值,是為了不訪問真實的web服務。

原文轉自:http://www.uml.org.cn/Test/200911196.asp

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97