3
votes

Comment puis-je créer un test unitaire pour les instructions SQL?

J'ai quelques instructions SQL stockées sous forme de fichiers qui sont exécutés par un script Python. La base de données est hébergée dans Snowflake et j'utilise Snowflake SQLAlchemy pour me connecter à

Comment puis-je tester ces déclarations? Je ne veux pas les exécuter, je veux juste vérifier s'ils pourraient être exécutables.

Une chose très basique pour vérifier si c'est du SQL standard valide . Une meilleure réponse serait quelque chose qui prend en compte les éléments spécifiques aux flocons de neige comme

copy into s3://example from table ...

La meilleure réponse serait quelque chose qui vérifie également les autorisations, par exemple pour les instructions SELECT si le tableau est visible / lisible.


3 commentaires

Les tests unitaires typiques de Python (et d'autres langages) ne feraient que simuler la base de données et se concentrer sur le logiciel. Si vous voulez réellement que votre test unitaire atteigne la base de données, alors ce n'est plus un test unitaire, c'est un test d'intégration. Si Python a une base de données en mémoire, vous pourrez peut-être l'utiliser pour un test unitaire strict.


Ah ok. Vous suggérez donc d'utiliser sqlite pour créer une fausse base de données à tester localement?


Une base de données en mémoire est une option. A part cela, il n'y a pas grand chose que Python puisse faire, non sans faire quelque chose comme l'écriture d'un analyseur SQL, etc.


4 Réponses :


0
votes

J'aime beaucoup cette idée, mais je peux suggérer une solution, car je dois souvent vérifier ma syntaxe et avoir besoin d'aide. Ce que je recommanderais, si vous prévoyez d'utiliser l'interface Snowflake, serait de vous assurer d'utiliser LIMIT 10 ou LIMIT 1 sur les instructions SELECT que vous auriez besoin de valider.

Une autre astuce que je recommanderais est de parler à un représentant Snowflake d'un essai si vous ne faites que commencer. Ils auront également beaucoup de conseils pour des requêtes plus spécifiques que vous cherchez à valider.

Et enfin, sur la base de quelques commentaires, assurez-vous qu'il utilise SQL: ANSI et le live dans le https://docs.snowflake.net/manuals/index.html pour référence.


0 commentaires

-1
votes

En ce qui concerne la validité de l'instruction sql, vous pouvez exécuter Expliquer l'instruction et cela devrait vous donner une erreur si la syntaxe est incorrecte ou si vous n'avez pas l'autorisation d'accéder à l'objet / à la base de données. Cela étant, il y a encore quelques exceptions que vous ne pouvez pas exécuter, expliquez comme la commande 'use' qui, je ne pense pas, est nécessaire pour la validation.

J'espère que cela vous aidera.


0 commentaires

0
votes

Une base de données sqlite en mémoire est une option. Mais si vous exécutez des requêtes SQL brutes contre snowflake dans votre code, vos tests peuvent échouer si la même syntaxe n'est pas valide avec sqlite. Enregistrer vos requêtes HTTP sur une base de données de test de flocon de neige, puis les rejouer pour vos tests unitaires convient mieux à cet objectif. Il existe deux très bonnes bibliothèques qui font cela, vérifiez-les:

  1. vcrpy
  2. betamax

0 commentaires

1
votes

Nous exécutons des tests d'intégration sur nos bases de données Snowflake. Nous maintenons des clones de nos bases de données de production, par exemple, l'une de nos bases de données de production s'appelle data_lake et nous maintenons un clone qui est cloné chaque nuit appelé data_lake_test qui est utilisé pour exécuter nos tests d'intégration.

Comme Tim Biegeleisen l'a mentionné, un "vrai" test unitaire se moquerait de la réponse mais nos tests d'intégration exécutent de vraies requêtes Snowflake sur nos bases de données clonées test . Il est possible qu'un test modifie considérablement la base de données test , mais nous exécutons des tests d'intégration uniquement pendant notre processus CI / CD, il est donc rare qu'il y ait un conflit entre deux tests.


0 commentaires