当FreeOnTerminate = True时,为TThread后代编写Delphi DUnit测试的最佳方法是什么?TThread后代返回一个我需要测试的引用,但我无法弄清楚如何等待线程在测试中完成...
unit uThreadTests;
interface
uses
Classes, TestFramework;
type
TMyThread = class(TThread)
strict private
FId: Integer;
protected
procedure Execute; override;
public
constructor Create(AId: Integer);
property Id: Integer read FId;
end;
TestTMyThread = class(TTestCase)
strict private
FMyId: Integer;
procedure OnThreadTerminate(Sender: TObject);
protected
procedure SetUp; override;
procedure TearDown; override;
published
procedure TestMyThread;
end;
implementation
{ TMyThread }
constructor TMyThread.Create(AId: Integer);
begin
FreeOnTerminate := True;
FId := AId;
inherited Create(False);
end;
procedure TMyThread.Execute;
begin
inherited;
FId := FId + 1;
end; …Run Code Online (Sandbox Code Playgroud) DUnit通常的工作方式是编写一些已发布的方法,而DUnit将它们作为测试运行.我想做的是有点不同.我想在运行时根据数据创建测试.我正在尝试测试处理输入文件的特定模块以创建输出文件.我有一组测试输入文件,其中包含相应的已知良好输出文件.我们的想法是为每个输入文件动态创建一个测试,处理输入并根据已知的好输出检查输出.
然而,这里的实际数据来源并不重要.困难在于使DUnit以数据驱动的方式运行.为了解决这个问题,假设数据源只是一个随机数生成器.这是一个解决困难核心的示例具体问题:
在运行时创建一些测试对象(TTestCase或其他),比如10个,每个测试对象
从DUnit的设计来看,它的设计看起来具有足够的灵活性,使这些事情成为可能.我不确定它是不是.我试图通过继承TAbstractTest和ITest来创建我自己的测试类,但是一些关键的方法无法访问.我也尝试从TTestCase继承,但是这个类与运行已发布方法的想法密切相关(并且测试以方法命名,所以我不能只调用一个,比如'go',因为那时候我所有的测试都会被称为'go',我希望我的所有测试都被单独命名).
或者,是否有一些替代DUnit可以做我想要的?
我们有一个庞大的Delphi项目(150万行代码),我们正在转向使用敏捷流程.
我们已经有了一个连续的集成环境(FinalBuilder),我已将其更新为包含单元测试(dUnit)和代码指标(CodeHealer)的电子邮件给我们开发团队中的每个人.我们的单元测试覆盖率并不高,所以我现在正试图将AQtime纳入混合,以便在每次构建时获得一些测试覆盖率结果.
我正在使用"执行程序"任务来运行单元测试可执行文件,记录结果并随后解析文件.我打算使用"运行脚本"任务来运行AQtime(通过COM)并将结果导出到XML,以便我可以解析这些结果.
我遇到的问题是AQtime运行单元测试可执行文件,我失去了直接监视单元测试可执行文件的能力.我想让FinalBuilder解析两个任务的结果.有没有人知道如何从AQtime调用dUnit结果?
我如何从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.
Run Code Online (Sandbox Code Playgroud)
现在我将添加一个测试用例来检查推送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 …Run Code Online (Sandbox Code Playgroud) 有没有办法编写单元测试,以便可以使用Delphi和Free Pascal编译和运行它们?
Delphi和Free Pascal有不同的单元测试框架,这会导致针对两个编译器(例如,库和框架开发人员)的开发人员的重复工作.
所以也许有一种方法,使用DUnit或FPCUnit框架并调整测试用例源代码(或框架本身),以便它也可以与其他编译器一起使用.
基本上问题是:
要么
有没有办法比较两个文本文件,并显示差异,如果他们在dunit不相同?
简单的开始是将它们读取到TStringList,但是用于比较两个文本文件的代码要复杂得多,而且DUnitGui中的gui对此不够.
任何的想法?建议?
我正在使用Delphi XE,我有一个包含主应用程序和DUnit测试应用程序的项目组.我不时会去DUnit测试应用程序添加一些测试并运行现有测试.
一些测试代码生成由应用程序处理的异常,但由Delphi Debugger多次显示,因为我习惯使用F9快捷方式运行测试应用程序,就像我使用标准应用程序一样:在这种情况下,这不是很方便.
我知道在没有调试的情况下运行的SHIFT+ CTRL+ F9快捷方式,当我记得使用它时这很好但是我经常发现自己打F9,然后咕,然后关闭测试应用程序,然后点击SHIFT+ CTRL+ F9.多么浪费时间.
所以我的问题是:有更好的方法吗?我可以定义一些设置或使用某些专家来默认运行该特定应用程序而无需调试吗?当然,我不是唯一一个遇到这个问题的人.
提前致谢.
我正在尝试使用RAD Studio XE2附带的DUnit对Firemonkey应用程序(C++)进行单元测试.
问题是,DUnit是一个VCL项目,这使我无法在测试项目中包含Firemonkey单位表格(例如:UfrmMain.h).
即使我将Visual与Logic(MultiTier/MVC)分开,我也不能在我的类中包含任何Firemonkey库(当有一个类"CustomDatabase"具有类型为TConnection的对象时,这有用,这是有用的在Firemonkey中 - 当然只是一个例子).
当我完全分离firemonkey代码并将其保留在表单上时,可以进行测试,并且逻辑/数据保留在具有纯C++代码的类上.
那么,这种"障碍"实际上是一件好事吗?强迫我使用MultiTier/MVC?(C++中的这个东西对我来说是新的)或者我应该寻找单元测试的替代方案,让我也可以测试表单?
(你能在github或代码示例中推荐一些C++项目,它以上面提到的方式分开,我可以依赖吗?)
为什么我不能在Dunit Test projet中设置版本信息?该项目的复选框已禁用,但其他项目未禁用.看截图:

delphi ×10
dunit ×10
unit-testing ×5
delphi-2010 ×2
aqtime ×1
debugging ×1
delphi-5 ×1
diff ×1
dynamic ×1
finalbuilder ×1
firemonkey ×1
freepascal ×1
svn ×1
tdd ×1
tthread ×1
version ×1
windows ×1