2010-04-27 8 views
3

Un test unitaire raisonnable pourrait-il être écrit pour ce code qui extrait une archive rar en la déléguant à un outil capable sur le système hôte s'il en existe un? Je peux écrire un cas de test basé sur le fait que mon ordinateur exécute linux et que l'outil unrar est installé, mais si un autre développeur qui exécute windows vérifie le code, le test échouera, bien qu'il n'y ait aucun problème avec le code extracteur . Je dois trouver un moyen d'écrire un test significatif qui n'est pas lié au système et à l'outil unrar installé. Comment aborderiez-vous cela?Test unité sensible possible?

public class Extractor { 

private EventBus eventBus; 
private ExtractCommand[] linuxExtractCommands = new ExtractCommand[]{new LinuxUnrarCommand()}; 
private ExtractCommand[] windowsExtractCommands = new ExtractCommand[]{}; 
private ExtractCommand[] macExtractCommands = new ExtractCommand[]{}; 

@Inject 
public Extractor(EventBus eventBus) { 
    this.eventBus = eventBus; 
} 

public boolean extract(DownloadCandidate downloadCandidate) { 
    for (ExtractCommand command : getSystemSpecificExtractCommands()) { 
     if (command.extract(downloadCandidate)) { 
      eventBus.fireEvent(this, new ExtractCompletedEvent()); 
      return true; 
     } 
    } 

    eventBus.fireEvent(this, new ExtractFailedEvent()); 
    return false; 
} 

private ExtractCommand[] getSystemSpecificExtractCommands() { 
    String os = System.getProperty("os.name"); 
    if (Pattern.compile("linux", Pattern.CASE_INSENSITIVE).matcher(os).find()) { 
     return linuxExtractCommands; 
    } else if (Pattern.compile("windows", Pattern.CASE_INSENSITIVE).matcher(os).find()) { 
     return windowsExtractCommands; 
    } else if (Pattern.compile("mac os x", Pattern.CASE_INSENSITIVE).matcher(os).find()) { 
     return macExtractCommands; 
    } 

    return null; 
} 

}

Répondre

6

Pourriez-vous passer pas la classe un Map<String,ExtractCommand[]> cas et ensuite faire une méthode abstraite, par exemple GetOsName, pour obtenir la chaîne à faire correspondre. alors vous pouvez rechercher la chaîne de correspondance dans la carte pour obtenir la commande d'extraction dans la méthode getSystemSpecificExtractCommands. Cela vous permettra d'injecter une liste contenant une ExtractCommand maquette et substituez la méthode GetOsName retourner la clé de votre commande simulée, vous pouvez donc vérifier que lorsque l'extrait a travaillé, le eventBus est tiré etc.

private Map<String,EvenetCommand[]> eventMap; 

@Inject 
public Extractor(EventBus eventBus, Map<String,EventCommand[]> eventMap) { 
    this.eventBus = eventBus; 
    this.eventMap = eventMap; 
} 

private ExtractCommand[] getSystemSpecificExtractCommands() { 
    String os = GetOsName(); 
    return eventMap.Get(os); 
} 

protected GetOsName(); 
{ 
    return System.getProperty("os.name"); 
} 
+0

+ 1 injection de la carte de "OS" aux commandes allait être ma suggestion aussi bien –

1

je chercherais des API Java pur pour manipuler des fichiers rar. De cette façon, le code ne dépendra pas du système.

Une recherche rapide sur Google retourné ceci:

http://www.example-code.com/java/rar_unrar.asp

+0

ce projet semble être windows-only car il utilise un .dll – nkr1pt

1

Démarrer avec un cadre factice. Vous devrez refactoriser un peu, car vous devrez vous assurer que certaines de ces propriétés/variables privées et locales peuvent être remplacées si nécessaire.

Ensuite, lorsque vous testez Extract, vous vous assurez que vous avez mocké les commandes et que vous vous assurez que la méthode Extract est appelée sur vos objets mockés. Vous voudrez également vous assurer que votre événement a également été viré.

Maintenant, pour le rendre plus testable, vous pouvez utiliser l'injection de constructeur ou de propriété. De toute façon, vous devrez rendre les tableaux Private ExtractCommand substituables.

Désolé, nous n'avons pas le temps de le recoder et de le poster, mais cela devrait vous permettre de bien commencer.

Bonne chance.

EDIT. On dirait que vous êtes plus après un test fonctionnel de toute façon si vous voulez tester qu'il est effectivement extrait correctement.

1

Les tests peuvent être difficiles, en particulier en ce qui concerne la répartition des différents types de tests, le moment où ils doivent être exécutés et leurs responsabilités. C'est encore plus vrai avec le code multiplateforme.

Bien qu'il soit possible de considérer cela comme une base de code que vous testez, c'est vraiment plusieurs bases de code, le code java générique et le code pour chaque plate-forme cible, donc vous aurez besoin de plusieurs tests. Pour commencer avec les tests unitaires, vous n'exercerez pas la commande externe. Au contraire, chaque classe spécifique à une plate-forme est testée pour voir qu'elle génère la ligne de commande correcte, sans l'exécuter réellement.Votre classe Java qui cache toutes les spécificités de la plate-forme (quelle commande utiliser) a un test unitaire pour vérifier qu'elle instancie la classe spécifique à la plate-forme pour une plate-forme donnée. La plate-forme peut être un paramètre du test de base, de sorte que plusieurs plates-formes peuvent être "émulées". Pour approfondir le test unitaire, vous pouvez simuler l'implémentation de la commande (par exemple, avoir un fichier RAR et sa forme non compressée dans vos données de test, et la commande est une simple copie des données non compressées.)

les tests unitaires sont en place et verts, vous pouvez ensuite passer aux tests fonctionnels, où les vraies commandes spécifiques à la plate-forme sont exécutées. Bien sûr, ces tests fonctionnels doivent être exécutés sur la plate-forme actuelle. Chaque test fonctionnel correspond à une classe spécifique à la plate-forme qui sait comment créer la bonne ligne de commande pour la rendre non-conforme.

Votre build est configuré pour exclure des tests pour des classes qui ne s'appliquent pas à la plate-forme actuelle, par exemple, LinuxUnrarer n'est pas testé sous Windows. La classe Java indépendante de la plate-forme est toujours testée et instancie le test spécifique à la plate-forme approprié. Cela vous donne un test d'intégration pour voir que le système fonctionne de bout en bout. En ce qui concerne la plate-forme UNRAR, il existe un java RAR scanner, mais il ne se décompose pas.