如何获取当前在 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.