【问题标题】:DUnit: How to run tests?DUnit:如何运行测试?
【发布时间】:2011-01-30 10:18:26
【问题描述】:

如何从 IDE 运行 TestCase

我创建了一个新项目,具有一个简单的表单:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

end.

现在我将添加一个测试用例来检查推送 Button1 是否符合预期:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
    TestFramework;

type
  TForm1Tests = class(TTestCase)
  private
        f: TForm1;
  protected
     procedure SetUp; override;
     procedure TearDown; override;
  published
     procedure TestButton1Click;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    //todo
end;

{ TForm1Tests }

procedure TForm1Tests.SetUp;
begin
  inherited;

    f := TForm1.Create(nil);
end;

procedure TForm1Tests.TearDown;
begin
    f.Free;
  inherited;
end;

procedure TForm1Tests.TestButton1Click;
begin
    f.Button1Click(nil);
    Self.CheckEqualsString('Hello, world!', f.Caption);
end;

end.

鉴于我所做的(GUI 项目中的测试代码),我现在如何触发测试运行?如果我按下 F9 则表单会简单地出现:

理想情况下,IDE 中应该有一个按钮或菜单选项,显示 Run DUnit Tests

我生活在一个梦幻世界吗?一个幻想的土地,住在棒棒糖巷的橡皮糖屋里?

【问题讨论】:

  • 顺便说一句,如果您将业务逻辑分成类,而不是尝试直接对 UI 事件处理程序进行单元测试,您会发现更容易进行单元测试。
  • @Monk:缺点是我的代码分布在多个类中,或者更糟糕的是多个文件。

标签: delphi unit-testing tdd delphi-5 dunit


【解决方案1】:

向主项目添加一个 TestCase 不是要走的路。您应该创建一个单独的 TestProject(您可以将它放在与主项目相同的 ProjectGroup 中),添加一个 TestCase 并运行。

【讨论】:

  • 没错。测试用例代码不属于您的应用程序。您的测试用例项目包含您的单元测试。创建一个新的单元测试应用程序,将应用程序代码添加到单元测试的使用子句中。
  • 有没有一种方法可以运行测试项目而无需离开真实项目?我想处理类似于Syntax CheckBuild ProjectBuild All 的测试。
  • 将其作为另一个项目添加到同一项目组。然后你可以从这里开始构建等等......
  • @François 有没有办法在我正在开发的项目中运行其他“测试项目”中包含的测试?
  • 在我看来,人们关心的是测试代码在可执行文件中,而不是在逻辑上是分开的——并用于测试代码。我可以使用 DUnit 来编译测试用例...
【解决方案2】:

我同意 Uwe Raabe 的观点,但有时在您的应用程序中设置一个“隐藏”链接以运行 DUnit GUI 会很有用。我用:

TGUITestRunner.runRegisteredTests;

从 DUnit GUI 上的按钮调用此选项,您可以手动运行和查看测试输出。


例如,如果你在打开软件自带的“控制面板”时按住一个特殊的组合键,你会得到一些高级条目:

【讨论】:

  • 为什么这比将 MyApp 和 MyApp_Tests 作为两个独立项目的项目组更好?
  • 如果我有一个带有测试代码的单独项目,那么不会有一个单独的项目吗?我真的不想在项目之间切换。我不想在“真实项目”和“测试项目”之间翻转下拉菜单。如果这意味着我在最终的可执行文件中嵌入了测试代码:那就这样吧。
  • 一个可切换的“真实”和“测试”模式项目?代码闻起来很香:P
  • @Warren P:因为您的应用程序在客户的机器上存在(讨厌的)情况,所以他(她)不会在您的肩膀上看着您,您祝福您可以使用一些低级构建在诸如 DUnit 测试之类的工具中,以确保您基本没问题。布里
  • @Brian Frost:没有人阻止你将 TextProject.exe 复制到那台机器上并运行它。
【解决方案3】:

我喜欢在 IDE 中使用 'Run DUnit tests' 命令的想法。

可以通过在同一文件夹中检查与当前项目同名的 DUnit 项目来实现:

  • Project1.dpr -> 被测软件
  • Project1.Tests.dpr => DUnit 测试应用程序

在这种情况下,IDE 应该启用 Run DUnit tests 命令。

  • 执行测试后,应显示所有失败测试的列表,允许跳转到测试失败的源代码行。

  • 如果测试导致内存泄漏,应显示所有泄漏的列表,允许跳转到已创建内存泄漏的源代码行

(DUnit 可以配置为检测内存泄漏并在发现内存泄漏时测试失败)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2011-05-15
相关资源
最近更新 更多