xUnit并在测试

时间:2017-05-10 10:18:56

标签: c# unit-testing xunit

我刚刚更新到xUnit 2.1。 我通过大量测试运行这种方法,这些测试与不同的程序集并行运行,以使用特定名称登录到同一文件。 问题是我无法管理并发(即使使用TextWriter.Synchronized),每次运行我的测试时,不同的测试说:

错误是:

Message: System.IO.IOException : The process cannot access the file 'C:\LOGS\myFileName-20170510.txt' because it is being used by another process.

我的方法是:

private static void WriteToLogFile(string fileName, string strMessage)
        {
            DateTime utcNow = DateTime.UtcNow;
            lock (fileName)
            {
                using (StreamWriter w = File.AppendText(fileName + utcNow.Year + utcNow.Month.ToString("00") + utcNow.Day.ToString("00") + ".txt"))
                {
                    w.WriteLine("{0};{1};{2}", DateTime.UtcNow, SecurityHelper.GetPrincipalName(), strMessage);
                    w.Flush();
                    w.Close();
                }
            }
        }

我甚至尝试过(但这没有帮助):

private static void WriteToLogFile(string fileName, string strMessage)
{
    DateTime utcNow = DateTime.UtcNow;
    lock (fileName)
    {
        using (StreamWriter w = File.AppendText(fileName + utcNow.Year + utcNow.Month.ToString("00") + utcNow.Day.ToString("00") + ".txt"))
        {
            w.WriteLine("{0};{1};{2}", DateTime.UtcNow, SecurityHelper.GetPrincipalName(), strMessage);
            w.Flush();
            w.Close();
        }
    }
}

private static readonly ConcurrentDictionary<string, object> Tokens = new ConcurrentDictionary<string, object>();

private static object GetToken(string fileName)
{
    if (!Tokens.ContainsKey(fileName))
        Tokens.TryAdd(fileName, new object());
    return Tokens[fileName];
}

这是由于xUnit的一些奇怪行为? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

以下行是一个问题:

data

不要将字符串和参数用作锁定对象。在您的情况下尝试私有静态对象。请参阅MSDNthis question on stackoverflow。这看起来像这样:

lock (fileName)

这解决了多个线程想要一次写入的潜在问题,但这不是真正的问题。看看这个stackoverflow question。我并不完全知道xunit测试运行器是如何工作的,但是如果有多个进程一次写入,那么你将获得该异常。而不是使用private readonly object Locker = new object(); private static void WriteToLogFile(string fileName, string strMessage) { DateTime utcNow = DateTime.UtcNow; lock (Locker) { ... 使用它(如stackoverflow问题的答案所示):

File.AppendText

操作系统将允许多个进程访问同一文件。

您可能仍然遇到以下问题:内容可能很混乱,因为例如两个进程可能想要在同一行写入然后连续转储两个换行符。作为一种变通方法,您可以将进程ID附加到日志文件中。

如果这太奇怪了,可以考虑使用一个记录库来管理这类问题。