测试Delphi应用程序的最佳方法

12

我有一个 Delphi 应用程序,它有许多依赖项,重构成使用 DUnit 进行测试会很困难(它太大了),因此我考虑使用类似 AutomatedQA 的 TestComplete 来通过前端 UI 进行测试。

我的主要问题是,修复 bug 或添加新功能有时会破坏以前经过手动测试并且之前运作良好的旧代码。

我已经设置应用程序使用命令行开关来打开可以进行测试的特定表单,并且我可以创建一组需要完成的值和点击操作。

但在采取任何激进措施之前,我有几个问题……(并且在购买任何东西之前)

  1. 这值得吗?
  2. 这是一个好的测试方式吗?
  3. 测试的结果应该在我的数据库中(Oracle),在 testcomplete 中是否有一种简单的方法来检查这些值(多个表格中的多个字段)?
  4. 我需要设置一个测试数据库来进行所有自动化测试,是否有一种简单的方法来自动重置测试数据库?除了 drop user cascade、create user、impdp 之外。
  5. 在 testcomplete 中是否有一种指定 exe 的命令行参数的方法?
  6. 有人有类似的经验吗?
7个回答

14

我建议你计划同时使用DUnit和类似TestComplete这样的工具,因为它们各自有不同的用途。

DUnit非常适合单元测试,但对于整体应用程序测试和UI测试使用起来比较困难。

TestComplete是少数几个实际上支持Delphi的自动化测试产品之一,而我们的QA工程师告诉我他们的支持非常好。

请注意,设置自动化测试是一项庞大且耗时的工作。如果您严格地应用单元测试和自动化UI测试,您可能会得到比生产代码更多的测试代码。

对于一个大型(现有的)应用程序来说,您在实施自动化测试方面会面临困难。

我的建议是首先设置单元测试,结合自动构建服务器使用。每当有人向源代码控制提交任何内容时,单元测试将自动运行。不要尝试立即为所有内容设置单元测试 - 对于现有应用程序来说,这只是一项太大的努力。只需记住在添加新功能和进行更改之前创建单元测试。我还强烈建议在修复错误之前,每当报告有一个错误时,都要创建一个可以重现该错误的单元测试。


10

我处于类似的情况中(大型应用程序,有很多依赖项)。几乎没有自动化测试。但是我们非常希望解决这个问题。这就是为什么我们将在每个新版本中解决一些问题的原因。

我们即将发布新产品的第一个版本。第一批迹象是好的。但这需要很多工作。所以下一个版本,我们肯定需要某种方式来自动化测试过程。这就是为什么我已经开始引入单元测试了。虽然由于依赖关系,这些不是真正的单元测试,但你必须从某个地方开始。

我们已经做了以下事情:

  • 引入更面向对象的方法,因为代码的很大一部分仍然是过程式的。
  • 在文件之间移动东西。
  • 尽可能消除依赖关系。

但是还有更多要求的事情,足以让整个团队忙到退休。

也许我有点奇怪,但清理代码可以很有趣。没有单元测试的重构是一项危险的任务,特别是如果有很多副作用。我们使用配对编程来避免愚蠢的错误。还有很多测试会话。但最终我们拥有了更干净的代码,并且引入的新错误数量极少。

哦,一定要知道这是一个昂贵的过程。需要很多时间。而且你必须抵制一次解决多个问题的倾向。


3
我无法回答所有问题,因为我从未使用过testcomplete,但我可以回答其中一些。
1 - 是的。回归测试是值得的。作为开发人员,当客户回来告诉你曾经运行正常的东西现在已经出了问题时,这会让你感到非常尴尬。始终确保曾经运行正常的所有内容仍然正常运行是一个好主意。
4 - Oracle有一个称为Flashback的东西,它允许您在数据库中创建还原点。在完成测试后,您可以跳回到此还原点。您也可以编写脚本来使用它,例如FLASHBACK DATABASE TO TIMESTAMP (FEB-12-2009, 00:00:00);等。

谢谢,但闪回数据库没有意义,你帮我找到了如何在Oracle中回溯模式的方法,在http://halisway.blogspot.com/2007/01/flashback-user-or-schema-in-oracle.html中。谢谢。 - Osama Al-Maadeed

3
我们正在考虑使用VMware来隔离一些测试环境。
您可以从已保存的快照开始,这样您就始终拥有一致的环境和本地数据库状态。
VMware操作可以进行脚本编写,因此您可以自动从网络位置安装最新版本构建,启动测试,并在之后关闭。

我在考虑在VMWare上进行实际测试,可能在不同的操作系统上(2000、XP、Vista、7、...、2000服务器、2003服务器)。 - Osama Al-Maadeed

3
  1. 这值得吗?

很可能。设置和维护测试可能是一项艰巨的工作,但是一旦你拥有了它们,测试可以非常轻松和一致地执行。如果您的项目正在发展,某种测试套件非常有帮助。

  1. 这是一个好的测试方式吗?

我认为适当的 DUnit 测试套件是更好的第一步。然而,如果您有大型代码库,该代码库没有进行测试工程化,则设置功能测试比设置 GUI 测试更加困难。

  1. 测试结果应在我的数据库(Oracle)中,有没有一种简单的方法在 TestComplete 中检查这些值(多个表中的多个字段)?

TestComplete 有 ADO 和 BDE 接口。或者您可以使用 VBScript 中的 OLE 接口来访问所有可用的内容。

  1. 在 TestComplete 中是否有一种指定 exe 命令行参数的方法?

是的。


0

在(旧)应用程序中引入单元测试的一种方法是使用“启动数据库”(类似于Rich Adams描述的“Flashback”功能)。该程序使用DUnit控制GUI进行单元测试。请参阅http://delphixtreme.com/wordpress/?p=181上的“使用DUnit进行GUI测试”。

每次通过还原到“启动数据库”来启动测试,因为这样可以使用已知的数据集。


0
我需要设置一个测试数据库来进行所有自动化测试,是否有一种简单的方法来自动重置测试数据库?
使用事务:在测试完成时执行回滚。这应该将所有内容恢复到初始状态。
推荐阅读:

http://xunitpatterns.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接