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 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.