代码之家  ›  专栏  ›  技术社区  ›  Drew Gibson

Delphi中的单元测试-你做得怎么样?[关闭]

  •  57
  • Drew Gibson  · 技术社区  · 16 年前

    我想知道这里的少数Delphi用户是如何进行单元测试的,如果有的话?是否有任何与您发现的IDE集成良好的东西?如果没有,您使用的是什么工具,您是否有或知道演示所有工具如何工作的小型项目示例?

    更新:

    我忘了提到我使用的是BDS 2006 Pro,虽然我偶尔会访问Delphi7,当然其他人也可能使用其他版本。

    9 回复  |  直到 11 年前
        1
  •  39
  •   Lars Truijens    16 年前

    DUnit 是要与Win32 Delphi一起使用的单元测试框架的XUnit类型。自从Delphi2005Dunit被集成到一个certan点到IDE中。可以找到DelphiIDE的其他dunit集成工具 here . 邓尼特和 documentation with examples .

        2
  •  18
  •   mjn anonym    14 年前

    Dunit有一些附加组件,也许这是值得一个新的条目。我现在能列在清单上的两个是

    1. FastMM4 集成:单元测试将自动检测内存泄漏(和其他东西),与Dunit 9.3和更新版本一起使用
    2. OpenCTF 是“组件测试” 框架“基于dunit,it 为动态创建测试 项目中的所有组件 窗体、框架和数据模块,以及 使用自定义规则(开源)测试它们

    alt text http://www.mikejustin.com/images/OpenCTF.gif

        3
  •  9
  •   DavidG    11 年前

    Dunit2可从 http://members.optusnet.com.au/~mcnabp/

    dunit2比原来的dunit更经常修改。它也适用于Delphi2009。

    尝试: http://sourceforge.net/projects/dunit2/ -当原作者彼得·麦克纳布几年前去世时,这本书开始流传。邓尼特邮件列表上还有一些活动。

        4
  •  9
  •   Harriv    11 年前

    开发中的现代Delphi版本有一个新的单元测试框架: https://github.com/VSoftTechnologies/DUnitX

        5
  •  8
  •   Arnaud Bouchez    14 年前

    您可以看看我们的 SynCommons open source unit . 它在我们所有回归测试的开源框架中使用。这也许不是最好的,但值得一看。

    http://blog.synopse.info/post/2010/07/23/Unit-Testing-light-in-Delphi

    为了实现单元测试,您只需通过创建如下类来声明一个新的测试用例:

    type
      TTestNumbersAdding = class(TSynTestCase)
      published
        procedure TestIntegerAdd;
        procedure TestDoubleAdd;
      end;
    
    procedure TTestNumbersAdding.TestDoubleAdd;
    var A,B: double;
        i: integer;
    begin
      for i := 1 to 1000 do
      begin
        A := Random;
        B := Random;
        CheckSame(A+B,Adding(A,B));
      end;
    end;
    

    然后创建一个测试套件,并运行它。

    在最新的1.13版本中,还有一种新的日志记录机制,它可以跟踪任何引发的异常,就像madexcept一样,使用.map文件内容作为源。

    它现在被单元测试类使用,因此任何失败都将在日志中创建一个条目,其中包含源代码行和堆栈跟踪:

    C:\Dev\lib\SQLite3\exe\TestSQL3.exe 0.0.0.0 (2011-04-13)
    Host=Laptop User=MyName CPU=2*0-15-1027 OS=2.3=5.1.2600 Wow64=0 Freq=3579545
    TSynLogTest 1.13 2011-04-13 05:40:25
    
    20110413 05402559 fail  TTestLowLevelCommon(00B31D70) Low level common: TDynArray "" stack trace 0002FE0B SynCommons.TDynArray.Init (15148) 00036736 SynCommons.Test64K (18206) 0003682F SynCommons.TTestLowLevelCommon._TDynArray (18214) 000E9C94 TestSQL3 (163) 
    

    不记录的测试套件和记录的测试套件之间的区别仅在于:

    procedure TSynTestsLogged.Failed(const msg: string; aTest: TSynTestCase);
    begin
      inherited;
      with TestCase[fCurrentMethod] do
        fLogFile.Log(sllFail,'%: % "%"',
          [Ident,TestName[fCurrentMethodIndex],msg],aTest);
    end;
    

    日志机制不仅可以记录测试:您可以记录方法的递归调用,选择要在日志中显示的信息,从客户端分析应用程序,将发布的属性、tlist或tcollection内容作为json写入日志内容,等等…

    第一次读取.map文件时,将创建一个.mab文件,并将包含所需的所有符号信息。您可以将带有.exe的.mab文件发送到客户端,甚至可以将其内容嵌入到.exe中。这个.mab文件被优化:927984字节的.map被压缩成71943.mab文件。

    所以这个单元可以被认为是dunit和madexcept婚礼的自然产物,纯开源。:)

    附加信息是 available on our forum . 请随便问。欢迎反馈和功能请求!从Delphi 6到XE。

        6
  •  3
  •   PetriW    16 年前

    通常我创建一个单元测试项目(文件->新建->其他->单元测试->测试项目)。它包含了我需要的东西,所以到目前为止它已经足够好了。

    我使用Delphi2007,所以我不知道它是否在2006年可用。

        7
  •  2
  •   lukeck    16 年前

    我们使用dunit对所有逻辑代码进行单元测试,并使用包含在 AQTime 检查通过代码的所有路径是否由测试执行。

        8
  •  2
  •   mmmm    15 年前

    我们有两种方法,首先我们有运行的dunit测试,购买开发人员-这些方法确保刚刚更改的代码仍然像以前一样工作。另一种方法是使用CruiseControl.net构建可执行文件,然后在每次进行更改时运行Dunit测试,以确保更改不会产生意外的后果。

    我们的大部分代码库没有测试,因此自动测试是一个持续开发的案例,以确保我们的应用程序按我们认为的那样工作。

        9
  •  1
  •   Gustavo    16 年前

    我们试着把dunit和delphi 5结合使用,但效果不太好。特别是如果您正在实现COM接口,我们发现了许多依赖项来设置所有测试基础结构。我不知道测试支持是否在新版本中有所改进。