Comment utiliser des combinaisons de jeux en tant que données de test

Je voudrais tester une fonction avec un tuple d'un ensemble de cas de frange et de valeurs normales. Par exemple, en testant une fonction qui renvoie true à chaque fois que trois longueurs forment un triangle valide, j'aurais des cas spécifiques, des nombres négatifs / petits / grands, des valeurs proches de débordées, etc .; De plus, le but principal est de générer des combinaisons de ces valeurs, avec ou sans répétition, afin d'obtenir un ensemble de données de test.

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...

Note: Je connais la réponse à cette question, mais cela pourrait être utile pour les autres, et un défi pour les gens ici! - posterai ma réponse plus tard.

0
ajouté édité
Vues: 2
Ce n'est pas une question WordPress. Au moins, pas la façon dont vous l'avez demandé.
ajouté l'auteur Anonymous User, source
Ce n'est pas une question WordPress. Au moins, pas la façon dont vous l'avez demandé.
ajouté l'auteur Anonymous User, source
Mike a raison, plus d'informations sont nécessaires sinon des réponses stupides comme "parce que tu as un nouvel email!" venir à l'esprit et je ne pense pas que ce soit utile.
ajouté l'auteur steve_mtl, source
Abacus github une bibliothèque combinatoire pour Node.JS, Python, PHP, Actionscript (ps je suis l'auteur )
ajouté l'auteur Nikos M., source
Salut @Lea: S'il vous plaît nous donner plus de détails afin que 1.) nous pouvons avoir une chance raisonnable de vous aider et 2.) afin que d'autres qui ont la configuration et le même problème à l'avenir pourraient être aidés par cette question étant répondue. Par exemple, je suppose que vous utilisez un plugin? Est-ce le cas, qu'est-ce que c'est? Quel paramètre avez-vous utilisé? Où hébergez-vous? Et tout ce qui pourrait être pertinent. Merci d'avance.
ajouté l'auteur MikeSchinkel, source

11 Réponses

Si vous utilisez le plugin WP-DB Manager , rendez-vous dans ses options et créez une sauvegarde manuellement. Si cela échoue, inspectez le message d'erreur et essayez de comprendre ce qui pourrait mal se passer. Si vous ne pouvez pas le comprendre, postez le message d'erreur ici.

Si la sauvegarde manuelle se passe bien, il y a probablement une erreur dans la configuration de l'e-mail. Vérifiez tous les paramètres de messagerie et assurez-vous qu'ils sont corrects. Quel fournisseur de messagerie utilisez-vous pour envoyer les e-mails (quel serveur SMTP)? Quel fournisseur de messagerie utilisez-vous pour recevoir les e-mails (quel serveur POP3 et IMAP)?

Si vous n'utilisez pas WP-DB Manager, nous devons savoir comment vous effectuez ces sauvegardes et toutes les informations que vous m'avez demandé de fournir, moi et les autres.

1
ajouté

Si vous utilisez le plugin WP-DB Manager , rendez-vous dans ses options et créez une sauvegarde manuellement. Si cela échoue, inspectez le message d'erreur et essayez de comprendre ce qui pourrait mal se passer. Si vous ne pouvez pas le comprendre, postez le message d'erreur ici.

Si la sauvegarde manuelle se passe bien, il y a probablement une erreur dans la configuration de l'e-mail. Vérifiez tous les paramètres de messagerie et assurez-vous qu'ils sont corrects. Quel fournisseur de messagerie utilisez-vous pour envoyer les e-mails (quel serveur SMTP)? Quel fournisseur de messagerie utilisez-vous pour recevoir les e-mails (quel serveur POP3 et IMAP)?

Si vous n'utilisez pas WP-DB Manager, nous devons savoir comment vous effectuez ces sauvegardes et toutes les informations que vous m'avez demandé de fournir, moi et les autres.

1
ajouté

Absolument, surtout en traitant beaucoup de ces permutations / combinaisons, je peux définitivement voir que le premier passage serait un problème.

Implémentation intéressante en python, bien que j'en ai écrit un joli en C et Ocaml basé sur "Algorithm 515" (voir plus bas). Il a écrit son dans Fortran comme c'était commun à l'époque pour tous les papiers "Algorithme XX", eh bien, cette assemblée ou c. J'ai dû le réécrire et faire quelques petites améliorations pour travailler avec des tableaux pas des plages de nombres. Celui-ci fait un accès aléatoire, je suis encore en train de travailler sur de bonnes implémentations de celles mentionnées dans le fascicule 4 de Knuth. Je vais expliquer comment cela fonctionne pour le lecteur. Bien que si quelqu'un est curieux, je ne m'opposerais pas à écrire quelque chose.

/** [combination c n p x]
 * get the [x]th lexicographically ordered set of [p] elements in [n]
 * output is in [c], and should be sizeof(int)*[p] */
void combination(int* c,int n,int p, int x){
    int i,r,k = 0;
    for(i=0;i< x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

~ "Algorithme 515: Génération d'un vecteur à partir de l'index lexicographique"; Buckles, B. P., et Lybanon, M. ACM Transactions on Mathematical Software, Vol. 3, n ° 2, juin 1977.

0
ajouté
@mkb Bien sûr.
ajouté l'auteur nlucaroni, source
"auto-réflexif" est un terme incorrect pour cela. C'est ce qu'on appelle "récursif" et c'est une partie fondamentale de l'informatique. La fonction "choose" en question est C (N, K), en.wikipedia.org/wiki/Binomial_coefficient
ajouté l'auteur nlucaroni, source
Il est à noter que x est basé sur 1, et non sur 0 comme on pourrait s'y attendre.
ajouté l'auteur Andrew Savinykh, source
Que fait choose() ? Est-ce que cela revient essentiellement à n-c [i] choisir p- (i + 1) 1 ?
ajouté l'auteur mkb, source
Je suis désolé, je ne suis pas le comportement choisi. On dirait qu'il est défini comme auto-réflexif - choisir choisit. Pourriez-vous me dire ce qu'il fait en termes plus simples?
ajouté l'auteur CuppM, source
Même le tableau c semble se rapporter à des éléments d'ensemble comme basés sur 1 et non sur 0. Considérant que nous incrémentons c [i] de la chauve-souris, il ne peut jamais se référer à 0 'élément. Ou est-ce que je manque quelque chose? Ou est-ce que OP voulait dire init c [i] avec -1 et dire choose (n-c [i] -1, ...)?
ajouté l'auteur Subu Sankara Subramanian, source

Question interessante!

Je le ferais en choisissant des combinaisons, quelque chose comme ce qui suit en python. La partie la plus difficile est probablement la première vérification, c'est-à-dire si f (1,2,3) renvoie true , est-ce un résultat correct? Une fois que vous avez vérifié cela, alors c'est une bonne base pour les tests de régression.

Probablement c'est une bonne idée de faire un ensemble de cas de test que vous savez seront tous vrais (par exemple 3,4,5 pour ce cas de triangle), et un ensemble de cas de test que vous savez seront tous faux (par exemple 0,1 , inf). Ensuite, vous pouvez vérifier plus facilement les tests sont corrects.

# xpermutations from http://code.activestate.com/recipes/190465
from xpermutations import *

lengths=[-1,0,1,5,10,0,1000,'inf']
for c in xselections(lengths,3):        # or xuniqueselections
    print c
(-1,-1,-1);
(-1,-1,0);
(-1,-1,1);
(-1,-1,5);
(-1,-1,10);
(-1,-1,0);
(-1,-1,1000);
(-1,-1,inf);
(-1,0,-1);
(-1,0,0);
...
0
ajouté

Je pense que vous pouvez le faire avec Attribut de test de ligne (disponible en MbUnit et les versions ultérieures de NUnit) où vous pouvez spécifier plusieurs ensembles pour remplir un test unitaire.

0
ajouté

Avec le tout nouveau Python 2.6, vous disposez d'une solution standard avec le module itertools qui renvoie le produit cartésien d'iterables:

import itertools

print list(itertools.product([1,2,3], [4,5,6]))
   [(1, 4), (1, 5), (1, 6),
   (2, 4), (2, 5), (2, 6),
   (3, 4), (3, 5), (3, 6)]

Vous pouvez fournir un argument "repeat" pour exécuter le produit avec un itérable et lui-même:

print list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

Vous pouvez également modifier quelque chose avec des combinaisons:

print list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]

Et si l'ordre compte, il y a des permutations:

print list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
   (2, 1), (2, 3), (2, 4),
   (3, 1), (3, 2), (3, 4),
   (4, 1), (4, 2), (4, 3)]

Bien sûr, tout ce truc cool ne fait pas exactement la même chose, mais vous pouvez les utiliser d'une manière ou d'une autre pour résoudre votre problème.

N'oubliez pas que vous pouvez convertir un tuple ou une liste en un ensemble et vice versa en utilisant list (), tuple() et set ().

0
ajouté

Bien qu'il soit possible de créer beaucoup de données de test et de voir ce qui se passe, il est plus efficace d'essayer de minimiser les données utilisées.

Dans une perspective d'assurance qualité typique, vous voudriez identifier différentes classifications d'intrants. Produire un ensemble de valeurs d'entrée pour chaque classification et déterminer les résultats appropriés.

Voici un exemple de classes de valeurs d'entrée

  • triangles valides avec de petits nombres tels que (1 milliard, 2, milliards, 2 milliards)
  • triangles valides avec de grands nombres tels que (0.000001, 0.00002, 0.00003)
  • triangles obtus valides qui sont 'presque' tels que (10, 10, 19.9999)
  • triangles aigus valides qui sont 'presque' plats tels que (10, 10, 0000001)
  • triangles invalides avec au moins une valeur négative
  • triangles invalides où la somme des deux côtés est égale à la troisième
  • triangles non valides où la somme des deux côtés est supérieure à la troisième
  • valeurs d'entrée non numériques

...

Une fois que vous êtes satisfait de la liste des classifications d'entrée pour cette fonction, vous pouvez créer les données de test réelles. Probablement, il serait utile de tester toutes les permutations de chaque élément. (par exemple (2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) Généralement, vous trouverez certaines classifications manquantes (comme le concept d'inf en tant que paramètre d'entrée).

Des données aléatoires pour une certaine période de temps peuvent également être utiles, car elles peuvent trouver des bogues étranges dans le code, mais elles ne sont généralement pas productives.

Plus vraisemblablement, cette fonction est utilisée dans un contexte spécifique où des règles supplémentaires sont appliquées (par exemple, seules les valeurs entières ou les valeurs doivent être en incréments de 0,01, etc.) Elles s'ajoutent à la liste des classifications des paramètres d'entrée.

0
ajouté

Voici un problème possible: Assurez-vous de ne pas manquer d'espace disque sur votre serveur. Le programme de sauvegarde aura besoin d'un peu d'espace pour .zip l'extrait et zipper la base de données avant de l'envoyer par la poste.

0
ajouté

Voici un problème possible: Assurez-vous de ne pas manquer d'espace disque sur votre serveur. Le programme de sauvegarde aura besoin d'un peu d'espace pour .zip l'extrait et zipper la base de données avant de l'envoyer par la poste.

0
ajouté

J'utilise le même plugin (depuis longtemps déjà) et cela m'est arrivé peut-être 2 ou 3 fois. Je n'ai jamais été capable de comprendre la raison.

La désactivation et la réactivation du plugin m'ont permis de le réparer dans tous les cas.

0
ajouté

J'utilise le même plugin (depuis longtemps déjà) et cela m'est arrivé peut-être 2 ou 3 fois. Je n'ai jamais été capable de comprendre la raison.

La désactivation et la réactivation du plugin m'ont permis de le réparer dans tous les cas.

0
ajouté