是否可以使用页面对象为多个类似屏幕创建可重用且通用的 Specflow 步骤定义?

2024-03-18

我正在开发一个具有许多类似数据表/CRUD 屏幕的应用程序。我使用带有页面对象模式的 Selenium 在应用程序中进行导航,并使用对象母体来创建预定义的测试数据,特别是对于具有许多输入的表单。

在编写功能文件时,我突然想到这些测试彼此非常相似,为了重用和干燥,应该可以概括一些常见的步骤。 DataTable 页面对象很简单,因为所有页面的选择器都是相同的。所以我创建了一个DataTable具有过滤、选择行等必要操作的页面对象。我通过 Specflow 的上下文注入机制使用 DI。

Example:

Scenario: List and search Users
    When I type '[email protected] /cdn-cgi/l/email-protection' in filter
    Then I should only see items with 'email' = '[email protected] /cdn-cgi/l/email-protection'

以及步骤:

[Binding]
public class DataTableSteps
{
    private DataTable _page;
    public DataTableSteps(DataTable page) => _page = page;

    [When(@"I type '(.*)' in filter")]
    public void WhenITypeInFilter(string value) { 
        _page.FilterSearch (value);    
      }
    [Then(@"I should see items with '(.*)' = '(.*)'")]
    public void ThenIShouldSeeAListWhereContains(string column, string value)
    {
        _page.VisibleInTable(column, value).Should().BeTrue();
    }
}

问题是,当我尝试制作通用步骤类时,我找不到好的设计WebFormSteps处理表单数据以使用不同的方式填写各种输入WebForm页面对象。我想做以下事情:

Scenario: Add User
    When I go to '/Users'
    When I create a 'validUser' Item  #'validUser' comes from the object mother
    Then 'validUser' should be added

并对产品使用相同的步骤和步骤定义:

Scenario: Add Product
    When I go to '/Products'
    When I create a 'validProduct' Item
    Then 'validProduct' should be added

我想到使用接口或抽象类并让NewUserInputWebForm页面对象和UserMother来实现这些,但是我找不到在运行时注入正确的具体类型的方法。 (我考虑将具体的对象母体放入相关的页面对象中,这意味着对步骤的依赖性减少,但我无法证明将对象母体添加到这样一个不相关的类(即页面对象)中。

[Binding]
class WebFormSteps
{
    IWebFormObject formObject;
    IObjectMother objectMother;

    public WebFormSteps(IWebFormObject formObject, IObjectMother objectMother)
    {
        this.formObject = formObject;
        this.objectMother = objectMother;
    }

    [When(@"I create a '([^']*)' item")]
    public void WhenICreate(string exampleName)
    {
        form = objectMother.Create(exampleName);
        formObject.FillForm(form);
        formObject.Submit();
    }
}

我想到的一件事是使用作用域钩子并注册具有正确对象的接口,但是在这种情况下将会有大量的标签和钩子方法。同样,我可以在其他步骤注册类型,例如When I go to '/Users'一步,但这会使事情变得更加复杂。可以使用反射或者可以在步骤定义中指定类型名称:When I create a 'User' named 'validUser',但这会使脆弱的测试变得更加脆弱。此外,测试将变得过于技术性,而不是黄瓜。

有没有好的方法来实现这一目标?我什至不确定这种方法是否是好的做法(包括数据表),因为我无法找到有关此类用法的更多简单示例。我应该坚持专门的步骤,例如:

Scenario: Add User
    When I go to '/Users'
    When I create a user named 'validUser'
    Then 'validUser' should be added to users

也许场景大纲会对您有所帮助

Scenario Outline: Add User
    When I go to <Page>
    When I create a user named <Username>
    Then <Username> should be added to users
Examples: 
| Page    | Username |
|"//Users"| "User1"  |
|"//Users"| "User2"  |
|"//Users"| "User3"  |
|"//Smth" | "User1"  |
|"//Smth" | "User2"  |
|"//Smth" | "User3"  |
|.........|..........|
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用页面对象为多个类似屏幕创建可重用且通用的 Specflow 步骤定义? 的相关文章

随机推荐

  • OpenCL 内置函数“选择”

    我不清楚内置 OpenCL 函数的目的是什么select 有人可以澄清一下吗 来自 OpenCL 规范 功能选择 基因型a 基因型b 基因型c 返回 对于向量类型的每个分量 结果 i 如果设置了 c i 的 MSB b i a i 在这种情
  • 在 asp.net C# 中使用客户端 ID 和客户端密钥访问 Sharepoint 列表

    目前 我可以使用用户 ID 和密码访问共享点列表 如下所示 但想了解如何使用客户端 ID 和客户端密码访问列表 string siteUrl https xyz sharepoint com sites MyList ClientConte
  • VBA 运行时错误 3134

    以下代码创建一个 SQL 字符串 该字符串在 MS Access 中产生语法错误 3134 sql INSERT INTO tblItems desc descExtended itemNumber currentPrice VALUES
  • Spring Security 加密 MD5

    我有一个使用 spring 框架和 spring security 进行登录的 java web 应用程序 在我的数据库中 我的密码在保存之前已加密为 MD5 我在 application config xml 中添加了这段代码
  • jQuery DataTable - 搜索一列下拉列表

    我有一个简单的 jQuery 数据表 其中包含 4 列 其中一列是下拉列表 table tfoot tr th class searchBox Vendor Location th th class searchBox Currency t
  • RestKit valueTransformer 没有被调用

    我正在使用 RestKit 与我的 JSON 端点对话 端点返回一个以 毫秒数 为单位的 UNIX 时间戳 但是 RestKit 的默认转换器假定它是 秒数 并且我在 NSDate 中得到了错误的值 所以我环顾四周 发现我需要使用自定义 v
  • 在同一请求中创建和更新结构时可能出现的竞争条件 - Coldfusion

    大约一年前 我问了一个关于我在应用程序中遇到的错误的问题 该错误表明可能存在竞争条件 在 ColdFusion 中创建结构体时可能存在竞争条件 https stackoverflow com questions 19859690 possi
  • 使用 clang 在命令行上编译多个 Objective-C 文件

    希望是简单的问题 我正在尝试使用 clang 从命令行学习基本的 Objective C 编译 我知道 Xcode 对于复杂的项目来说是一个更好的解决方案 我计划很快转向它 但我个人觉得如果我可以在终端中手动编译一门语言 我会更好地理解它
  • Ember 过渡和渲染完成事件

    是否触发了任何事件 表明转换 渲染已完成 并且 dom 可见 准备就绪 setupcontroller activate 在 dom 构建 渲染之前 仅当我已经插入一个元素并且我只是将其下面的模型切换出来时 didInsertElement
  • 通过 PHP 执行 .sh 脚本

    我有一些游戏服务器 我需要运行 shell 脚本来提高质量 我试图弄清楚如何通过同一服务器上的网页运行这些脚本 这是一个 Ubuntu 专用服务器 网站文件位于 var www 我需要手动运行的 sh 文件位于 home amservers
  • 在 Lambda 中获取用户的 IP 地址(使用 API 网关和 Python)

    我正在使用这种技术 如何使用 Python 检索 AWS Lambda 公共 IP 地址 https stackoverflow com questions 48619163 how could i retrieve aws lambda
  • 使用 Swift 中的新并发将同步函数转换为异步函数

    我想将同步函数转换为异步函数 但我不知道正确的方法是什么 假设我有一个需要很长时间才能获取数据的同步函数 func syncLongTimeFunction throws gt Data Data 然后我在下面的函数中调用它 它仍然是一个同
  • 为什么要更改选项卡,停止 ios 应用程序中的动画?

    我的应用程序中有多个选项卡 我的一个视图控制器正在运行动画 当我切换到另一个视图控制器 并再次进入带有动画的视图控制器时 动画停止 有人可以指导我使用 Xcode 甚至在 Iphone 应用程序中切换选项卡吗 IBAction btn id
  • 根据音色(音调)按相似度对声音进行排序

    解释 我希望能够根据以下内容对列表中的声音集合进行排序音色 音调 的声音 这是一个玩具示例 其中我手动对我创建的 12 个声音文件的声谱图进行了排序 上传到这个仓库 https github com samgermain sort soun
  • 如何在Postman中存储和重用cookie?

    我在用着Postman https www getpostman com 测试和使用 API 对于登录 url API 需要发送 POST 请求username and password作为字段 我这样做 我得到了200回复我已登录的消息
  • Cythonized 函数出乎意料地慢

    我想加快我经常使用的功能 并且我考虑使用 cython 然而 在尝试了我在文档中找到的所有可能的 cython 优化之后 cython 代码比 python numpy 函数慢大约 6 倍 令人失望 这是我的测试代码 forward1是py
  • BLE不同的MTU用于不同的实现

    我在 Android 上尝试了 BLE 连接的不同实现 一种使用 RxAndroidBle 另一种使用简单的 Android API 我使用 RxAndroidBle 示例应用程序进行测试 我连接到具有相同服务和特征的相同外围设备 不过 当
  • MUI - 单击文本字段中的任意位置时打开日期选择器

    我有一个日期选择器 当用户单击字段中的任意位置而不仅仅是日历图标时 我想显示该日期选择器 这是选择器 export function DatePickerField props return
  • React.js - 使用 svg 线性渐变不起作用

    我有一个圆圈和一个渐变来填充它 我放入渐变并按样式填充在路径中调用他 import React PropTyoes from react import connect from react redux import as Actions f
  • 是否可以使用页面对象为多个类似屏幕创建可重用且通用的 Specflow 步骤定义?

    我正在开发一个具有许多类似数据表 CRUD 屏幕的应用程序 我使用带有页面对象模式的 Selenium 在应用程序中进行导航 并使用对象母体来创建预定义的测试数据 特别是对于具有许多输入的表单 在编写功能文件时 我突然想到这些测试彼此非常相