web-dev-qa-db-fra.com

Comment tester des valeurs variables qui diffèrent en raison d'une inexactitude de points flottants causée par différents types de DBMS?

Je travaille sur un programme qui doit fonctionner sur des valeurs de points flottants extraites de différents types de base de données: nous prenons actuellement 12 SGBD différents (par exemple, deux d'entre eux sont SQLite3 et Mariah).

Mon code applique une logique commerciale aux valeurs extraites de la base de données, un score de point flottant est calculé et les valeurs sont commandées par le score. J'ai des tests écrits pour cette logique d'entreprise. En raison des différences d'ordre de grandeur environ 10 ^ -6 entre ces valeurs lors de la récupération de différentes bases de données, le résultat de la commande dépend du type de base de données.

Pour la production, je crois que la différence de commande en raison d'une différence de 10 ^ -6 est acceptable. (Surtout parce que nous disons que l'intégrité des données et la qualité sont la responsabilité de l'utilisateur de notre produit.) De plus, nos tests pour récupérer des valeurs à partir de DBS test jusqu'à une précision de 10 ^ -5.

Quel est le moyen le plus efficace de tester cela automatiquement? À savoir, commander des changements en raison de faibles différences d'inexactitude des points flottants.

Noter. Certains Clarificaiton à la demande

  1. La requête SQL est l'agrégation avec certains groupes par clauses (des fonctions d'agrégation différentes sont testées) et deux filtres de délai de différentes périodes. Dans cette fonction d'exemple, la fonction d'agrégation était la moyenne d'une colonne. Donc, deux dataframes sont extraites de la base de données avec les mêmes colonnes.

  2. Ces deux dataframes sont reliés sur le groupe par des colonnes. La différence de colonne métrique pour les deux périodes de temps est calculée.

  3. Le score est la différence * z-score du score.

  4. La différence de 10 ^ -6 est de la façon dont SQLite3 et Mariadb calcule la moyenne. Toutes les bases de données pour chaque type de dB sont créées et insérées au début de chaque test en utilisant les mêmes fichiers CSV comme entrée.

20
Gofrette

De votre commentaire Répondre:

"Vous demandez-vous comment tester que la commande change entre les DBMSES?" Oui

Si tel est le type de test que vous souhaitez écrire, cela doit alors être un test d'intégration, où vous prenez le même ensemble de données, stockez-le dans différents magasins de données, récupérez-le de manière triée et comparez la différence de ordre.

Quelque chose dans le sens de:

double[] myData = new[]
{
    1.234567,
    1.234568  // difference of 1 * 10 ^-6
}

myProviderA.Save(myData);
myProviderB.Save(myData);

var resultA = myProviderA.GetSorted(myData);
var resultB = myProviderB.GetSorted(myData);

// Assert the lists are in a DIFFERENT order.

Évidemment, vos données de test doivent utiliser des chiffres que vous connaissez produire un tri différent. Je viens de choisir un nombre aléatoire.

Cependant, j'offrirais que ce n'est pas le moyen le plus productif d'y aller.

Si différences sur l'ordre de grandeur de 10-6 ne sont pas un problème pour vous, alors il n'y a pas de véritable objectif pour écrire un test pour trouver si Il y a une différence sur l'ordre de grandeur de 10-6.
[.____.

Au lieu de cela, il peut être préférable de se concentrer sur la veille à ce qu'il n'y ait aucune différence sur un ordre de grandeur que le fait Peu importe pour vous. Pour la même exemple, je vais supposer 10-5 compte pour vous?.

Il serait logique d'écrire le même test que j'ai décrit ci-dessus, mais où les valeurs sont différentes par ordre de magnitude 10-5, puis en veillant à ce qu'il y ait pas de tri par différents fournisseurs.

Quelque chose dans le sens de:

double[] myData = new[]
{
    1.23456,
    1.23457  // difference of 1 * 10 ^-5
}

myProviderA.Save(myData);
myProviderB.Save(myData);

var resultA = myProviderA.GetSorted(myData);
var resultB = myProviderB.GetSorted(myData);

// Assert the lists are in THE SAME order.

Une autre approche serait de contourner simplement/plancher tous les chiffres à la précision que vous en avez besoin (10-5 Dans cet exemple), puis utilisez uniquement ces nombres arrondis. De cette façon, vous n'avez pas à vous soucier des personnes qui se confondent que certains éléments ont commuté leur commande après la saisie dans votre système.

Il s'agit davantage d'une contrepartie UX, vous voudrez généralement toujours écrire le test ci-dessus pour vous assurer que l'un de vos fournisseurs de données ne commencent pas tout de suite que d'être beaucoup plus imprécis à cause de par exemple. une mise à niveau logicielle ou une modification de configuration de votre fin.

0
Flater