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 | MSTEST0075 |
| Title | Evite cambiar el directorio actual en una prueba paralelizada |
| 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 Directory.SetCurrentDirectory a o asigna Environment.CurrentDirectory sin una coincidencia [ResourceLock] o [DoNotParallelize].
Descripción de la regla
El directorio actual es process-global en todos los sistemas operativos y, a diferencia de la referencia cultural, no tiene ningún equivalente de ámbito de subproceso o asincrónico. Una prueba que lo cambia daña el directorio de trabajo de cada prueba que se ejecuta simultáneamente y las rutas de acceso relativas resueltas en otro lugar del conjunto apuntan silenciosamente en la ubicación incorrecta.
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath); // Violation
}
Cómo corregir infracciones
Declare [ResourceLock(WellKnownResources.CurrentDirectory)] para serializar las pruebas contendientes o agregue [DoNotParallelize] para excluir la prueba de paralelización. Incluso con un bloqueo, prefiere pasar rutas de acceso absolutas para que el directorio actual nunca necesite cambiar.
[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath);
}
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 MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075
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.MSTEST0075.severity = none
Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.