Specflow:将许多属性测试数据从背景传递到场景大纲的解决方案?
Posted
技术标签:
【中文标题】Specflow:将许多属性测试数据从背景传递到场景大纲的解决方案?【英文标题】:Specflow: Solution to pass many-properties-test-data from Background to Scenario Outline? 【发布时间】:2022-01-13 04:28:04 【问题描述】:在下面的例子中,有没有办法缩短When the doctor opens the details page of appointment
步骤?目前它必须包含约会的所有信息才能从约会列表中找到正确的。
Feature: Open Appointment Details page from Appointment list
Background:
Given the doctor has following appointments in appointment list
| Date | Time | Patient | Room | First Examination |
| 1/20/2022 | 9:00 AM - 10:00 AM | Allan | 1 | Yes |
| 1/20/2022 | 10:30 AM - 11:00 AM | Bred | 3 | No |
| 1/20/2022 | 1:00 PM - 1:30 PM | Allan | 1 | Yes |
| 1/20/2022 | 2:00 PM - 3:00 PM | David | 4 | No |
Scenario Outline: Open appointment details page
When the doctor opens the details page of appointment <Date>, <Time>, <Patient>, <Room>, <First Examination>
Then the appointment details page displays correct <Date>, <Time>, <Patient>, <Room>, <First Examination>
Examples:
| Date | Time | Patient | Room | First Examination |
| 1/20/2022 | 9:00 AM - 10:00 AM | Allan | 1 | Yes |
| 1/20/2022 | 10:30 AM - 11:00 AM | Bred | 3 | No |
| 1/20/2022 | 1:00 PM - 1:30 PM | Allan | 1 | Yes |
| 1/20/2022 | 2:00 PM - 3:00 PM | David | 4 | No |
【问题讨论】:
【参考方案1】:当场景具有相同数据的多条记录时,缩短步骤的关键是使用识别其中一条记录所需的最少数据。看起来患者姓名和预约日期/时间是 Given
语句中一行的唯一值。该场景需要人们可以理解,因此如果步骤中的细节对于理解业务用例没有价值,请随时省略。
我建议更改When
步骤的措辞,仅提及患者、日期和时间:
When the doctor views the appointment with "<Patient>" on "<Date>" at "<Time>"
患者、日期和时间应该足以根据场景背景中的Given
语句选择正确的约会。但是,您的场景中的断言可能不会变得更短。最好列出您关心的断言中的所有信息。相反,考虑一个垂直数据表:
Then the appointment details should be:
| Key | Value |
| Date | <Date> |
| Time | <Time> |
| Patient | <Patient> |
| Room | <Room> |
| First Examination | <First Examination> |
步骤定义将接收一个 Table 参数,然后使用 table extensions to make your assertion。下面的示例假设您使用 Selenium 来自动化浏览器,但您当然可以将代码换成您使用的任何自动化框架:
[Then(@"the appointment details should be:")]
public void ThenTheAppointmentDetailsShouldBe(Table table)
// Assume using Selenium to automate browser
var appointmentDetails = new AppointmentDetailsPage(driver);
table.CompareToInstance(appointmentDetails)
还有一个 AppointmentDetailsPage
类的存根来帮助您入门:
public class AppointmentDetailsPage
private readonly IWebDriver driver;
public string Date => driver.FindElement(By.Whatever("...")).Text;
public string Time => driver.FindElement(By.Whatever("...")).Text;
public string Patient => driver.FindElement(By.Whatever("...")).Text;
public string Room => driver.FindElement(By.Whatever("...")).Text;
public string FirstExamination => driver.FindElement(By.Whatever("...")).Text;
public AppointmentDetailsPage(IWebDriver driver)
this.driver = driver;
这里的关键是AppointmentDetailsPage
中的属性名称与传递给Then
步骤的vertical data table 中的Key
列相匹配。
【讨论】:
感谢@Greg,如此深入的解释,我可以考虑两点:1.尝试识别可以使记录唯一的属性,然后描述步骤以更具可读性@987654335 @ 2. Step in Scenario Outline 能hold住自己的Table -> 以前不知道,试一下告诉你。 @StevenPham:谢谢。我不得不对“Then”步骤做一个小修正,所以在尝试之前先看看。 嗨@Greg,Then
步骤的解决方案是尝试在场景大纲中使用表格,我认为它不起作用。我环顾四周寻找这种可能性,但没有运气,我认为它也违反了 Specflow 的可读性。参考:***.com/questions/5118860/…
@StevenPham:我认为您可能误解了这个问题及其答案。这个问题是关于重写一个场景来测试组合搜索条件、过滤和分页搜索结果。对于场景来说,这方式的范围太大了。阅读您的版本和我的场景版本很容易阅读。您编写的场景的大小似乎适合它测试的行为。众所周知,可读性是主观的。这取决于读者。读者应该是您、开发人员和最终用户。问他们。以上是关于Specflow:将许多属性测试数据从背景传递到场景大纲的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章
如何教 SpecFlow 向我的测试类添加额外的 NUnit 属性
如何制作使用自定义 TestFixture 和 Test 属性的 SpecFlow 插件?
如何将 Specflow 测试结果转换为 Cucumber Messages 格式
从 excel 读取数据并使用 specflow 写入特征文件