Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | Value |
|---|---|
| ID regola | MSTEST0075 |
| Titolo | Evitare di modificare la directory corrente in un test parallelizzato |
| Categoria | Utilizzo |
| La modifica è dirompente o non dirompente | Non rompente |
| Abilitato per impostazione predefinita | Sì |
| Gravità predefinita | Informazioni |
| introdotta nella versione | 4.4.0 (anteprima) |
| È presente una correzione del codice | Sì, solo per C# |
Importante
ResourceLockAttribute è pianificato per MSTest 4.4 ed è disponibile solo nelle build di anteprima fino al rilascio di MSTest 4.4.0.
Note
Questo analizzatore viene attivato solo quando la parallelizzazione dell'assembly è abilitata sintatticamente, ad esempio senza [assembly: Parallelize] una corrispondenza [assembly: DoNotParallelize]o quando un .editorconfig file imposta mstest_parallel_safety_mode = always. L'analizzatore non riesce a rilevare la parallelizzazione abilitata solo tramite .runsettings o le proprietà di MSBuild, MSTestParallelizeWorkersad esempio . Impostare l'opzione .editorconfig se si configura la parallelizzazione in questo modo e si vuole comunque che l'analizzatore venga eseguito.
Cause
Un test o un metodo di fixture con ambito classe in cui viene eseguito, chiama Directory.SetCurrentDirectory o assegna Environment.CurrentDirectory senza corrispondenza [ResourceLock] o [DoNotParallelize].
Descrizione della regola
La directory corrente è globale di processo in ogni sistema operativo e, a differenza delle impostazioni cultura, non ha un equivalente con ambito thread o async.the current directory is process-global on every operating system and, differentemente dalle impostazioni cultura, has no thread-scoped or async-scoped equivalent. Un test che modifica la directory di lavoro di ogni test in esecuzione simultaneamente e i percorsi relativi risolti altrove nella suite puntano automaticamente alla posizione errata.
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath); // Violation
}
Come correggere le violazioni
Dichiarare [ResourceLock(WellKnownResources.CurrentDirectory)] di serializzare i test contendenti o aggiungere [DoNotParallelize] per rifiutare esplicitamente il test fuori dalla parallelizzazione. Anche con un blocco, preferire il passaggio di percorsi assoluti in modo che la directory corrente non debba mai cambiare.
[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath);
}
Una correzione del codice C# aggiunge automaticamente l'attributo [ResourceLock] al metodo di test o per una fixture con ambito classe, ad [TestInitialize]esempio , nella classe di test. Visual Basic codice include questa diagnostica, ma non ha una correzione automatica. Aggiungere l'attributo a mano.
Quando eliminare gli avvisi
Non eliminare gli avvisi da questa regola senza dichiarare un blocco o rifiutare esplicitamente la parallelizzazione, perché in questo modo la mutazione corre automaticamente contro i test contemporaneamente in esecuzione.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable MSTEST0075
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0075
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0075.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.