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