【问题标题】:When running tests in parallel how to write log to different files?并行运行测试时如何将日志写入不同的文件?
【发布时间】:2018-11-20 23:35:44
【问题描述】:

在我的测试报告之前,我使用 Allure 框架,它允许我将文件附加到测试中。我也使用 SpecFlow,所以我想在每个测试步骤中附加一个日志文件。 Allure 允许我这样做。

然而,当我的测试并行运行时,我无法弄清楚如何以正确的方式进行。

所以我需要将每个测试的日志写入一个我可以独立于其他日志文件处理的文件来自并行运行的测试

在我并行运行测试之前,我只是有一个这样的类:

public static class Log
{
    private static readonly string LogFileName = "testlog.json";

    public static bool IsFileExist => File.Exists(LogFileName);

    public static void WriteLine(string value)
    {
        File.AppendAllText(LogFileName, value);
    }

    public static string GetLogPath()
    {
        return LogFileName;
    }
}

然后我有一个 SpecFlow 钩子:

[AfterStep()]
public void AfterStep()
{
    if (Log.IsFileExist)
    {
        string logFilePath = Log.GetLogPath();

        AllureLifecycle.Instance.AddAttachment("displayedFileName", "application/json", logFilePath);

        //Clean log file 
        DeleteTestLogFile();
    }
}

因此,一旦将日志文件附加到我的报告中,我就将其删除,并在下一步中再次创建。

现在,当然,当我并行运行测试时,无法从多个线程访问该文件。

我该如何处理?也许我根本没有使用好的解决方案?如果是这样,请建议一个足够的方法来做我想做的事。

【问题讨论】:

  • 使用 Log4Net。不要重新发明轮子
  • @MickyD 谢谢,我会试试的。但也许你可以提供一个例子作为答案?

标签: c# logging parallel-processing automation


【解决方案1】:

最简单的解决方案是对写入文件的代码使用锁定。

public static class Log
{
    private static readonly string LogFileName = "testlog.json";
    private static Object myLock = new Object();

    public static bool IsFileExist => File.Exists(LogFileName);

    public static void WriteLine(string value)
    {
        lock (myLock )
        {
            File.AppendAllText(LogFileName, value);
        }

    }

    public static string GetLogPath()
    {
        return LogFileName;
    }
}

如果这最终成为性能问题,您可以尝试将日志添加到 ConcurrentQueue 并让另一个线程监控它并写入实际文件。

【讨论】:

  • 如果测试运行器使用多个 AppDomains 可能无法正常工作
  • @bcwhims 谢谢,它有助于文件锁定,但如果将来自不同测试的日志混合到一个文件中则无济于事。
  • @DenisKoreyba 你介意分享你的解决方案吗?我现在也面临同样的挑战。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2015-08-27
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多