我使用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',
...
这完美无缺。 当我从IDE(一个带有'File> New> Unit'的新单元)向IDE添加新单元时,问题开始。
现在测试项目:
uses
TestFramework,
TextTestRunner,
Sysutils,
Forms,
GUITestRunner,
DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas',
...
MyNewUnit in 'IntegrationTests\MyNewUnit.pas';
如您所见,测试XML_OUTPUT已消失...每次添加单元时,Delphi IDE都会删除此测试。
你知道我为什么以及如何避免它?
答案 0 :(得分:7)
您可以向主程序添加代理单元以绕过这种有问题的行为(我们许多人认为这是一个错误,而不是一个功能)。
program DelphiCodeToDoc_Tests;
uses
...
XMLTestRunnerProxy,
...
和
unit XMLTestRunnerProxy;
interface
{$IFDEF XML_OUTPUT}
uses
XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas';
{$ENDIF}
implementation
end.
答案 1 :(得分:5)
DPR的使用列表由IDE管理。不幸的是,你无能为力。正式地说,你不应该将IFDEF放在DPR的使用列表中间,因为如果你这样做,它会做这样的事情。
我要做的是将XmlTestRunner2单元留在项目中,并将IFDEF放在单元内部,这样如果你没有设置XML_OUTPUT,它就不会编译任何东西。
答案 2 :(得分:5)
无论如何,只有实际使用的代码被编译到您的应用程序中,所以通常情况下,Uses
子句中的单元没有被使用也没什么坏处。
在IDE中运行程序时,可以看到链接到应用程序的所有代码。您应该在所有已编译的代码旁边看到蓝点。
唯一需要注意的是,您应该检查所关注单位的initialization
部分。初始化部分中的任何代码都是通过包含单元自动包含的,因为该部分中的任何代码都会在应用程序启动后立即运行。如果需要,您可以在单元的初始化部分中添加编译器指令,以避免链接和运行任何初始化代码。
答案 3 :(得分:5)
只要IDE必须修改DPR的USES子句,就会发生剥离。使用“另存为”重命名单位将执行相同的操作。
要解决此问题,我总是在外部创建新单元作为空文本文件,然后手动将它们添加到DPR中。最初的工作要多一些,但如果必要,你最终只会包含单位。另请注意,如果您在Delphi 2005之后使用任何内容时发生这种情况,您可以切换到编辑窗格底部的“历史记录”选项卡,并复制“本地文件”内容以获取该单元之前的版本被添加,其他一切都被剥夺了。
是的,这是一个错误。 QC#6294具体而言,它是公开的,所以Embarcadero意识到了这个问题。
答案 4 :(得分:0)
考虑有两个项目。一旦使用可选代码,一个没有。然后构建任何你想要的,或两者兼而有之。使用项目组,它们可以很好地工作。