Comment faire des tests TDD et unitaires dans powershell?

Avec MS éperonnage powershell dans tous les nouveaux produits de serveur, je commence à penser (à contrecœur) que je dois le prendre au sérieux. Une partie de "prendre au sérieux" est TDD. Avez-vous trouvé de bonnes méthodes pour tester les scripts power shell?

J'ai trouvé des échantillons de se moquer de M. Geek Bruit - mais je voudrais vraiment quelque chose comme RhinoMocks. Brian Hartsock a un échantillon de tests en cours d'exécution sur les chaînes powershell DE MS Test. Un peu hacky, mais il semble fonctionner.

Ce que je veux, c'est une expérience Powershell TDD aussi propre que dans les langues "réelles".


Mise à jour pour clarifier:

Les deux premières réponses tentent de m'éloigner de tester Powershell. Les avis sont intéressants. Je ne veux pas savoir si c'est une bonne idée de tester en powershell. C'est une question subjective qui devrait être posée dans un forum différent. Je veux une solution pour tester l'unité powershell. Si vous pensez que c'est une mauvaise idée (peut-être), de traiter c'est une question académique amusante.

  • Oui, les langages de script collent des systèmes disparates. Cependant, comme déjà souligné, il est également facile de se moquer et de casser les coutures dans un langage dynamique.
  • Je ne demande pas de "débogage". Le débogage est un sujet extrêmement utile. Je vais laisser quelqu'un d'autre le demander.
  • peut-être que les scripts PS devraient être simples. Le langage supporte la modularité et il est inévitable que des processus complexes soient implémentés dans PS (même si c'est une mauvaise idée).
  • la réponse à cette question n'est pas "vous ne pouvez pas". Je peux voir (liées blogs qui sont un peu vieux) que certaines personnes ont fait des progrès sur le problème.

Pour re-État: Comment implémentez-vous un test automatisé de la logique Powershell dans le style de xUnit? les tests D'intégration sont intéressants, les tests unitaires qui cassent les dépendances les plus intéressants.

64
demandé sur Mark Wragg 2009-06-02 20:28:02

5 réponses

Scott Muc a lancé un projet pour un framework BDD léger pour PowerShell appelé Pester:

Https://github.com/pester/Pester

42
répondu Martin Suchanek 2012-09-28 16:35:02

PsUnit est maintenant mis à jour avec un cadre. J'ai eu le même problème que vous il y a quelques mois et J'ai senti que PsUnit était trop grand et complexe pour le nombre de scripts que je devais écrire, alors j'ai écrit mon propre framework de test unitaire pour PS. PS ont le même type de charectaristics que d'autres langages de script commeepython par exemple, c'est-à-dire que vous pouvez remplacer les fonctions n'importe où à tout moment, même avec une portée dans les méthodes de test, ce qui est idéal pour simuler (alias mocking). Autrement dit, si vous avez une fonction ou un objet vous voulez tester cela dépend d'autres fonctions que vous pouvez déclarer dans votre méthode de test pour créer une implémentation fausse locale.

Donc, en ce qui concerne le framework de test que vous choisissez d'utiliser, je dirais que PS est très facile à TDD. Ce fut mon expérience au moins.

11
répondu Cellfish 2009-08-21 05:21:50

Je pense que vous posez des questions sur les "stratégies de test" au lieu de TDD spécifiquement, donc je vais répondre aux deux questions.

La majeure partie de votre travail dans PowerShell sera l'intégration d'un tas de systèmes disparates via cmdlets et tuyaux d'objet. Si vous voulez être sûr que vos scripts PowerShell fonctionnent, mettez autant d'efforts que possible dans la construction d'un environnement de mise en scène parfait, afin de tester tous ces systèmes aussi précisément que possible.

Exécuter vos scripts dans une mise en scène parfaite l'environnement sera infiniment plus précieux que "étoffer votre conception" via TDD ou "tester l'intention de votre code" avec des tests unitaires après le fait.

Petites notes qui peuvent aider:

  • le commutateur -whatif existe sur les applets de commande intégrées. Aussi, je viens de découvrir que vous pouvez le faire aussi: -whatif:$someBool - vous saurez quand vous en aurez besoin.
  • L'ISE entrant dans V2 a un débogueur. Doux.
  • Vous pouvez toujours coder une applet de commande personnalisée en C# et y faire ce que vous voulez.
2
répondu Peter Seale 2009-06-02 20:54:56

Discussion morte mais les préoccupations sont très vives.

La seule chose que je vois manquante dans la discussion sur l'utilité des tests unitaires PS compte tenu de son utilisation prévue implique des modules dans un système d'entreprise. Imaginez un paramètre d'entreprise avec un référentiel central pour les tâches réseau/fichier communes implémentées dans PS. Dans ce cadre, vous avez un petit nombre de développeurs et de spécialistes du réseau qui ont tous des tâches qui se chevauchent légèrement. Un développeur crée un module l'encapsulation de la logique métier et de son utilité est immédiatement reconnue de telle sorte qu'en un rien de temps, d'autres sautent et intègrent le module dans leurs propres efforts. Le module est inclus dans tout, des scripts interactifs uniques aux applications clientes de taille moyenne; bien que certains ne soient pas d'accord sur les cas d'utilisation d'un langage de script shell, l'évolution est une constante dans ce domaine.

Dans ce scénario, je crois qu'il est utile de définir un ensemble de "contrats" pour ces modules communs suivre. Si le partage des connaissances fait partie intégrante de l'organisation, il est possible que plus d'une personne modifie ces modules. Avoir des tests unitaires valider l'intégrité des modules irait un long chemin vers le maintien de l'ordre et la minimisation du chaos soutenant ainsi (peut-être en augmentant) la valeur des modules eux-mêmes.

Quant à une approche préférée, je n'en ai pas encore adopté une. PS évoque une substance fluide / dynamique / agile. Le contenant dans une structure rigide telle que ce que j'ai vu avec TDD ne semble pas naturel. Cependant, compte tenu du scénario ci-dessus, cet objectif ne peut être ignoré. Peu importe, je suis déchiré, désolé de perdre votre temps. Merci pour la lecture.

0
répondu Draghon 2012-05-25 14:02:58

De votre question, je pense que vous vous dirigez vers la déception. Powershell est juste un petit langage de ligne de commande. Bien sûr, il Peut Faire tout ce que C# peut faire, et même plus, mais alors le langage d'assemblage peut aussi. Bien sûr, C'est aussi OO et accroché aux bibliothèques.net, mais C# aussi, qui est un langage beaucoup plus propre.

Si une solution est plus longue qu'un one liner, ou si vous pensez que vous devez la TDD, alors vous ne voulez pas utiliser Powershell. C'est un langage cryptique qui est plein de surprises, à éviter pour tout ce qui est compliqué.

Si vous voulez faire une recherche ad hoc et remplacer ou formater du texte, ou regarder autour de votre système de fichiers, alors Powershell est votre ami. Ce que vous voulez vraiment faire est de l'utiliser un peu tous les jours, et vous répétez souvent, afin de rester familier avec la syntaxe. Pour cette raison, évitez également les bibliothèques open source Powershell et oubliez d'écrire vos propres CmdLets, sauf si vous avez un cas très spécialisé pour ad utilisation de la ligne de commande hoc. Les règles de liaison de tuyaux sont Arcanes et laides.

Tout cela est juste mon opinion bien sûr, mais je suis un utilisateur Powershell de longue date et je suis beaucoup plus heureux avec cela maintenant que je le regarde comme ça.

-5
répondu Mike 2009-06-02 18:32:31