我使用DUnit框架为我的应用程序提供了一个单元测试项目.这个项目有一个单元,$IFDEF用于在xml文件而不是gui或just命令行中输出测试结果.通过切换Build配置启用XML_OUTPUT定义.
program DelphiCodeToDoc_Tests;
uses
TestFramework,
TextTestRunner,
Sysutils,
Forms,
GUITestRunner,
{$IFDEF XML_OUTPUT}
XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas',
{$ENDIF}
DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
...
Run Code Online (Sandbox Code Playgroud)
这非常有效.当我从IDE(一个带有'File> New> Unit' 的新单元)向该项目添加一个新单元时,问题就出现了.
测试项目现在是:
uses
TestFramework,
TextTestRunner,
Sysutils,
Forms,
GUITestRunner,
DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
...
MyNewUnit in 'IntegrationTests\MyNewUnit.pas';
Run Code Online (Sandbox Code Playgroud)
如您所见,测试XML_OUTPUT已消失...每次添加单元时,Delphi IDE都会删除此测试.
你知道我为什么以及如何避免它?
对于集成测试,我创建了一个DUnit测试套件,它为每个版本的第三方组件(消息代理)运行一次.不幸的是,由于某些版本的测试组件中存在已知错误,因此某些测试总是失败.
这意味着测试套件永远不会以100%完成.但是,对于自动化测试,需要100%的成功分数.DUnit没有提供现成的方法来按名称禁用测试套件中的测试.
我有一个dunit测试项目,我试图在控制台模式下运行它.当我执行项目时,它运行两次(它只打开一个控制台窗口,我看到它执行了两次测试),并且执行时也比在GUI模式下运行时花费更多时间.有谁知道如何只运行一次dunit控制台测试?
DPR源代码:
var
R: TTestResult;
begin
Application.Initialize;
if IsConsole then begin
with TextTestRunner.RunRegisteredTests(rxbHaltOnFailures) do begin
R := TextTestRunner.RunRegisteredTests;
ExitCode := R.ErrorCount + R.FailureCount;
Free;
end
end
else begin
GUITestRunner.RunRegisteredTests;
end;
end.
Run Code Online (Sandbox Code Playgroud) 正如在视觉应用程序中有时常见的那样,我有一些代码,其中数据在可视组件(TTreeView组件)中维护.我正在重构代码并为逻辑创建单元测试.
我的测试项目中唯一的可视化形式是GUITestRunner.将来我计划在持续集成服务器下将测试作为控制台应用程序运行,所以我没有任何形式.
当我尝试创建没有父级的TTreeView小部件并使用它时,我收到以下错误:
Control '' has no parent window
Run Code Online (Sandbox Code Playgroud)
在我的测试套件SetUp方法上创建小部件并在TearDown中销毁它的最佳方法是什么?是否可以在控制台应用程序中使用可视窗口小部件?我不需要显示它,甚至不需要处理事件.我只需要创建子节点并访问数据.
我设法让它与一个丑陋的黑客一起工作,但我想知道是否有一些标准的做法.
当然,在我阳光明媚和遥远的未来,我将重构这个2.1万行格式的代码,我的所有数据都将处于漂亮的数据结构中,并且这些测试不是必需的,但现在我需要它.
我正在努力用DUnit成功模拟一个Spring4d事件.
事实上,我更嘲笑一个模拟返回模拟事件...
这是基本结构.
TMyObject --EventContainer--> TMock<IEventContainer> --Event--> TMock<IEvent>
Run Code Online (Sandbox Code Playgroud)
TMyObject有一个属性EventContainer:IEventContainer
IEventContainer有一个属性Event:IMyEvent
我想嘲笑
MyObject.EventContainer.Event.Add
Run Code Online (Sandbox Code Playgroud)
我测试了我能想到的每种可能性.我得到AV或无效的演员.我把源代码放在下面.如果有人能帮助我让这个工作真的很漂亮!
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
DUnitTestRunner,
Spring.Events,
Spring,
Classes,
TestFramework,
Delphi.Mocks;
//Unit1 in 'Unit1.pas';
type
{$M+}
IMyEvent = interface(IEvent<TNotifyEvent>)
procedure Add(const handler: TMethod);
end;
{$M-}
{$M+}
IMyEventMock = interface(IMyEvent)
procedure Add(const handler: TMethod);
end;
{$M-}
{$M+}
IEventContainer = interface(IInterface)
function GetEvent: IMyEvent;
procedure SetEvent(const Value: IMyEvent);
property Event: IMyEvent
read GetEvent
write SetEvent;
end;
{$M-}
{$M+}
ITestEventContainer = interface(IEventContainer)
function GetEvent: TMock<IMyEvent>;
procedure SetEvent(const …Run Code Online (Sandbox Code Playgroud) 我在寻找一种方式来轻松和简洁地写为Delphi下DUnitX测试框架间谍.
在过去,我使用非常难看的方式:
[TestFixture]
Test = class(TObject)
public
[test]
procedure Test1;
end;
TMyClass = class(TObject)
protected
procedure MyProcedure; virtual;
end;
TMyTestClass = class(TMyClass)
protected
fMyProcedureCalled : Boolean;
procedure MyProcedure; override;
end
procedure TMyTestClass.MyProcedure;
begin
fMyProcedureCalled := true;
inherited;
end;
procedure Test.Test1;
var aObj : TMyTestClass;
begin
TMyTestClass.Create;
Assert.IsTrue(aObj.fMyProcedureCalled);
end;
Run Code Online (Sandbox Code Playgroud)
所有这些代码都用于检查是否调用了一个过程.那太冗长了!
有没有办法写一个可以帮助我减少代码的间谍?