【问题标题】:How to use visual components in delphi unit tests?如何在 delphi 单元测试中使用可视化组件?
【发布时间】:2011-09-13 20:42:14
【问题描述】:

有时在可视化应用程序中很常见,我有一些代码将数据保存在可视化组件(TTreeView 组件)中。我正在重构代码并为逻辑创建单元测试。

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

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

Control '' has no parent window

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

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

当然,在我阳光明媚且遥远的未来,我会重构这个 21000 行表格的代码,我所有的数据都将在漂亮的数据结构中,这些测试将不是必需的,但现在我需要它.

【问题讨论】:

    标签: delphi unit-testing delphi-7 dunit


    【解决方案1】:

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

    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 以获得直接答案,而不是抱怨最佳实践以及单元测试和 GUI 测试之间的区别。 ;)
    • 工作就像一个魅力!它允许我在内存泄漏时打开测试失败的 DUnit 功能。现在,当我释放表单时,一切都被释放了。现在将业务逻辑与界面分离会更容易。谢谢!
    【解决方案2】:

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

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

    但实际上这不是正确的方法。 GUI 测试不同于单元测试。业务逻辑应与您的 GUI 充分分离,以便能够单独对其进行测试,而不是 GUI 和其他“单元”。

    而且 21000 行也不算多,是吗?这里有 50 万行(尽管我也不想重构它们)。 :) 一步一步来。重构小块并为每个重构块编写单元测试。这样,您就可以为将来保留测试,因为它们很有用,即使您的所有代码看起来都很棒且结构化。

    【讨论】:

    • 您的最后两段包含此答案的核心内容。是的,业务逻辑应该分开。为了安全地进行这种分离,需要进行一套强大的测试。因此,需要包含与 GUI 组件相结合的业务逻辑的测试。我的看法是,这个问题不是关于 GUI 测试,而是关于业务逻辑测试,其中存在与 GUI 的不幸耦合。
    • 这是一个艰难的决定。在重构代码之前提供单元测试以检查您的重构不会破坏它会非常方便。但是由于这里没有测试,你必须编写它们,它们只会测试你现在想出的东西。编写这些测试非常耗时,重构所有这些代码意味着您也必须重构测试。因此,我怀疑现在编写这些测试是否会有所回报,而不是在重构过程中。如果时间和金钱充足,现在就写。但他们通常不是。 :)
    • 测试你现在拥有的通常是你想要的。这是发现您的代码是什么以及它的规范是什么的最佳方式。测试用例主要是规范的表达。在重构之后编写测试用例很容易导致无法发现意外的回归。请注意,以上所有内容都假设有一个庞大的现有代码库,用户依赖于其当前行为。
    • 如果您需要模拟以外的外部服务,或者您将“残留”留在某处以进行测试,那么您正在进行集成测试,而不是单元测试。
    • 500,000 行在一个表单中?哇!我的生活并没有我想象的那么糟糕。
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2021-04-27
    • 2013-01-24
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多