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 |
| È presente una correzione del codice | Sì, solo per C# |
Note
Questo analizzatore viene attivato solo quando la parallelizzazione dell'assembly è abilitata sintatticamente, ad esempio tramite [assembly: Parallelize] senza un [assembly: DoNotParallelize] corrispondente, oppure quando un file .editorconfig imposta mstest_parallel_safety_mode = always. L'analizzatore non riesce a rilevare la parallelizzazione che è abilitata solo mediante .runsettings o proprietà di MSBuild come MSTestParallelizeWorkers. Imposta l'opzione .editorconfig se configuri la parallelizzazione in questo modo e vuoi comunque eseguire questo analizzatore.
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 a livello di processo in ogni sistema operativo e, a differenza della cultura, non ha un equivalente con ambito di thread o asincrono. Un test che la modifica compromette la directory di lavoro di tutti i test eseguiti contemporaneamente, e i percorsi relativi risolti altrove nella suite puntano senza segnalarlo alla posizione sbagliata.
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath); // Violation
}
Come correggere le violazioni
Dichiarare [ResourceLock(WellKnownResources.CurrentDirectory)] per serializzare i test in conflitto oppure aggiungere [DoNotParallelize] per escludere il test dalla parallelizzazione. Anche con un lock, è preferibile passare percorsi assoluti in modo che non sia mai necessario cambiare la directory corrente.
[ResourceLock(WellKnownResources.CurrentDirectory)]
[TestMethod]
public void ChangesDirectory()
{
Directory.SetCurrentDirectory(tempPath);
}
Una correzione del codice C# aggiunge l'attributo [ResourceLock] al metodo di test oppure, per una fixture con ambito di classe come [TestInitialize], alla classe di test. Il codice Visual Basic presenta questa diagnostica, ma non dispone di una correzione automatica; aggiungere manualmente l'attributo.
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.