MSTEST0074: probar la mutación del estado global del proceso debe declarar un bloqueo de recursos

Propiedad Value
Identificador de la regla MSTEST0074
Title La prueba de la mutación del estado global del proceso debe declarar un bloqueo de recursos
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 a Environment.SetEnvironmentVariable o sin una coincidencia [ResourceLock] o/Console.SetOut[DoNotParallelize]/SetErrorSetIn .

Descripción de la regla

La mutación del estado global del proceso, como las variables de entorno o la redirección de consola, desde una prueba no es segura una vez habilitada la paralelización en ensamblado, ya que una prueba del mismo nivel que se ejecuta simultáneamente observa la mutación. A diferencia [ResourceLock]de , que produce un error al abrir cuando se olvida una clave, esta regla marca la mutación en tiempo de compilación.

[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test"); // Violation
}

Cómo corregir infracciones

Declare [ResourceLock] con la clave coincidente WellKnownResources para serializar las pruebas contendientes o agregue [DoNotParallelize] para excluir la prueba de paralelización.

[ResourceLock(WellKnownResources.EnvironmentVariables)]
[TestMethod]
public void SetsVariable()
{
    Environment.SetEnvironmentVariable("MODE", "test");
}

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 MSTEST0074
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0074

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.MSTEST0074.severity = none

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

Véase también