如何获取测试用例名称并将其用作文件名 NLog

How can I get test case name and use it as file name NLog

我有以下问题。我想为每个测试用例 运行 创建新的 .txt 文件,并将测试用例名称或测试用例 ID(无关紧要)作为 文件name 但我不知道如何在 NLog.Config 文件中获取当前测试用例名称。

<target name="logfile"
            xsi:type="File" 
            layout="${longdate}|${message}" 
            fileName="${basedir}\ATF\web\utils\reports${shortdate}${callsite}.txt"  />

我正在使用 ${callsite},但我有几个 classes 的记录器,它会创建具有这些 classes 名称的文件.

        private static readonly Logger Logger = GetCurrentClassLogger();

例如 我有一个 class 记录某些 Selenium 操作已完成,另一个 class 记录驱动程序已成功打开。在测试中,我同时使用 classes 并且我不想为我使用的每个 class 创建文件,而是只创建一个具有测试名称的文件。

P.S 记录器本身工作正常。 我正在使用 NUnit 进行测试。

因此,如果有人知道如何因为我找不到我想要的东西,我将非常感激。

祝你有愉快的一天!

使用 NLog NDLC 的非常简单的解决方案:

    [Test]
    public void MyTest()
    {
        using (NLog.NestedDiagnosticsLogicalContext.Push(System.Reflection.MethodBase.GetCurrentMethod().ToString()))
        {
             // Testing within "${ndlc}"
        }
    }

然后您可以在 NLog-Layout 中执行此操作:

target name="logfile"
            xsi:type="File" 
            layout="${longdate}|${message}" 
            fileName="${basedir}\ATF\web\utils\reports${shortdate}${ndlc:topFrames=1:whenEmpty=UnknownTest}.txt"  />

另请参阅:https://github.com/NLog/NLog/wiki/Ndlc-Layout-Renderer

在自定义 NLog LayoutRenderer 中使用 NUnit TextContext:

[LayoutRenderer("nunit-testname")]
public class NUnitTestNameLayoutRenderer : LayoutRenderer
{
    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        builder.Append(NUnit.Framework.CurrentContext?.Test?.Name);
    }
}

将上面的代码编译成一个名为"Custom.NLog.NUnit"的程序集,然后你就可以像这样加载它了:

   <extensions>
      <add assembly="Custom.NLog.NUnit" />
   </extensions>
   <targets>
      <target name="logfile"
              xsi:type="File" 
              layout="${longdate}|${message}" 
              fileName="${basedir}\ATF\web\utils\reports${shortdate}${nunit-testname:whenEmpty=UnknownTest}.txt"  />
   </target>

另请参阅:https://github.com/nunit/docs/wiki/TestContext

另请参阅:https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer