【发布时间】:2020-11-13 13:59:18
【问题描述】:
如何获取当前在 DunitX 中运行的测试的名称?
例如:
procedure TestModule.TestProcedure;
begin
Assert.Pass('This tests name is ' + TestName);
end
【问题讨论】:
-
我认为this answer 必须适合你。
如何获取当前在 DunitX 中运行的测试的名称?
例如:
procedure TestModule.TestProcedure;
begin
Assert.Pass('This tests name is ' + TestName);
end
【问题讨论】:
您需要创建ITestLogger 的实例并将其添加到当前运行器:
TDUnitX.CurrentRunner().AddLogger(myLogger);
ITestLogger 有很多方法可以读取很多详细信息。 DUnitX 带有各种记录器,但这里没有适合我们用例的任何东西。
我建议
TDUnitXNullLogger 派生自DUnitX.Loggers.Null
procedure OnBeginTest(const threadId: TThreadID; const Test: ITestInfo);
Test.MethodName 以备后用可以在测试用例的SetUpFixture 方法中创建新类的实例。
警告:您可以将您的记录器添加到 TDUnitX.CurrentRunner(),但我没有发现在不再需要时删除它的公开方式。
这是完整的例子:
unit Unit1;
interface uses DUnitX.TestFramework;
type
[TestFixture]
TMyTest = class
private var
myLogger: ITestLogger;
protected
function getCurrentTestName(): String;
public
[SetupFixture] procedure SetupFixture();
[Test] procedure TestName();
end;
implementation uses DUnitX.Loggers.Null;
type
TMyLogger = class(TDUnitXNullLogger)
protected procedure OnBeginTest(
const threadId: TThreadID;
const Test: ITestInfo
); override;
public var testInfo: ITestInfo;
end;
function TMyTest.getCurrentTestName(): String;
begin
Result := TMyLogger(myLogger).testInfo.MethodName;
end;
procedure TMyTest.SetupFixture();
begin
myLogger := TMyLogger.Create();
TDUnitX.CurrentRunner().AddLogger(myLogger);
end;
procedure TMyTest.TestName();
begin
const expected = 'TestName';
var actual := getCurrentTestName();
Assert.AreEqual(expected, actual);
end;
{ TMyLogger }
procedure TMyLogger.OnBeginTest(const threadId: TThreadID; const Test: ITestInfo);
begin
testInfo := Test;
end;
initialization
TDUnitX.RegisterTestFixture(TMyTest);
end.
【讨论】: