自动化 Windows UI 测试方法

2024-05-02

我们正在寻求设置自动化 UI 测试,并想知道最好的方法是什么,潜在的陷阱是什么,设置费用是否昂贵?

提前致谢。

B


自动化测试最大的消耗可能是时间。有很多非常昂贵的工具,但也有免费的工具。即使是昂贵的工具的成本也不太可能与正确设置自动化测试所需的时间成本相匹配。只要管理层了解需要大量的前期成本,并且愿意承担这些成本,那么在实际自动化测试时就要注意这些:

Pitfalls

可维护性

自动化会产生维护方面的长期成本。请记住自动化测试就是软件开发。这意味着您会遇到与任何其他软件相同的潜在问题。这也意味着提高软件可维护性的相同方法也适用于自动化测试。 (这就是为什么我认为所有那些使用 vbscript 而不是正确的 OO 语言的“专业”工具都是垃圾。)

自动化测试也有其特殊的可维护性问题。最大的问题是您使用的是 UI 而不是 API。如果您曾经不得不使用不稳定的 API,您可能会开始理解通过不断变化的 UI 运行程序的痛苦。幸运的是,这个问题的解决方案是已知的,尽管并不总是得到很好的实现:对象映射。基本上,您有一些层一侧连接到 UI,另一侧连接到代码。代码端尽可能保持稳定,而 UI 端可以根据需要经常更改。

我工作的框架的一个例子:

public Image GoImage
{
  get { return Browser.Image(Find.ById("BtnGo")); }
}

此示例使用 WatiN。有了这个,我在脚本中写了几行,例如GoImage.Click(),如果图像标签的 id 发生变化,我不会更改所有脚本,只会更新映射。

不应该自动化的测试

并非每个测试都应该自动化。有时,自动化测试比手动运行测试需要更长的时间。如果这是一个您只想运行一次或几次的测试,那么最好根本不要将其自动化。您可以通过创建快速创建自动化测试的方法来缓解这种情况。如果合适的话,数据驱动的测试自动化是实现这一目标的好方法。借助我们的测试自动化框架,我们可以通过修改 Excel 电子表格中的十几行来创建新的测试。

您还应该对创建仅部分自动化的测试脚本犹豫不决。当您可以自动执行测试步骤,但验证必须手动完成时,最常发生这种情况。理论上,您可以通过让自动化飞过 UI 并在用户进行检查时停止来获得一些速度增益,但心理因素会阻碍。大多数人会在自动化运行时退出,并且需要尽可能多的时间来弄清楚他们应该检查什么,因为他们必须手动运行整个测试。

该方法

就像我之前说过的,自动化测试是软件开发,所以这就是你处理它的方式。这是我发现的最基本的测试自动化设计:

接口库

您需要一些可以让您以编程方式控制 UI 的东西。这是商业工具往往做得很好的部分,但最近出现的开源项目也很好地处理了这个问题。对于 Windows UI,有white http://white.codeplex.com/。我从未使用过它,但我喜欢它的 API。 Web 自动化确实属于开源工具,例如watir http://watir.com/ and WatiN http://watin.sourceforge.net.

框架

框架是您自己创建所需的一切的总称。对象映射、辅助函数、数据驱动的脚本运行程序。商业工具试图为您提供这些,但我从未找到能够完全满足我需要的工具。我总是在这里自己滚动。这是大部分维护工作的所在,这就是为什么我如此看不起使用 vbscript 等弱语言的工具。我更喜欢使用 .NET 创建框架。

测试运行者

您需要一些东西来实际运行测试。商业工具也提供了这一点,而且它们在这方面做得足够好。但它们实际上并不比单元测试程序更好。是的,NUnit 对于 UI 自动化测试和单元测试一样有用。您还可以相当轻松地编写自定义测试运行程序。

记录和结果

您需要某种方法来知道测试是否成功。大多数现有的日志库(例如 log4n/log4j)都可以工作。测试运行程序通常也内置了此功能。只要您避免使用专有格式,商业工具通常也能获得良好的结果。

测试脚本

显然你需要测试本身。

我想说的最后一件事。测试自动化可以减少执行相同数量的测试所需的时间,但当您有在相同的时间内执行更多测试的心态时,它的效果会更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动化 Windows UI 测试方法 的相关文章

  • 为什么 %processor_architecture% 总是返回 x86 而不是 AMD64

    我正在尝试检索环境变量来检测系统是32位还是64位 但在64位服务器上环境变量 processor architecture 正在返回x86代替AMD64 有人对此有任何线索吗 您可能获得了错误的环境变量 如果您的应用程序是在 64 位操作
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 标准 .NET 库是否依赖于任何非托管 DLL?

    只是出于好奇 NET 框架本身在访问标准库时是否依赖于任何非托管 DLL 例如 我调用方法 A 并且 在幕后 方法 A 或该方法 A 内的任何其他方法对非托管 DLL 执行 PInvoke 是的 Net 库大量使用非托管函数 库可以调用两种
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas
  • 如何指定运行哪个生菜场景

    如何指定运行哪个生菜场景 在使用 python lettuce 测试框架时 我经常遇到这种情况 一个场景失败 然后我想放大这个场景来修复这个场景 我们可以在功能文件中指定要运行的生菜场景吗 您可以使用标签进行所需的测试 例如 Scenari
  • 使用搜索词打开 Windows 资源管理器查找窗格

    我正在尝试创建一个应用程序 该应用程序打开 Windows 资源管理器搜索功能并搜索输入了指定术语的文件 文件夹 我已经有了 Windows Vista SP1 使用 Windows 索引服务引入的 search query 命令的代码 这
  • 如何更改 Settings.settings 值的值

    我有一个简单的控制台应用程序 每天运行 由 Windows 任务计划程序调用 并且取决于每次应用程序运行时递增的值 为了保留这个值 我选择使用 Settings Settings 文件 因此 我有一个名为 RunNumber 和 Scope
  • 尝试使用 C++ 创建一个计划任务运行一次,win7 上的任务计划程序 1.0

    我正在尝试创建一个非常简单的程序 它将在两分钟后运行记事本 这些都经过简化以提出更清晰的问题 我尝试合并一些MSDN 的例子 http msdn microsoft com en us library windows desktop aa3
  • Espresso - 检查使用按钮按下意图打开哪个活动?

    是否可以跟踪按下某个按钮后打开了哪个 Activity 我有一个测试 其中当单击 按下按钮时 it 向服务器发送请求 直到发送请求时 它打开一个活动 验证是否执行成功在测试中 我需要检查打开的 Activity 是什么 我的测试示例 检查
  • Flutter 容器的 onTap 方法

    一直在开发一个 flutter 应用程序并根据一些 Firebase 数据动态构建一些容器 我想知道是否有办法获得容器的 onTap 方法 或任何不是按钮的小部件 这是一个代码示例 child new Container INSERT ON
  • 如何使用 cython 编译扩展?

    我正在尝试从示例页面编译一个简单的 cython 扩展here http docs cython org src userguide tutorial html在我安装了 Python 2 6 64 位版本的 Windows 7 64 位计
  • NSIS获取参数

    to get n 0值作为字符串 不需要选项 传递给安装程序 我不太明白这个函数的工作原理是什么 GetParameters input none output top of stack replaces with e g whatever
  • .NET PInvoke 可以从用户指定的目录动态加载本机 dll 吗?

    我有一个 NET 应用程序 需要加载一个本机库 其位置由用户指定 PInvoke 看起来只会从全局搜索路径 或编译时指定的路径 加载 最好的方法是创建一个在运行时调用 LoadLibrary 的 C CLI 程序集吗 C CLI 会比 C
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 使用 RSpec 进行 Rails 片段缓存测试

    我觉得这是一个没有太多记录的主题 至少我在这里找到最佳实践时遇到了很多麻烦 我使用 cache key 在视图中进行片段缓存 tbody employees each do employee cache employee do tr emp
  • select() 可以在 Windows 下使用 Python 中的文件吗?

    我正在尝试在 Windows 下运行以下 python 服务器 An echo server that uses select to handle multiple clients at a time Entering any line o
  • 批处理文件 - 读取特定行,并将该行中的特定字符串保存为变量

    有没有办法让 for f 循环 或其他任何东西 读取特定行 这是我到目前为止的代码 它读取每一行的第一个单词 echo off set file readtest txt for f tokens 1 delims A in file do
  • 让 Jenkins 对远程用户不可见

    我的本地 Windows 设备上有一个 Jenkins 服务器 但我想让它对外界不可见 有关服务器的办公室规则 明显且不隐晦的 效果令人满意的方法是设置防火墙规则来阻止对其端口的传入访问 但我认为必须有一个 Jenkins 设置来阻止它向除

随机推荐

  • 使用 Ruby on Rails ActiveSupport::Concern 功能时如何“嵌​​套”包含模块?

    我正在使用 Ruby 1 9 2 和 Ruby on Rails v3 2 2 gem 鉴于我正在使用 RoR 我想 嵌套 包含模块ActiveSupport 关注 http api rubyonrails org classes Acti
  • after_save 回调将 Updated_by 列设置为 current_user

    我想使用 after save 回调将 Updated by 列设置为 current user 但 current user 在模型中不可用 我该怎么做 您需要在控制器中处理它 首先对模型执行保存 如果成功则更新记录字段 Example
  • 在 Storybook 中隐藏每个故事的插件

    我正在使用 Storybook 和 React 构建一个组件库 使用 CSF 方法包含故事 我有多个插件 并在显示单个故事时使用它们 我还在一个视图中一起显示所有故事 作为参考 我想禁用特定插件的就是这个故事 在这种情况下 我想禁用旋钮 当
  • C# 在构建期间重命名命名空间

    我正在寻找一种在构建过程中重命名第 3 方程序集中的命名空间的方法 以及用户代码中相应的 using 语句 我搜遍了福迪的织工 但没有找到这样的东西 有一个对 ILRepack 的拉取请求可以完成确切的事情 但它似乎已经过时并且没有通过 C
  • System.ArgumentException:程序集中的重复类型名称

    我正在使用 EF 4 1 开发 ASP Net MVC 3 Web 应用程序 从今天开始 我收到此错误 System ArgumentException 程序集中的重复类型名称 我不知道是什么原因造成的 执行查找时 它发生在我的存储库中 p
  • 适用于 iPhone 的 JavaScript 可从非默认 iOS 浏览器在 Safari 中打开

    在移动 Safari 中打开的 googlechrome www lego com 将切换到 Google Chrome iOS 应用程序来打开该 URL 这允许像下面这样的 scriptlet 它允许您从移动 Safari 切换到 Goo
  • Summernote onKeyup 事件未按预期工作

    我将 Summernote 编辑器应用于文本区域 我希望当我在编辑器中键入一些文本时 该文本应反映在 div 中 因此我有一个文本区域和一个 div result 其中应在每次按键时写入更改事件
  • 计算回头客

    我正在分析一家商店的销售数据 并希望计算 第一订单客户 在下个月变成回头客的百分比 我有一个包含所有订单的数据框 其中包括客户 ID 日期和标记 如果这是他 她的第一笔订单 这是我的数据 import pandas as pd data N
  • 运行时之前初始化的数据段值将存储在哪里?

    通常数据段在C code位于RAM易失性存储器 由初始化数据段组成 未初始化数据段 BSS 堆栈内存和堆 堆栈内存仅在运行时调用例程和在push and pull的价值观 堆用于动态内存分配调用malloc calloc and reall
  • 我在 Python 中查找重复循环的正则表达式模式有什么问题?

    我想匹配任何具有重复循环的字符串 就像这个数据一样 3333333333333333333333333333333333333333 1 digit cycle 3 1666666666666666666666666666666666666
  • React 18 的 create-react-app 依赖版本问题

    npx create react app my project导致以下依赖错误 npx版本 8 5 0 Installing template dependencies using npm npm ERR code ERESOLVE npm
  • 通过 Facebook iOS SDK 获取我的所有活动

    在我的 iOS 应用程序中 我使用以下代码获取访问令牌 self facebook authorize NSArray arrayWithObjects user events friends events nil 然后我使用以下代码请求我
  • java堆空间OutOfMemoryError分析工具

    我正在得到一个OutOfMemoryError Java heap space 我可以使用任何工具来查找根本原因吗 您可以使用一些分析工具 例如 eclipse mat 分析应用程序的堆转储 以查看哪些内容消耗了多少堆 但首先您需要获取应用
  • 如何选择不同级别的多个节点?

    拥有这个 简化的 XML
  • Visual Studio 2017 无法安装多个组件

    Visual Studio 2017 社区版发行版的安装程序因多个组件而失败 由于以下原因 产品无法安装列出的工作负载和组件 一个或多个包失败 工作负载不完整 使用 NET进行移动开发 Microsoft VisualStudio Work
  • C++:错误:限定名称的使用无效

    更新 我认为它已经修复了 多谢你们 我收到错误 但我无法弄清楚 我有这个代码 A Structure with one variable and a constructor struct Structure public int dataM
  • 设置背景时按钮变大 - 如何使其变小

    我想让我的按钮在设置背景之前缩小或恢复正常 我知道使用背景色调可以使用相同的背景颜色来解决此问题 但我的问题是我在背景上使用选择器 当选择器设置为按钮背景时 它变得更宽 当我将背景切换为背景色调时 颜色变得不同 例如对我来说是紫色 并且按下
  • 如何在 ActiveAdmin 中正确配置 Rails 4.1 枚举

    我有一个 Rails 4 1 应用程序 其中使用枚举来表示对象的隐私级别 在我的架构中 t integer privacy level default 0 在我的模型中 enum privacy level privacy private
  • 从 SQL 表在 SQL 中创建数据透视视图

    我有下表TEMP 我想使用 SQL 创建一个数据透视视图 排序依据CATEGORYASC 通过LEVEL降序和SETASC 并填写value 预期输出 我已尝试以下代码 但无法解决引发错误的聚合部分 SELECT FROM SELECT S
  • 自动化 Windows UI 测试方法

    我们正在寻求设置自动化 UI 测试 并想知道最好的方法是什么 潜在的陷阱是什么 设置费用是否昂贵 提前致谢 B 自动化测试最大的消耗可能是时间 有很多非常昂贵的工具 但也有免费的工具 即使是昂贵的工具的成本也不太可能与正确设置自动化测试所需