1

如何获取当前在 DunitX 中运行的测试的名称?

例如:

procedure TestModule.TestProcedure;
begin
  Assert.Pass('This tests name is ' + TestName);
end
4

1 回答 1

2

您将需要创建一个实例ITestLogger并将其添加到当前运行器:

TDUnitX.CurrentRunner().AddLogger(myLogger);

ITestLogger很多方法可以读取很多详细信息。DUnitX 带有各种记录器,但这里没有适合我们用例的东西。

我建议

  1. 创建一个新类,派生TDUnitXNullLoggerDUnitX.Loggers.Null
  2. 重写虚方法procedure OnBeginTest(const threadId: TThreadID; const Test: ITestInfo);
  3. 保存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.
于 2021-05-17T09:53:47.453 回答