如何获取当前在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.
更好地使用:
结果:=TJPANUllLogger(myLogger(.testInfo.Name;
因为这给出了测试的名称,而不仅仅是方法名称。