2010-04-01 4 views
1

Je travaille sur l'implémentation d'une application de sérialiseur/désérialiseur XML raisonnablement simple en C# .NET avec VS 2008. J'ai actuellement environ 50 tests unitaires pour différentes parties du code (principalement pour les diverses opérations de sérialisation), et certains d'entre eux semblent échouer la plupart du temps lorsqu'ils traitent des E/S de fichiers.VS2008: La création de fichier échoue de manière aléatoire dans les tests unitaires?

La façon dont les tests sont structurés est que dans la méthode d'installation de test, je crée un nouveau fichier vide à un certain emplacement prédéterminé, et ferme le flux que je récupère. Ensuite, je lance quelques tests de base sur le fichier (en fonction de ce qui est exactement sous test). Dans la méthode de nettoyage, je supprime à nouveau le fichier.

Une grande partie (généralement 30 ou plus, bien que le nombre varie d'une exécution à l'autre) de mes tests unitaires échouera à la méthode initialize, affirmant qu'ils ne peuvent pas accéder au fichier que j'essaye de créer. Je ne peux pas déterminer la raison exacte, car un test qui fonctionnera une fois échoue le suivant; ils réussissent tous lorsqu'ils sont lancés individuellement.

Quel est le problème ici? Pourquoi ne puis-je pas accéder à ce fichier lors de plusieurs tests unitaires?

méthodes pertinentes pour un test unitaire qui échoueront une partie du temps:

[TestInitialize()] 
public void LogFileTestInitialize() 
{ 
    this.testFolder = 
     System.Environment.GetFolderPath(
      System.Environment.SpecialFolder.LocalApplicationData 
     ); 
    this.testPath = this.testFolder + "\\empty.lfp"; 
    System.IO.File.Create(this.testPath).Close(); 
} 

[TestMethod()] 
public void LogFileConstructorTest() 
{ 
    string filePath = this.testPath; 
    LogFile target = new LogFile(filePath); 
    Assert.AreNotEqual(null, target); 
    Assert.AreEqual(this.testPath, target.filePath); 
    Assert.AreEqual("empty.lfp", target.fileName); 
    Assert.AreEqual(this.testFolder + "\\empty.lfp.lfpdat", target.metaPath); 
} 

[TestCleanup()] 
public void LogFileTestCleanup() 
{ 
    System.IO.File.Delete(this.testPath); 
}

Et le constructeur LogFile():

public LogFile(String filePath) 
{ 
    this.entries = new List<Entry>(); 
    this.filePath = filePath; 
    this.metaPath = filePath + ".lfpdat"; 
    this.fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1); 
}

Le message d'erreur précise:

Méthode d'initialisation LogFileParserTester.LogFileTest.LogFileTestInitialize a levé l'exception. System.IO.IOException: System.IO.IOException: Le processus ne peut pas accéder au fichier 'C: \ Users \ <utilisateur> \ AppData \ Local \ empty.lfp' parce qu'il est utilisé par un autre processus

Répondre

2

Vous devez vous moquer de l'accès au système de fichiers et ne pas lire/écrire des fichiers dans vos tests unitaires.

0

Il semble que certains tests soient exécutés en même temps. Est-ce que les tests individuels écrivent dans le fichier ou simplement le lisent? Si elles sont en lecture seule, je suis sûr que nous pouvons faire un changement mineur pour leur permettre de fonctionner simultanément. Plus de détails?

+0

Vous me dites - est-ce que VS2008 exécute des tests simultanément? J'ai pensé à cela, mais Google semblait indiquer que seul VS2010 prend en charge plusieurs tests simultanés. – Tim