Je travaille sur un projet avec quelques formats de fichiers. Certains formats sont spécifiés par .xsds, d'autres par la documentation sur leurs sites Web respectifs, et certains sont des formats internes personnalisés qui n'ont pas de documentation. Mwahahahaha.
Quel est le problème?
Je voudrais tester mes lecteurs de fichiers, mais je ne suis pas tout à fait sûr comment y aller. Le flux de l'application est en tant que tel:
file.___ ===> read by FileReader.Java ===> which creates a Model object
où l'interface FileReader
est
public interface FileReader {
public Model read(String filename);
}
Le Model
a un certain nombre d'attributs peuplés lorsque le fichier est lu. Ça ressemble quelque chose comme
public class Model {
List<String> as;
List<String> bs;
boolean isAPain = true;
// ...
}
qu'avez-je essayé?
Ma seule idée était de créer des "générateurs" de fichier pour chaque format de fichier. Ces générateurs sont fondamentalement des constructeurs qui prennent quelques variables (par exemple, nombre de commentaires à générer dans un fichier) et génèrent un exemple de fichier que je lis puis lisez et comparez le Model
avec les variables que j'ai utilisées pour générer initialement le fichier.
Cela a quelques problèmes, cependant:
Y a-t-il de meilleurs moyens de faire cela?
Modifier: Unité modifiée à l'intégration depuis que c'est ce que je veux dire.
EDIT2: Voici un exemple des cas de bord que j'ai mentionnés.
Chaque fichier représente un graphique composé de sommets et de bords. Ces sommets et bords peuvent être attachés de différentes manières, donc:
v1 -- e1 --> v2 <-- e2 -- v3
est différent de
v1 -- e1 --> v2 -- e2 --> v3
en ce que la direction des bords compte. Je ne sais pas si cela fait partie de la question, mais il est difficile de penser à tous les cas de bord pertinents lorsque je définirai manuellement le nombre de sommets, le nombre de bords et générer des connexions au hasard.
Tout d'abord, parle de ce que sont vos objectifs:
vous ne voulez évidemment pas tester les "formats de fichiers" - vous souhaitez tester vos différentes implémentations FileReader
vous voulez trouver autant de types d'erreurs que possible par les tests automatiques
Pour atteindre cet objectif intégralement, je dois combiner différentes stratégies:
FileReader
seront composées de nombreuses pièces et fonctions différentes. Écrire de petits tests qui testent chacun d'eux isolément; Concevez vos fonctions d'une manière dont ils n'ont pas vraiment besoin de lire les données d'un fichier. Ce type de test vous aidera à tester la plupart de vos cas de bord.FileReader
s, mais cela vaut la peine de le faire car il trouve souvent des bugs non révélés par le premier. Deux stratégies. Certaines personnes appelleraient ces éléments types aussi "tests d'intégration", d'autres préfèrent "tests d'acceptation", mais en fait, le terme n'a pas d'importance.IMHO Il n'existe pas d'approche "à court terme" qui vous apporterait l'avantage des trois stratégies "pour le prix d'un". Si vous souhaitez détecter des cas d'avance ainsi que des échecs dans des cas standard ainsi que des cas réels, vous devez investir au moins certains - plus probablement beaucoup - effort. Heureusement, toutes ces approches peuvent être utilisées pour créer des tests automatiques et reproductibles.
Au-delà de cela, vous devez vous assurer que votre FileReader
s ne masque aucune erreur lorsque vous lisez ces données - créez des chèques/affirmations intégrées, lancez des exceptions lorsque quelque chose ne va pas en interne, etc. Cela donne beaucoup à votre code de test Une meilleure chance de détecter des erreurs, même lorsque vous n'avez pas de fichier de test explicite ou de test de test pour une situation inattendue.