Question

Quel est le meilleur moyen de tester par unité les grands ensembles de données? Certains codes que je maintiens ont des structures de cent membres ou plus; les autres parties du code sur lesquelles nous travaillons créent ou analysent des ensembles de données de centaines d’échantillons.

La meilleure approche que j’ai trouvée jusqu’à présent consiste à sérialiser les structures ou les ensembles de données à partir du disque, à effectuer les opérations testées, à sérialiser les résultats sur disque, puis à différencier les fichiers contenant les résultats sérialisés des fichiers contenant les résultats attendus. Ce n'est pas terriblement rapide et cela enfreint le code "ne touchez pas le disque". principe des tests unitaires. Cependant, la seule alternative à laquelle je puisse penser (écrire du code pour initialiser et tester des centaines de membres et de points de données) semble insupportablement fastidieux.

Existe-t-il de meilleures solutions?

Pas de solution correcte

Autres conseils

Si vous essayez en réalité de réaliser un test unitaire, vous devez simuler les structures de données sous-jacentes et simuler les données. Cette technique vous donne un contrôle complet sur les entrées. Par exemple, chaque test que vous écrivez peut gérer un seul point de données et vous disposerez d'un ensemble de tests très concis pour chaque condition. Rhino Mocks ( http: // ayende.com/projects/rhino-mocks/downloads.aspx ) ou NMock ( http: //www.nmock .org ).

S'il n'est pas possible pour vous de simuler les structures de données, je vous recommande de le refactoriser afin que vous puissiez :-) Cela en vaut la peine! Vous pouvez également essayer TypeMock ( http://www.typemock.com/ ) qui permet de se moquer des classes concrètes.

Toutefois, si vous effectuez des tests sur de grands ensembles de données, vous exécutez des tests fonctionnels et non des tests unitaires. Dans ce cas, le chargement de données dans une base de données ou à partir d'un disque est une opération typique. Plutôt que de l’éviter, vous devriez travailler à le faire fonctionner en parallèle avec le reste de votre processus de construction automatisé afin que l’impact sur les performances n’empêche aucun de vos développeurs.

C’est toujours une approche viable. Bien que, je classerais cela comme un test fonctionnel, ou tout simplement pas un test unitaire pur. Un bon test unitaire serait de prendre un échantillon de ces enregistrements qui donne une bonne répartition des cas extrêmes que vous pourriez rencontrer et de les rédiger. Ensuite, vous avez votre dernière "acceptation". ou "fonctionnel" Testez avec votre test en masse sur toutes les données.

J'ai utilisé cette approche lors du test de grandes quantités de données, et je trouve que cela fonctionne assez bien car les petites unités sont gérables, puis je sais que le test en bloc fonctionne, et tout est automatique.

  

La meilleure approche que j’ai trouvée jusqu’à présent consiste à sérialiser les structures ou les ensembles de données à partir du disque, à effectuer les opérations testées, à sérialiser les résultats sur disque, puis à différencier les fichiers contenant les résultats sérialisés des fichiers contenant les résultats attendus.

J'ai écrit du code qui utilise la technique ci-dessus, sauf que, plutôt que de sérialiser à partir d'un disque dans le test, j'ai converti des données sérialisées en un tableau d'octets que le compilateur peut placer pour vous dans l'exécutable.

Par exemple, vos données sérialisées peuvent être converties en:

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... };

test()
{
    MyStruct* s = (MyStruct*) mySerialisedData;

}

Pour un exemple plus détaillé (en C #), consultez ceci test unitaire . Il montre un exemple d'utilisation de données sérialisées codées en dur comme entrée pour des tests, ainsi que pour la signature d'assemblages de test.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top