DUnit:如何运行测试?

10

如何从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 ,那么窗体就会简单地出现:

alt text

理想情况下,IDE 中应该有一个按钮或菜单选项,用于运行 DUnit 测试:

alt text

我是不是活在梦幻世界里?在棒棒糖小径上的糖果房子里生活?


顺便提一下,如果将业务逻辑分离成类,而不是直接尝试对UI事件处理程序进行单元测试,您会发现单元测试更容易实现。 - Incredulous Monk
@Monk: 其缺点是我的代码分散在多个类或更糟的情况下,分散在多个文件中。 - Ian Boyd
3个回答

12

将测试用例添加到主项目中并不是正确的方法。你应该创建一个单独的测试项目(可以将其放在与主项目相同的项目组中),添加一个测试用例并运行。


1
没错。测试用例代码不应该放在你的应用程序中。你的测试用例项目包含了你的单元测试。你需要创建一个新的单元测试应用程序,将你的应用程序代码添加到单元测试的uses子句中。 - Warren P
2
有没有一种方法可以在不必切换到真实项目的情况下运行测试项目?我想把测试视为“语法检查”、“构建项目”或“构建全部”的类似物。 - Ian Boyd
4
将其作为同一项目组的另一个项目添加,然后您可以从这里执行“构建全部”等操作... - Francesca
@François,我在开发项目时有没有办法运行其他“测试项目”中包含的测试? - Ian Boyd
我觉得人们关心的是测试代码是否在可执行文件中,而不是逻辑上分离并用于测试代码。我认为DUnit可以编译测试用例,这样也没问题... - Ian Boyd
显示剩余2条评论

6

我同意Uwe Raabe的观点,但有时在应用程序中添加一个“隐藏”的链接来运行DUnit GUI是很有用的。我使用以下代码:

TGUITestRunner.runRegisteredTests;

从您的按钮调用此功能,DUnit GUI将为您打开,以手动运行和查看测试输出。


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

enter image description here


如果我有一个带有测试代码的单独项目,那么就不需要单独的项目了吧?我真的不想在项目之间来回切换。我也不想在“真实项目”和“测试项目”之间切换下拉菜单。如果这意味着我的最终可执行文件中嵌入了测试代码:那就这样吧。 - Ian Boyd
5
一个可切换“真实”和“测试”模式的项目?代码可能存在问题。:P - mjn
@Uwe,我更关心易用性,而不是其他人如何使用它。 - Ian Boyd
3
@Warren P:由于有一些(棘手的)情况,您的应用程序安装在客户机上,他(她)没有在旁边看着您,并且您希望能够使用一些低级内置工具(例如DUnit测试)来确保基本功能正常。 Bri - Brian Frost
3
没有人阻止你将TextProject.exe复制到那台机器上并运行它。 - Uwe Raabe
显示剩余8条评论

2

我喜欢在IDE中有一个'Run DUnit tests'命令的想法。

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

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

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

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

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

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


现在只需要有人来编写它 ;) - Ian Boyd
也许是我的支持者之一 :) http://delphi.uservoice.com/forums/4432-general/suggestions/537663-dunit-ide-integration-for-failed-test - mjn

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