如何在delphi单元测试中使用可视化组件?

时间:2011-09-13 20:42:15

标签: delphi unit-testing delphi-7 dunit

正如在视觉应用程序中常见的那样,我有一些代码,其中数据在可视组件(TTreeView组件)中维护。我正在重构代码并为逻辑创建单元测试。

我的测试项目中唯一的可视化形式是GUITestRunner。将来我计划在持续集成服务器下将测试作为控制台应用程序运行,所以我没有任何形式。

当我尝试创建没有父级的TTreeView小部件并使用它时,我收到以下错误:

Control '' has no parent window

在我的测试套件SetUp方法上创建窗口小部件并在TearDown中销毁它的最佳方法是什么?是否可以在控制台应用程序中使用可视窗口小部件?我不需要显示它,甚至不需要处理事件。我只需要创建子节点并访问数据。

我设法让它与丑陋的黑客一起工作,但我想知道是否有一些标准做法。

当然,在我阳光明媚和遥远的未来,我将重构这个2.1万行格式的代码,我的所有数据都将采用漂亮的数据结构,并且这些测试不是必需的,但现在我需要它

2 个答案:

答案 0 :(得分:5)

您需要创建一个隐藏(即不可见)窗口作为父窗口。这是一个示例控制台应用程序,证明这种方法有效。

program HiddenWindow;

{$APPTYPE CONSOLE}

uses
  SysUtils, Forms, StdCtrls;

var
  Form: TForm;

begin
  Form := TForm.Create(Application);
  with TListBox.Create(Form) do begin
    Parent := Form;
    Items.Add('test');//fails if the parent is not set
  end;
end.

答案 1 :(得分:4)

在单元测试中,您测试单元的核心功能(这是一个逻辑而不是实际的文字单元文件)。 GUI通常不是此过程的一部分。

但是,您可以创建一个不可见的表单并在其上放置不可见的控件。 [edit]请参阅David的答案,了解如何做到这一点。 [/编辑] 这样你就可以测试它。你也可以使用视觉控制。甚至有测试套件可以通过运行某种预先录制的宏来填充表格并按下正确的按钮来测试视觉控制。

但实际上这不是正确的方法。 GUI测试与单元测试不同。除了GUI和其他“单位”之外,业务逻辑应该与GUI完全分离,以便能够单独测试它。

21万行不是那么多,是吗?这里有50万行(尽管我不想重构它们)。 :)一步一步。重构小块并为每个重构的部分编写单元测试。这样,您就可以继续测试未来,因为即使您的所有代码看起来都很棒且结构合理, 也很有用。