При параллельном запуске тестов как записывать логи в разные файлы - PullRequest
0 голосов
/ 20 ноября 2018

Для своего отчета о тестах я использую фреймворк 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();
    }
}

Поэтому, как только файл журнала был прикреплен к моему отчету, я удалил его, и он снова был создан на следующем шаге.

Теперь, конечно, когда я запускаю тесты параллельно, к файлу нельзя получить доступ из нескольких потоков.

Как я могу справиться с этим?Может быть, я использую не очень хорошее решение вообще?Если да, то посоветуйте, пожалуйста, достаточный способ сделать то, что я хочу.

1 Ответ

0 голосов
/ 20 ноября 2018

Самое простое решение - просто использовать блокировку кода, который записывает в файл.

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 иналичие другого потока, отслеживающего его и записывающего в текущий файл.

...