Carlos(领域专家)发言:
我发现这些验收测试是我向开发人员阐明系统预期行为定义的好方法。
有关其他示例,请参见源代码里的Conference.AcceptanceTests解决方案
让测试可执行feature文件中的验收测试不能直接执行。您必须提供一些管道代码来连接SpecFlow feature文件和应用程序。
有关实现的示例,请参见源代码Conference.AcceptanceTests解决方案下的Conference.Specflow项目下的Steps文件夹中的类。
这些步骤使用两种不同的方法实现
第一种运行测试的方法是模拟系统的一个用户,它通过使用第三方开源库WatiN直接驱动web浏览器来实现。这种方法的优点是,它运行系统的方式和实际用户与系统交互的的方式完全相同,并且最初实现起来很简单。然而,这些测试是脆弱的,将需要大量的维护工作来保持它们在UI和系统更改后也会更新成最新的。下面的代码示例展示了这种方法的一个示例,定义了前面所示的feature文件中的一些Given、When和Then步骤。SpecFlow使用Given、When和Then标记把步骤和feature文件中的子句链接起来,并把它当做参数值传递给测试方法:
public class ConferenceConfigurationSteps : StepDefinition { ... [Given(@"the Business Customer proceeds to edit the existing settings with this information")] public void GivenTheBusinessCustomerProceedToEditTheExistingSettignsWithThisInformation(Table table) { Browser.Click(Constants.UI.EditConferenceId); PopulateConferenceInformation(table); } [Given(@"an existing published conference with this information")] public void GivenAnExistingPublishedConferenceWithThisInformation(Table table) { ExistingConferenceWithThisInformation(table, true); } private void ExistingConferenceWithThisInformation(Table table, bool publish) { NavigateToCreateConferenceOption(); PopulateConferenceInformation(table, true); CreateTheConference(); if(publish) PublishTheConference(); ScenarioContext.Current.Set(table.Rows[0]["Email"], Constants.EmailSessionKey); ScenarioContext.Current.Set(Browser.FindText(Slug.FindBy), Constants.AccessCodeSessionKey); } ... [When(@"the Business Customer proceeds to save the changes")] public void WhenTheBusinessCustomerProceedToSaveTheChanges() { Browser.Click(Constants.UI.UpdateConferenceId); } ... [Then(@"this information appears in the Conference settings")] public void ThenThisInformationIsShowUpInTheConferenceSettings(Table table) { Assert.True(Browser.SafeContainsText(table.Rows[0][0]), string.Format("The following text was not found on the page: {0}", table.Rows[0][0])); } private void PublishTheConference() { Browser.Click(Constants.UI.PublishConferenceId); } private void CreateTheConference() { ScenarioContext.Current.Browser().Click(Constants.UI.CreateConferenceId); } private void NavigateToCreateConferenceOption() { // Navigate to Registration page Browser.GoTo(Constants.ConferenceManagementCreatePage); } private void PopulateConferenceInformation(Table table, bool create = false) { var row = table.Rows[0]; if (create) { Browser.SetInput("OwnerName", row["Owner"]); Browser.SetInput("OwnerEmail", row["Email"]); Browser.SetInput("name", row["Email"], "ConfirmEmail"); Browser.SetInput("Slug", Slug.CreateNew().Value); } Browser.SetInput("Tagline", Constants.UI.TagLine); Browser.SetInput("Location", Constants.UI.Location); Browser.SetInput("TwitterSearch", Constants.UI.TwitterSearch); if (row.ContainsKey("Name")) Browser.SetInput("Name", row["Name"]); if (row.ContainsKey("Description")) Browser.SetInput("Description", row["Description"]); if (row.ContainsKey("Start")) Browser.SetInput("StartDate", row["Start"]); if (row.ContainsKey("End")) Browser.SetInput("EndDate", row["End"]); } }您可以看到这种方法是如何模拟在Web浏览器中点击UI元素并输入文本的。