【发布时间】:2011-01-12 18:52:12
【问题描述】:
我们正在寻求设置自动化 UI 测试,并想知道最好的方法是什么,潜在的陷阱是什么,设置是否昂贵?
提前致谢。
乙
【问题讨论】:
标签: .net windows user-interface testing automated-tests
我们正在寻求设置自动化 UI 测试,并想知道最好的方法是什么,潜在的陷阱是什么,设置是否昂贵?
提前致谢。
乙
【问题讨论】:
标签: .net windows user-interface testing automated-tests
自动化测试的最大开销可能是时间。有很多非常昂贵的工具,但也有免费的工具。即使是昂贵工具的成本也不可能与正确设置自动化测试所需的时间成本相匹配。只要管理层了解需要大量的前期成本并愿意承担,那么在实际自动化测试时要注意这些:
以维护的形式自动化存在长期成本。请记住,自动化测试是软件开发。这意味着您与任何其他软件都有相同的潜在问题。这也意味着提高软件可维护性的相同方法也适用于自动化测试。 (这就是为什么我认为所有那些使用 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。我从未使用过它,但我喜欢它的 API。 Web 自动化确实属于像watir 和WatiN 这样的开源工具。
框架是您自己创建所需的一切的总称。对象映射、辅助函数、数据驱动的脚本运行器。商业工具试图为您提供这些,但我从来没有找到完全满足我需要的工具。我总是在这里自己动手。这是大部分维护工作的地方,这就是为什么我对使用弱语言(如 vbscript)的工具如此失望的原因。我更喜欢使用 .NET 创建框架。
您需要一些东西来实际运行测试。商业工具也提供了这一点,在这里它们做得很好。但它们实际上并不比单元测试程序好。是的,NUnit 对于 UI 自动化测试和单元测试一样有用。您还可以相当轻松地编写自定义测试运行程序。
您需要某种方式来了解测试是否成功。大多数现有的日志库(如 log4n/log4j)都可以工作。测试运行程序通常也内置此功能。商业工具通常也能很好地处理结果,只要您避免使用专有格式。
显然你需要测试本身。
我想说的最后一件事。测试自动化可以减少执行相同数量的测试所需的时间,但是当您有在相同的时间内进行更多测试的心态时,它会更好地工作。
【讨论】:
我们一直在使用我们自己开发的基于 Microsoft UI 自动化框架的工具和库成功地进行自动化 UI 测试。学习曲线有点陡峭,但值得。
我建议阅读 Michael 的 Automation Stack 以了解如何构建代码。您可能还会发现我的Introduction to UI Automation 很有用。
【讨论】:
UI 测试工具的许可费用可能非常昂贵。值得注意的是,Visual Studio 2010 有能力做UI testing,这可能是一个相对便宜的选择。我不能说它有多好或不好。
【讨论】: