En acceptant la commodité d'utiliser des tests unitaires sur mon C ++ préféré, j'ai essayé de transférer mon expérience à TSQL, d'autant plus que le nouvel employeur aime une initiative utile sur le terrain et distribue des petits pains pour cela.
J'ai regardé à travers plusieurs
cadres bien connus, je suis arrivĂ© Ă la conclusion que, en rĂšgle gĂ©nĂ©rale, ils sont volumineux et apportent une syntaxe supplĂ©mentaire qui doit ĂȘtre Ă©tudiĂ©e en plus.
Certains cadres fonctionnent Ă merveille et plaisent Ă l'Ćil du gestionnaire, Ă qui ils sont montrĂ©s, mais prĂ©sentent un certain nombre de limitations que je n'aimais pas.
Je voulais tout implémenter sur du TSQL pur casher-halal-orthodoxe.
De temps en temps, distrayant du dĂ©veloppement principal pendant plusieurs annĂ©es en affinant la structure du script, j'ai dĂ©cidĂ© de le partager avec vous (mais j'ai quand mĂȘme rĂ©ussi Ă produire 3,5 Mo de scripts).
Mes exigences de base étaient simples - je dois effectuer n'importe quel test unitaire dans un fichier sans avoir besoin de gestes et d'outils logiciels spéciaux - uniquement hardcore: sqlcmd ou MSSMS.
Aucune modification n'est apportée à la base de données dans laquelle le test est effectué - tout est restauré au début du script.
Un seul a dĂ©fini une limite - le test devrait fonctionner dans une base de donnĂ©es vide (les donnĂ©es initiales peuvent l'ĂȘtre), sinon vous en aurez assez de dĂ©monter toutes les options.
La tùche principale consiste à tester la logique et à maintenir l'intégrité de la logique.
Pour cela, je mets la rubrique suivante au début du test:
SET QUOTED_IDENTIFIER ON GO PRINT '-------------------------------- CLR Unit tests for Habr Logic ---------------------------------' IF 0 < ( SELECT count(*) FROM device) begin RAISERROR ('FAILED: database must be empty for this unit test', 16, -1 ) end GO
J'essaie de ne pas créer de tests unitaires plus longs que quelques écrans, bien que ce ne soit pas facile, dans le cas d'une logique complexe.
Un test unitaire typique ressemble à ceci et comporte 3 parties clés:
BEGIN TRAN TestClr2 declare @test_name sysname = (select TOP 1 name from sys.dm_tran_active_transactions WHERE transaction_type = 1 ORDER BY transaction_begin_time DESC) + ' [fn_calculate_dev_status] record for device has wrong range' BEGIN TRY SET NOCOUNT ON;
- 1. préparer les données pour le test unitaireIci, nous pouvons remplir les tableaux nécessaires avec des données et préparer des variables ou tableaux temporaires afin de ne pas encombrer le code dans la section de test.
- 2. exécuter le test unitaireIci, en rÚgle générale, cela va, soit un appel de fonction, ou une procédure, ou un changement de table, si nous testons la logique de déclenchement.
- 3. vérification des résultatsDans cette partie du test, nous vérifions comment l'état des objets de la base de données a changé, ou le résultat de la fonction-procédure testée.
Si la fonction de procédure renvoie un enregistrement, nous l'insérons dans la table temporaire et l'analysons déjà .
Les résultats agrégés et préparés sont comparés à la norme et lÚvent une exception si tout le reste échoue.
Avec Oracle, tout est un peu plus compliquĂ© - je ne pouvais pas Ă©crire et exĂ©cuter le test sous cette forme et dans la mĂȘme idĂ©ologie, plutĂŽt Ă partir d'un peu d'expĂ©rience - nous avons cessĂ© de supporter Oracle pour notre produit.
Chaque test unitaire est émis comme une procédure:
CREATE OR REPLACE PROCEDURE UnitTest9_TRG_JOBLOGDETAIL AS v_message VARCHAR2(255) := 'UnitTest9_TRG_JOBLOGDETAIL: INSERT joblogdetail]- joblogdetail_result not Failed and joblogdetail_endtime is null '; v_maxdate date := '2014/01/01'; v_cnt NUMBER := 0; BEGIN savepoint my_savepoint; <b>
Dans le mĂȘme fichier de test Ă la fin, vous devrez effectuer un nettoyage de la base de donnĂ©es Ă partir des tests créés et exĂ©cutĂ©s.
commit; / set serveroutput on; SET FEEDBACK OFF; spool C:\dist\test.spl; exec UnitTest_empty_database; exec UnitTest3297_TRGBFR_UDEVICE(1); exec UnitTest5_TRG_BF_UDEVICE; exec UnitTest_3062a; ... spool off; / DROP PROCEDURE UnitTest_3062; DROP PROCEDURE UnitTest_BIRDIESEC_3344; DROP PROCEDURE UnitTest_empty_database; ... SET FEEDBACK ON; commit;
C'est tout.
Ensuite, vous produisez simplement des fichiers, divisés en catégories du type: déclencheurs, fonctions, procédures, rapports, objets volumineux et spéciaux de logique métier, et bien sûr, pour chaque objet de base de données.
Presque tous les développeurs de bases de données froncent les sourcils et disent - pourquoi devrais-je, laissez les testeurs le faire. Si la base de données n'a aucune logique du mot, alors je suis d'accord avec eux, mais s'il y en a beaucoup, alors ils économisent naturellement les nerfs, la réputation et l'argent.
Un exemple.
Nous avons dans l'interface Web des arborescences de connexions logiques entre des objets arborescents comme l'Amérique -> Canada -> Ontario -> Waterloo, Asie -> Japon -> Tokyo -> Ebina, c'est-à -dire toute une série de bureaux géographiques.
Chacun de ces nĆuds a des rĂšgles trĂšs complexes, l'utilisateur ou la rĂšgle ou le gĂ©nĂ©rateur attribue des pĂ©riphĂ©riques.
En consĂ©quence, mĂȘme les instructions dĂ©crites en dĂ©tail dans les Ă©tapes dĂ©molissent tout le monde, mĂȘme ceux qui ont participĂ© Ă la discussion et au dĂ©veloppement de cette logique.
Plus de cinquante étapes de l'instruction avec différents ensembles de données - tout est documenté en détail.
Tout changement ou ajout à la logique est une horloge de vérification manuelle que rien ne s'est cassé.
Le refactoring de la mort est similaire.
AprÚs avoir couvert la logique avec des tests unitaires, tout est vérifié par la soie et je suis sûr que tout fonctionne comme il se doit.
Tout développeur Java ayant recours à moi, lançant du tonnerre et des éclairs (en pensant à mes mains tordues) est facilement mis en place en exécutant le test approprié.
Quelques minutes et tout le monde est satisfait. Tout changement de code fatal en mon absence me sera rapidement signalé par mail.
Naturellement, en tant que paresseux, j'ai décidé d'automatiser tout pour l'automatisation continue et j'ai écrit du porridge à partir de lots et de python.
Je vous demande d'exécuter légÚrement, dans le développement quotidien de prÚs d'une douzaine de langages et d'environnements entre lesquels vous devez sauter, il y a un manque de temps catastrophique pour tout lécher et le mettre dans un look professionnel.
Je ne voulais pas tout faire sur Windows PowerShell - nos sauts fonctionnent toujours ici et là sur Windows 95 intégré.
Je voulais faire tous les appels en Python, mais il s'est avéré que certaines constructions sql (XML-parsing inside cte) ne sont pas prises en charge non seulement dans la bibliothÚque python, mais aussi dans .NET, j'ai donc commencé le script via sqlcmd.
Le code est affiché
ici .
Pour exĂ©cuter un exemple de travail, modifiez simplement 2 fichiers: smtppart.py et config.ini - nom du serveur SMTP, port et e-mail oĂč les messages d'erreur seront supprimĂ©s.
Les scripts essaient d'abord d'obtenir les derniĂšres mises Ă jour de svn (remplacez-les par les vĂŽtres - git, perforce, ...).
Ensuite, une base propre est créée à partir de scripts avec un nom aléatoire, des tests unitaires y sont lancés, puis la base est supprimée.
La création d'une base de données de scripts de 80 Mo et de tests de 3,5 Mo (l'essentiel du schéma était déjà fait avant de rejoindre l'entreprise, donc je n'ai testé que ma partie) se fait sur ma machine en 15 minutes environ. J'ai juste le temps de boire une tasse de café avant le dernier engagement.
S'il y a eu des erreurs, les résultats de l'erreur seront envoyés par e-mail.
L'installation des dépendances est décrite dans le fichier: readme.txt
AprĂšs chaque modification de code, vous devez dĂ©finir manuellement le hachage de code (il sera visible dans la ligne de commande) dans le fichier config.ini - le message apparaĂźtra mĂȘme si le code est modifiĂ© et rien n'est cassĂ© - afin que je puisse contrĂŽler les modifications dans le code afin de pouvoir vĂ©rifier les modifications sans mon implication prĂ©alable.

Le lancement de tous les tests unitaires dans le fichier autorun.bat peut ĂȘtre placĂ© dans le
Planificateur de tùches Windows pour s'exécuter 1 à 2 par jour avant la création de l'entreprise ou aprÚs avoir quitté la maison - si quelque chose se casse le soir - vous pouvez regarder ce qui s'est passé devant le téléviseur et le réparer rapidement.
Je sais que dans les tests unitaires, il est le plus difficile de tout configurer, puis il est facile et agrĂ©able d'Ă©crire des tests, mĂȘme si cela peut ĂȘtre difficile et difficile, mais nĂ©cessaire. Bonne chance dans les tests, j'espĂšre que mes conseils aideront quelqu'un.
Je serai heureux de prendre conseil si quelque chose peut ĂȘtre amĂ©liorĂ© quelque part et de peigner le code, ne jugez pas strictement.