Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
| 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.