MSTEST0075: Evitar cambiar el directorio actual en una prueba en paralelo

Propiedad Value
Identificador de la regla MSTEST0075
Title Evite cambiar el directorio actual en una prueba paralelizada
Category Usage
La corrección es disruptiva o no disruptiva Non-breaking
Habilitado de forma predeterminada Yes
Gravedad predeterminada Información
introducido en la versión 4.4.0 (versión preliminar)
¿Hay una corrección de código? Sí, solo para C#

Importante

ResourceLockAttribute está planeado para MSTest 4.4 y solo está disponible en compilaciones en versión preliminar hasta que se publique MSTest 4.4.0.

Note

Este analizador solo se activa cuando la paralelización de ensamblados está habilitada sintácticamente, por ejemplo, sin [assembly: Parallelize] una coincidencia [assembly: DoNotParallelize]o cuando un .editorconfig archivo establece mstest_parallel_safety_mode = always. El analizador no puede detectar la paralelización habilitada solo a través .runsettings de propiedades de MSBuild o como MSTestParallelizeWorkers. Establezca la opción si configura la .editorconfig paralelización de esa manera y desea que este analizador se ejecute.

Causa

Una prueba, o un método de accesorio con ámbito de clase en el que se ejecuta, llama Directory.SetCurrentDirectory a o asigna Environment.CurrentDirectory sin una coincidencia [ResourceLock] o [DoNotParallelize].

Descripción de la regla

El directorio actual es process-global en todos los sistemas operativos y, a diferencia de la referencia cultural, no tiene ningún equivalente de ámbito de subproceso o asincrónico. Una prueba que lo cambia daña el directorio de trabajo de cada prueba que se ejecuta simultáneamente y las rutas de acceso relativas resueltas en otro lugar del conjunto apuntan silenciosamente en la ubicación incorrecta.

[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath); // Violation
}

Cómo corregir infracciones

Declare [ResourceLock(WellKnownResources.CurrentDirectory)] para serializar las pruebas contendientes o agregue [DoNotParallelize] para excluir la prueba de paralelización. Incluso con un bloqueo, prefiere pasar rutas de acceso absolutas para que el directorio actual nunca necesite cambiar.

[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
    Directory.SetCurrentDirectory(tempPath);
}

Una corrección de código de C# agrega el [ResourceLock] atributo automáticamente, en el método de prueba o, para un accesorio con ámbito de clase como [TestInitialize], en la clase de prueba. Visual Basic código tiene este diagnóstico, pero no tiene una corrección automática; agregue el atributo a mano.

Cuándo suprimir las advertencias

No suprima advertencias de esta regla sin declarar un bloqueo o no participar en la paralelización, ya que, al hacerlo, la mutación se ejecuta de forma silenciosa frente a pruebas de ejecución simultánea.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad a none en el archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0075.severity = none

Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.

Véase también