MSTEST0076: Evitar modificar la configuración regional de todo el proceso en una prueba paralelizada

Propiedad Value
Identificador de la regla MSTEST0076
Title Evitar modificar la configuración regional de todo el proceso en una prueba ejecutada en paralelo
Category Usage
La corrección es problemática o no problemática Non-breaking
Habilitado de forma predeterminada Yes
Gravedad predeterminada Información
introducido en la versión 4.4.0
¿Hay una corrección de código? No

Note

Este analizador solo se activa cuando la paralelización del ensamblado está habilitada sintácticamente, por ejemplo mediante [assembly: Parallelize] sin un [assembly: DoNotParallelize] correspondiente, o cuando un archivo .editorconfig establece mstest_parallel_safety_mode = always. El analizador no puede detectar la paralelización habilitada solo a través de .runsettings o de propiedades de MSBuild como MSTestParallelizeWorkers. Configure la opción .editorconfig si configura la paralelización de ese modo y aun así desea que este analizador se ejecute.

Causa

Una prueba, o un método de fixture con ámbito de clase bajo el que se ejecuta, asigna DefaultThreadCurrentCulture o DefaultThreadCurrentUICulture sin el correspondiente [ResourceLock] o [DoNotParallelize].

Descripción de la regla

CultureInfo.DefaultThreadCurrentCulture y DefaultThreadCurrentUICulture establecen la configuración regional predeterminada para todo el proceso, por lo que todas las pruebas que se ejecutan simultáneamente se ven afectadas por el cambio, y el formateo o el análisis pueden verse alterados. Las formas por subproceso y de ambiente, Thread.CurrentThread.CurrentCulture/CurrentUICulture y CultureInfo.CurrentCulture/CurrentUICulture, no se marcan: en las versiones modernas de .NET asignan un valor respaldado por AsyncLocal que fluye con el contexto de ejecución, por lo que no interfieren con las pruebas hermanas.

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

Dado que los setters marcados afectan a todo el proceso, restaurar el valor anterior en un bloque finally no ayuda: las pruebas que se ejecutan simultáneamente siguen observando la configuración regional modificada mientras dura el cambio.

Cómo corregir infracciones

Agregue [DoNotParallelize] a la prueba, o evite modificar la configuración regional de todo el proceso y use en su lugar las propiedades de configuración regional por subproceso o de entorno.

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

No existe ninguna clave [ResourceLock] conocida para la cultura, por lo que cualquier [ResourceLock] declarado se trata como un reconocimiento de que has coordinado el acceso a la cultura, y esta regla no genera ningún aviso.

Cuándo suprimir las advertencias

No suprimas las advertencias de esta regla sin desactivar la paralelización o cambiar a las propiedades de cultura por hilo, ya que hacerlo deja que la mutación compita de forma silenciosa con las pruebas que se ejecutan simultáneamente.

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