并行运行测试时,如何将日志写入不同的文件?

时间:2018-11-20 15:24:06

标签: c# logging parallel-processing automation

在我的测试报告中,我使用Allure框架,它允许我将文件附加到测试中。我也使用SpecFlow,因此我想将日志文件附加到每个测试步骤。魅力让我做到了。

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

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

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

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();
    }
}

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

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

我该如何处理?也许我根本没有使用好的解决方案?如果是这样,请提出一种充分的方法来做我想做的事。

1 个答案:

答案 0 :(得分: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并让另一个线程监视它并写入实际文件。