【问题标题】:How can I get test case name and use it as file name NLog如何获取测试用例名称并将其用作文件名 NLog
【发布时间】:2019-12-19 03:35:07
【问题描述】:

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

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

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

        private static readonly Logger Logger = GetCurrentClassLogger();

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

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

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

祝你有美好的一天!

【问题讨论】:

  • 你如何运行你的测试用例?使用哪个测试框架?
  • 对不起,我没提。我正在使用 Nunit 和 Nunit 测试适配器
  • 你能分享一下测试类的代码吗? 我在几个班级都有记录器,但它不能按我的意愿工作这里有什么不工作?请提供stackoverflow.com/help/minimal-reproducible-example

标签: c# file nunit nlog


【解决方案1】:

在自定义 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

【讨论】:

  • 您好@Rolf Kristensen,非常感谢您的回复。如果您只能告诉我什么是编译成程序集的最佳方法,因为我是 C# 新手。无论如何,我再一次感谢您的帮助。 :)
  • @npazderov 您只需将源代码放在解决方案中的 C# 项目中,C# 项目就会编译成程序集。找一些关于用 C# 设计/构建解决方案的书籍也许是个好主意。
  • 新年快乐。我刚刚使用了错误的程序集名称,我已经更改了它,一切都很完美,我认为这是实现目标的更好方法。再次感谢您@Rolf Kristensen
【解决方案2】:

使用 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

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多