Delphi 7、FastMM 和 DUnit GUI 测试出现假内存泄漏的失败测试

3
我遇到了FastMM误报的问题。这次泄漏发生在测试表单的情况下,与我在这里描述的情况非常相似。
我有一个包含一些老旧的VCL控件的表单。第一次运行测试会显示泄漏,但实际上并不存在泄漏。第二次运行没有泄漏。我已经查看了所有DUnit源代码,但无法找到原因以解决它。请问有人能帮助我吗?
我不能承担两次运行测试的成本,因为:1.它将在持续集成中运行;2.有些测试确实需要一些时间,加倍运行不明智。
我在DUnit GUI中勾选了以下三个选项: - 在关闭时报告内存泄漏类型 - 如果有内存泄漏则失败 - 忽略SetUp/TearDown中的内存泄漏
以下是示例代码:
    // form
    type

    TForm2 = class(TForm)
      button1: TButton;
    end;

    implementation

    {$R *.dfm}

    // test
    type

    TTest = class(TGUITestCase)
    private
      a: TForm2;
    public
      procedure SetUp; override;
      procedure TearDown; override;
    published
      procedure Test;
    end;

    implementation

    procedure TTest.Setup;
    begin
      a := TForm2.Create(nil);
    end;

    procedure TTest.TearDown;
    begin
      FreeAndNil(a);
    end;

    procedure TTest.Test;
    begin
      a.Show;
      a.close;
    end;

1
尝试使用您的示例代码重现memleak,但是使用最新的dunit和fastmm(使用delphi 7),我没有发现任何泄漏。在fastmm报告文件中有什么?还可以尝试在项目选项下设置映射文件为详细信息,包括TD32调试信息,并检查使用Debug Dcu-s以获取详细报告。 - balazs
@balazs,没有生成报告。你能给我指出你所使用的DUnit和FastMM版本的链接吗?谢谢! - Rafael Castro
当然,dunit,在撰写此评论时的最新版本为9.3,fastmm4,版本为4.9.9.1。在FastMM4Options.inc中打开FullDebugMode({$define FullDebugMode}),并将FastMM_FullDebugMode.dll复制到exe文件旁边。 - balazs
@balazs 抱歉,伙计,但我已经使用了两者,错误仍然存在。只是为了确保:我检查了DUnit GUI上的最后3个选项:报告内存泄漏,如果泄漏则失败测试用例以及在Setup/Teardown中忽略泄漏。谢谢。 - Rafael Castro
啊,我没有使用DUnit内置的FastMM,而是将Fasmm4手动放到我的项目使用列表的第一位,并且在项目的条件定义列表中不定义FastMM。然后编辑FastMM4Options.inc并设置项目选项。像在常规(非DUnit)项目中一样使用fastmm4。这里有一个很好的介绍。 - balazs
2个回答

4

你重复释放了表单。将操作设置为caFree会使表单自动释放自己。因此,要么删除OnClose方法,要么更好的方法是在测试中创建表单并删除设置和拆卸方法而不释放表单。CaFree会处理这个问题。


0

使用下载版本时,情况偶尔发生。虽然看起来很荒谬,但根本原因是:在加载DUnit GUI后过快地按下"F9"键,就会出现问题。等待几秒钟,就不会报告任何泄漏。

由于我们在这里覆盖了FormShow事件以自动启动测试,在我的情况下问题总是发生。所以,将执行延迟2秒就解决了我的问题。

感谢@balazs帮助我解决问题。


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