标签: dunit

如何自定义Test Case向导生成的DUnit测试用例类?

在Delphi安装的文件中查找后,我找到了一个文件

"C:\ Program Files\Embarcadero\RAD Studio\7.0\ObjRepos\en\UnitTestFrameworks.xml"

此文件有许多部分用于设置选项,这些选项会影响由创建新测试用例单元时调用的测试用例向导生成的测试用例代码.大多数这些选项都是不言自明的,但看到一些文档会很棒.

特别是,我想:

  • 添加第二个TestClassComment.

  • 在向导的测试用例基类组合框中有多个选项.我可以通过更改UnitTestFrameworks.xml文件中的节点值来更改此列表中单个项目的值,但无法在列表中显示多个项目.

  • 使用某些属性标记测试类和方法.

目前我只关注Delphi Win 32的个性.

我在这里走在正确的轨道上吗?文档可用或失败,是否有人有任何提示?

delphi customization dunit

32
推荐指数
1
解决办法
666
查看次数

CheckException只接受0参数方法; 我如何测试其他方法抛出异常?

我想知道在dunit中测试异常的最佳做法是什么.我对Delphi中的方法指针不是很熟悉.是否有可能将参数绑定到方法指针,以便可以在没有参数的情况下调用它.目前我总是写一个额外的方法来手动执行"绑定".如果SUT有很多投掷方法,那将会很烦人.

// What i did before i knew abput CheckExcepion
procedure MyTest.MyMethod_BadInput_Throws;
var
    res: Boolean;
begin
    res := false;
    try
        sut.MyMethod('this is bad');
    except
        on e : MyExpectedException do:
            res := true;
    end;
    CheckTrue(res);
end;

// What i do now
procedure MyTest.MyMethodWithBadInput;
begin
    sut.MyMethod('this is bad');
end;

procedure MyTest.MyMethod_BadInput_Throws;
begin
    CheckException(MyMethodWithBadInput, MyExpectedException);
end;

// this would be nice
procedure MyTest.MyMethod_BadInput_Throws;
begin
    CheckException(
        BindArguments(sut.MyMethod, 'this is bad'),  // <-- how to do this
        MyExpectedException);
end;
Run Code Online (Sandbox Code Playgroud)

delphi unit-testing exception dunit

28
推荐指数
1
解决办法
3622
查看次数

测量Delphi中的代码覆盖率

有没有办法用DUnit测量代码覆盖率?或者是否有任何免费工具实现?你用的是什么?你通常会使用什么代码覆盖?

Jim McKeeth:谢谢你的详细解答.我说的是TDD方法意义上的单元测试,不仅仅是发生故障后的单元测试.我对一些基本的预写单元测试可以实现的代码覆盖感兴趣.

delphi unit-testing code-coverage dunit

24
推荐指数
4
解决办法
4916
查看次数

我可以在DUnit中编写'参数化'测试吗?

我正在使用DUnit来测试Delphi库.我有时会遇到一些情况,我会编写几个非常相似的测试来检查函数的多个输入.

有没有办法在DUnit中编写(类似的东西)参数化测试?例如,为适当的测试程序指定输入和预期输出,然后运行测试套件并获得有关多次运行测试失败的反馈?

(编辑:一个例子)

例如,假设我有两个这样的测试:

procedure TestMyCode_WithInput2_Returns4();
var
  Sut: TMyClass;
  Result: Integer;
begin
  // Arrange:
  Sut := TMyClass.Create;

  // Act:
  Result := sut.DoStuff(2);

  // Assert
  CheckEquals(4, Result);
end;

procedure TestMyCode_WithInput3_Returns9();
var
  Sut: TMyClass;
  Result: Integer;
begin
  // Arrange:
  Sut := TMyClass.Create;

  // Act:
  Result := sut.DoStuff(3);

  // Assert
  CheckEquals(9, Result);
end;
Run Code Online (Sandbox Code Playgroud)

我可能会有更多的这些测试做同样的事情,但有不同的输入和期望.我不想将它们合并到一个测试中,因为我希望它们能够独立通过或失败.

delphi dunit delphi-xe parameterized-unit-test

22
推荐指数
3
解决办法
2399
查看次数

当使用Bold编写Delphi框架时,提高可测试性

背景 我在一个由7名开发人员和2名测试人员组成的团队中工作,这些团队负责物流系统.我们使用Delphi 2007和模拟驱动开发与Bold for Delphi作为框架.该系统现已投入生产约7年,拥有约1,700万行代码.我们在4-5周后发布到生产,几乎每次发布后我们都要为我们没有找到的bug做一些补丁.这对我们和客户来说当然都很烦人.

当前测试 解决方案当然是更自动化的测试.目前我们有手动测试.一个Testdbgenerator,以空数据库开头,并从建模方法中添加数据.我们还有Testcomplete,它运行一些非常基本的脚本来测试GUI.缺乏时间阻止我们添加更多测试,但脚本对应用程序中的更改也很敏感.几年前我真的尝试用DUnit进行单元测试,但是几天后我放弃了.这些单位的联系太紧.

单元测试前提条件 我认为我知道单元测试的一些前提条件:

  • 编写做一件事的小方法,但做得好.
  • 不要重复自己.
  • 首先编写失败的测试,然后编写代码以便测试通过.
  • 单位之间的联系是松散的.他们对彼此不太了解.
  • 使用依赖注入.

使用的框架 我们可能会升级到Delphi XE2,主要是因为64位编译器.我看了一下Spring,但这需要D2007的更新,现在不会发生.或许明年.

问题 大多数代码仍然没有自动测试.那么提高旧代码可测试性的最佳途径是什么?或者也许最好只开始为新方法编写测试?我不确定增加自动测试的最佳方法是什么,欢迎提出意见.我们现在可以使用D2007 + DUnit,然后轻松更改为Delphi XE2 + Spring吗?

编辑:关于手动测试的当前测试方法只是"敲打它并尝试打破它" 克里斯称之为.

delphi unit-testing dunit delphi-2007 bold-delphi

19
推荐指数
1
解决办法
750
查看次数

如何开始单元测试新旧代码?

我承认我几乎没有单元测试经验.我刚才尝试使用DUnit,但放弃了,因为我的应用程序中的类之间存在很多依赖关系.它是一个相当大的(大约150万个源代码行)Delphi应用程序,我们是一个维护它的团队.

现在的测试是由一个人在发布之前使用它并报告错误.我还在TestComplete 6中设置了一些GUI测试,但由于应用程序的更改,它经常失败.

Bold for Delphi用作数据库的持久性框架.我们都同意单元测试是要走的路,我们计划在DotNet中编写一个新的应用程序,ECO作为持久性框架.

我只是不知道从哪里开始进行单元测试...任何好书,网址,最佳实践等?

delphi unit-testing dunit

18
推荐指数
2
解决办法
950
查看次数

如何使用DUnit测试私有方法?

我有一个班级,我正在与DUnit进行单元测试.它有一些方法,一些公共方法和私有方法.

type
  TAuth = class(TDataModule)
  private
    procedure PrivateMethod;
  public
    procedure PublicMethod;
  end;
Run Code Online (Sandbox Code Playgroud)

为了为这个类编写单元测试,我必须公开所有的方法.

是否有一种不同的方式来声明私有方法,以便我仍然可以测试它们,但它们不公开?

delphi unit-testing dunit

17
推荐指数
3
解决办法
3973
查看次数

如何在DUnit中使用FastMM启用内存泄漏跟踪?

在GUI测试运行器中,内存泄漏检查的菜单项处于非活动状态(变灰).是否有一个特殊的开关我还没有找到激活它们?

使用DUnit 9.4(来自Delphi 2009或来自sourceforge Subversion存储库)和FastMM4.92

delphi memory-leaks dunit fastmm

13
推荐指数
1
解决办法
1925
查看次数

DUnit测试层次结构

目前我在DUnit中使用2级测试层次结构(测试项目 - >测试用例 - >测试方法;参见下面的示例).是否有可能引入第三级甚至更多级别?

DUnit示例

delphi dunit

13
推荐指数
2
解决办法
1075
查看次数

使用FreeOnTerminate = True的TThread的Delphi单元测试

当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)

delphi unit-testing dunit tthread delphi-2010

12
推荐指数
1
解决办法
4500
查看次数