MSTEST0076: Evitar la mutación de la referencia cultural de todo el proceso en una prueba en paralelo

Propiedad Value
Identificador de la regla MSTEST0076
Title Evitar la mutación de la referencia cultural de todo el proceso en una prueba en paralelo
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? No

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, asigna DefaultThreadCurrentCulture o sin una coincidencia [ResourceLock] o DefaultThreadCurrentUICulture[DoNotParallelize].

Descripción de la regla

CultureInfo.DefaultThreadCurrentCulture y DefaultThreadCurrentUICulture establecen la referencia cultural predeterminada para todo el proceso, por lo que todas las pruebas que se ejecutan simultáneamente observan el cambio y el formato o el análisis se pueden dañar. Los formularios por subproceso y ambiente, Thread.CurrentThread.CurrentCulture/CurrentUICulture yCurrentUICultureCultureInfo.CurrentCulture/ , no se marcan: en los .NET modernos asignan un AsyncLocalvalor respaldado que fluye con el contexto de ejecución, por lo que no dañan las pruebas del mismo nivel.

[TestMethod]
public void SetsCulture()
{
    CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Violation
}

Dado que los establecedores marcados están en todo el proceso, restaurar el valor anterior en un finally bloque no ayuda: las pruebas que se ejecutan simultáneamente siguen observando la referencia cultural modificada durante la mutación.

Cómo corregir infracciones

Agregue [DoNotParallelize] la prueba o evite la mutación de la referencia cultural de todo el proceso y use las propiedades de referencia cultural por subproceso o ambiente en su lugar.

[DoNotParallelize]
[TestMethod]
public void SetsCulture()
{
    CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
}

No existe ninguna clave conocida [ResourceLock] para la referencia cultural, por lo que un declarado [ResourceLock] de cualquier tipo se trata como una confirmación de que ha coordinado el acceso a la referencia cultural y esta regla permanece silenciosa.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla sin optar por no participar en la paralelización ni cambiar a las propiedades culturales por subproceso, 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 MSTEST0076
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0076

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

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

Véase también