标签: dunitx

我可以将一个集合传递给DUnitX中的测试用例吗?

我正在尝试在运行测试后检查对象的状态.该状态包含在一组中.是否可以使用DUnitX属性将预期状态传递给测试用例,以便我可以对所有不同的输入使用相同的测试?

我试图将集合作为常量或集合传递,但在我的测试例程中,它总是以空集的形式到达.

  • 这有可能使用属性吗?
  • 你如何测试集合是否相同?

示例代码:

type
  TResult = (resOK,resWarn,resError);
  TResultSet = set of TResult;

const
  cErrWarn : TResultSet = [resWarn];

type
  [TestFixture]
  TMyTest = class(TBaseTest)
    [Test]
    [TestCase('Demo1','InputA,[resWarn]')] // <-- tried as a set
    [TestCase('Demo2','InputB,cErrWarn')]  // <-- tried as a constant

    procedure Test(Input:string; ExpectedResult: TResultSet);
  end;

procedure TMyTest.Test(Input:string; ExpectedResult: TResultSet);
begin
  // ExpectedResult is always the empty set []
  RunTests(MyObject(Input));
  Assert.AreEqual(ExpectedResult, MyObject.ResultSet);
end;
Run Code Online (Sandbox Code Playgroud)

我还试图将Expected结果定义为数组,但是DUnitX甚至不再调用测试.可能那只是"太多"

    procedure Test(Input:string; ExpectedResult: array of TResult);
Run Code Online (Sandbox Code Playgroud)

到目前为止我能想出的最好的方法是使用以下方法.获取最多三个样本(在此处插入您喜欢的整数...)预期状态并单独检查这些状态.这并不是我所希望的,但它确实可以解决问题.

    procedure Test(Input:string; R1,R2,R3: TResult);
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助.:)

delphi unit-testing dunitx

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

单元测试 - 如何将带逗号的字符串传递到 DUnitX 中的测试用例

如果我有一个带有字符串参数的单元测试,并且我想检查输入字符串在某处是否有逗号( ,),我应该创建一个带有逗号的输入字符串。

但是如何将它传递给TestCase呢?

[Test]    
[TestCase('TestA', '12,34')]  //AValue1 gets only '12' instead of '12,34'
[TestCase('TestB', '12,,34')] //AValue1 gets only '12' instead of '12,34'
[TestCase('TestC', '12/,34')] //AValue1 gets only '12/' instead of '12,34'
[TestCase('TestD', '12\,34')] //AValue1 gets only '12\' instead of '12,34'
procedure ValueShouldHaveComma(const AValue1: string); 
Run Code Online (Sandbox Code Playgroud)

delphi unit-testing dunitx

7
推荐指数
1
解决办法
757
查看次数

我可以将类型参数传递给 DUnitx 中的测试用例吗?

我正在为我的 FastCode 项目编写测试用例。

我写了一个通用测试器,如下所示:

  TTest<T> = record
  private
    class var Def: System.Generics.Defaults.IComparer<T>;
    class var F: FastDefaults.TComparison<T>;
  strict private
    class function Slow(const Left, Right: T): integer; static;
    class function Fast(const Left, Right: T): integer; static;
    class constructor Init;
  public
    class procedure Test(const Left, Right: T); static;
  end;
Run Code Online (Sandbox Code Playgroud)

典型的测试用例如下所示:

[Test]
[TestCase('Single', '100.0,100.0')]
...many more testcases...
procedure TestSingle(const L,R: Single);
[Test]
[TestCase('Double', '100.0,100.0')]
...many more testcases... (identical to the one above).
procedure TestDouble(const L,R: double);
Run Code Online (Sandbox Code Playgroud)

测试代码通常如下(对每种类型重复):

procedure TestDefault.TestSingle(const L, R: Single);
begin
  TTest<Single>.Test(L,R); …
Run Code Online (Sandbox Code Playgroud)

delphi generics unit-testing dunitx

4
推荐指数
1
解决办法
1003
查看次数

我们什么时候在 DUnitX 中使用 Assert.Pass() ?

在我看来,如果我只是将其放入测试方法中,Assert.Pass("Some Message") 不会执行任何操作:

procedure TRPMTestObject.TestPlatform;
begin
{$IFDEF WIN64}
  Assert.AreEqual(8, SizeOf(Pointer));
  Assert.Pass('WIN64 Defined');
{$ENDIF}
{$IFDEF WIN32}
  Assert.AreEqual(4, SizeOf(Pointer));
  Assert.Pass('WIN32 Defined');
{$ENDIF}
end;
Run Code Online (Sandbox Code Playgroud)

它不会打印到测试控制台...我们使用此功能的任何场景?

delphi dunitx

3
推荐指数
1
解决办法
712
查看次数

Delphi DunitX FMX GUI 记录器

我有一个基于控制台的 DUNITX 单元测试程序,我正在尝试将其转换为 FMX GUI 输出。在这里阅读了 embarcadero 文档后,我通过执行以下操作修改了测试程序文件:

  1. 包括 DUnitX.Loggers.GUIX 单元
  2. 注释掉 DUnitX.Loggers.Console 单元
  3. 注释掉 {$APPTYPE CONSOLE} 指令
  4. 将 Logger 更改为 logger := TGUIXTestRunner.Create(nil);

修改后的列表如下所示:

program HTMLParserTest;

{$IFNDEF TESTINSIGHT}
//{$APPTYPE CONSOLE}
{$ENDIF}{$STRONGLINKTYPES ON}
uses
  System.SysUtils,
  {$IFDEF TESTINSIGHT}
  TestInsight.DUnitX,
  {$ENDIF }
 //  DUnitX.Loggers.Console,
  DUnitX.Loggers.GUIX,
  DUnitX.Loggers.Xml.NUnit,
  DUnitX.TestFramework,
  test.ITUtils.Delphi in 'test.ITUtils.Delphi.pas',
  ITUtils.Delphi in '..\Concept Test\ITUtils.Delphi.pas',
  test.ITsimplehtmlparser.Delphi in 'test.ITsimplehtmlparser.Delphi.pas',
  ITTools.simplehtmlparser.Delphi in '..\Concept 
   Test\ITTools.simplehtmlparser.Delphi.pas';

var
  runner : ITestRunner;
  results : IRunResults;
  logger : ITestLogger;
  nunitLogger : ITestLogger;
begin
{$IFDEF TESTINSIGHT}
  TestInsight.DUnitX.RunRegisteredTests;
  exit;
{$ENDIF} …
Run Code Online (Sandbox Code Playgroud)

delphi unit-testing dunitx

3
推荐指数
1
解决办法
1459
查看次数

德尔福单元测试:为CUT编写一个简单的间谍

我在寻找一种方式来轻松简洁地写为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)

所有这些代码都用于检查是否调用了一个过程.那太冗长了!

有没有办法写一个可以帮助我减少代码的间谍?

delphi unit-testing dunit spy dunitx

2
推荐指数
1
解决办法
265
查看次数

DUnitX从字符串转换为整数数组

我的问题与类似,但我想传递一个整数数组,而不是一个集合。

例如:

[TestCase('TestAdd','[1,2,3,4];[1,2,3,4]',';')]
procedure TestAdd(aValue, aResult: array of integer);
Run Code Online (Sandbox Code Playgroud)

修改DUnitX.Utils似乎是最干净的方法,但是我不确定如何进行转换。我的主要问题是,它将如何知道我特别需要一个整数数组?我可以利用PTypeInfo中的某些东西吗?

delphi unit-testing dunitx delphi-10-seattle

2
推荐指数
1
解决办法
385
查看次数

DUnitX无法在64位工作?

如果我选择"32位Windows",DUnitX可以工作,但是,当我将它改为"64位Windows"时,它说

[dcc64 Fatal Error] RPMLibTestsX.dpr(14): F2613 Unit 'DUnitX.Windows.Console' not found.
Run Code Online (Sandbox Code Playgroud)

这是预期的吗?

我正在使用RAD Studio 10.1 Berlin Update 2(Delphi)

在此输入图像描述

delphi dunitx

2
推荐指数
1
解决办法
361
查看次数

DUnitX 整数测试始终为真

我有一个这样定义的测试:

[Test]
 [TestCase('TestSetAsInteger 001.', '0')]
 [TestCase('TestSetAsInteger 002.', '666')]
 procedure TestSetAsInteger(IntVal : integer);
Run Code Online (Sandbox Code Playgroud)

并像这样实现:

procedure TTestKeyValueList.TestSetAsInteger(IntVal: integer);
begin
  FKVL.AsInteger['testkey'] := IntVal;
  Assert.AreEqual(IntVal, FKVL.AsInteger['testkey']);
end;
Run Code Online (Sandbox Code Playgroud)

FKVL 中的方法是存根,因此它们应该失败。问题是,他们总是过去。

现在,如果我将测试实现更改为:

procedure TTestKeyValueList.TestSetAsInteger(IntVal: integer);
begin
  FKVL.AsInteger['testkey'] := IntVal;
  Sleep(1);  //This can be anything really, I can call FKVL.Count or other some such
  Assert.AreEqual(IntVal, FKVL.AsInteger['testkey']);
end;
Run Code Online (Sandbox Code Playgroud)

现在测试按预期进行。诡异的。我在这里做错了什么吗?

delphi testing dunitx

0
推荐指数
1
解决办法
113
查看次数