我正在尝试在运行测试后检查对象的状态.该状态包含在一组中.是否可以使用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)
非常感谢帮助.:)
如果我有一个带有字符串参数的单元测试,并且我想检查输入字符串在某处是否有逗号( ,),我应该创建一个带有逗号的输入字符串。
但是如何将它传递给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) 我正在为我的 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) 在我看来,如果我只是将其放入测试方法中,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)
它不会打印到测试控制台...我们使用此功能的任何场景?
我有一个基于控制台的 DUNITX 单元测试程序,我正在尝试将其转换为 FMX GUI 输出。在这里阅读了 embarcadero 文档后,我通过执行以下操作修改了测试程序文件:
修改后的列表如下所示:
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下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)
所有这些代码都用于检查是否调用了一个过程.那太冗长了!
有没有办法写一个可以帮助我减少代码的间谍?
我的问题与此类似,但我想传递一个整数数组,而不是一个集合。
例如:
[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中的某些东西吗?
如果我选择"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)
我有一个这样定义的测试:
[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)
现在测试按预期进行。诡异的。我在这里做错了什么吗?