2009-06-02 14 views
62

Con MS metiendo powershell en todos los nuevos productos de servidor, estoy empezando (a regañadientes) a pensar que debo tomarlo en serio. Parte de "tomarlo en serio" es TDD. ¿Has encontrado buenos métodos para probar los guiones del intérprete de comandos de potencia?¿Cómo hacer TDD y pruebas unitarias en powershell?

He encontrado muestras de burlas desde Mr Geek Noise - pero realmente me gustaría algo como RhinoMocks. Brian Hartsock tiene una muestra de pruebas en ejecución en cadenas de powershell de MS Test. Un poco hacky, pero parece funcionar.

Lo que quiero es una experiencia Powershell TDD que sea tan limpia como en los idiomas "reales".


actualización para aclarar:

Las primeras dos respuestas intento de alejarse de las pruebas de Powershell. Las opiniones son interesantes. No quiero saber si es una buena idea probar en PowerShell. Esa es una pregunta subjetiva que debe hacerse en un foro diferente. Quiero una solución para probar la unidad powershell. Si crees que es una mala idea (podría ser), trátala como una pregunta académica divertida.

  • Sí, los lenguajes de script pegan juntos los sistemas dispares. Sin embargo, como ya se señaló, también es fácil burlarse y romper costuras en un lenguaje dinámico.
  • No estoy preguntando sobre "depuración". La depuración es un tema extremadamente útil. Dejaré que alguien más lo pregunte.
  • Quizás las secuencias de comandos PS sean simples. El lenguaje admite modularidad y es inevitable que se implementen procesos complejos en PS (incluso si es una mala idea).
  • La respuesta a esta pregunta no es "No se puede". Puedo ver (de blogs vinculados, que son un poco viejos) que algunas personas han avanzado en el problema.

Para restablecer: ¿Cómo implementar una prueba automatizada de la lógica de Powershell en el estilo de xUnit? Las pruebas de integración son interesantes, pruebas unitarias que rompen las dependencias más interesantes.

+1

mira en http://stackoverflow.com/questions/1004424/is-there-a-unit-testing-framework-for-testing-powershell-with-powershell-scripts hay una pregunta similar con algunos enlaces (PSUnit y la publicación de Lee Holmes) – stej

+1

Nunca tome Powershell a la ligera. Es increíblemente poderoso con un código mínimo. – D3vtr0n

Respuesta

39

de Scott Muc ha iniciado un proyecto para un marco ligero para BDD PowerShell llamado Pester:

https://github.com/pester/Pester

+2

Mucho mejor diseño que PsUnit. No requiere borrado con perfiles o instaladores. Lo disparé y comenzaré a usarlo esta semana. – Precipitous

+1

Heh gracias por los comentarios y el enchufe! –

+2

Aquí hay un artículo de blog de Scott sobre pester http://scottmuc.com/blog/development/pester-bdd-for-the-system-administrator/ –

-5

De su pregunta, creo que se dirige a la decepción. Powershell es solo un pequeño lenguaje de línea de comandos. Claro, es puede hacer cualquier cosa que C# pueda hacer, y aún más, pero también lo puede hacer el lenguaje ensamblador. Por supuesto, también es OO y está enganchado a las bibliotecas .NET, pero también lo es C#, que es un lenguaje mucho más limpio.

Si una solución es más larga que un liner, o si cree que necesita TDD, entonces no desea utilizar Powershell. Es un lenguaje críptico que está lleno de sorpresas, que debe evitarse para cualquier cosa complicada.

Si desea hacer una búsqueda ad hoc y reemplazar o formatear el texto, o buscar en su sistema de archivos, entonces Powershell es su amigo. Lo que realmente desea hacer es usarlo un poco todos los días y repetirlo con frecuencia para familiarizarse con la sintaxis. Por esta razón, también evite las bibliotecas de Powershell de código abierto y olvídese de escribir sus propios CmdLets, a menos que tenga un caso muy especializado para el uso de línea de comando ad hoc. Las reglas de enlace de tuberías son arcanas y feas.

Esto es solo mi opinión, por supuesto, pero soy un usuario de Powershell desde hace mucho tiempo y estoy mucho más contento con él ahora que lo veo así.

+2

Supongo que los scripts de PowerShell se escribirán porque MS lo está presionando mucho. Se volverá rápidamente útil. Debido a que las secuencias de comandos de PS se escribirán y serán programas (aunque sean humildes), quiero que sean sólidos. Entonces, quiero probarlos. Puede estar en desacuerdo, pero entonces, llamemos a esto un ejercicio académico: ¿cómo probarías un script de powershell? La conclusión práctica puede ser que es demasiado difícil (creo que no imposible) y debería usar IronPython para scripts en lugar de eso si insisto en la calidad. :) – Precipitous

+0

Nadie duda de que TDD en Powershell es posible. Definitivamente es posible, después de todo, Powershell puede hacer todo lo que C# puede hacer, y algo más. La naturaleza funcional de Powershell en teoría puede hacer que sea un lenguaje de prueba aún mejor que C#. El problema es que la sintaxis y el diseño general de Powershell es ... bueno, feo y sorprendente. Hablemos de nuevo después de que hayas tenido un año de experiencia ... – Mike

+1

He estado usando PS durante al menos 3 años para el trabajo diario (sobre todo para las capacidades de archivos sólidos) - podemos hablar ahora :) Acepto es feo Sin embargo, se conecta a MUCHA funcionalidad. Las sorpresas son POR QUÉ quiero probarlo. – Precipitous

2

Creo que estás preguntando sobre "estrategias de prueba" en lugar de TDD específicamente, así que responderé a ambas preguntas.

La mayor parte de su trabajo en PowerShell integrará un conjunto de sistemas dispares a través de cmdlets y tubos de objeto. Si quiere estar seguro de que sus scripts de PowerShell funcionan, haga todo lo posible por crear un entorno de ensayo perfecto para probar todos estos sistemas con la mayor precisión posible.

Ejecutar sus scripts en un entorno de puesta en escena perfecto será infinitamente más valioso que "dar forma a su diseño" a través de TDD o "probar la intención de su código" con pruebas de unidad de hecho.

notas pequeñas que pueden ayudar: existe

  • El interruptor -whatif en cmdlets integrados. También descubrí que puedes hacer esto también: -whatif:$someBool - sabrás cuando lo necesites.
  • El ISE que viene en V2 tiene un depurador. Dulce.
  • Siempre puede codificar un cmdlet personalizado en C# y hacer lo que desee allí.
+0

Hmm ... también duda que sea posible. Tenga en cuenta que el blog Geek Noise demuestra una solución a la burla (los sistemas dispares). – Precipitous

+0

Es posible que asuma, pero ¿a quién le importa? ¿Qué valor tiene saber que ha escrito "\\ server \ fileshare" tanto en su prueba como en su secuencia de comandos? O bien especificará las interacciones con los cmdlets externos, o bien solo probará las interacciones dentro de su propio sistema (que terminará siendo una porción MUY pequeña de su script.) Supongo que tiene valor, pero de nuevo, obtendrá un Beneficio mucho mayor al realizar pruebas reales en un entorno de ensayo (y en la propia prueba si es posible). –

+2

Ni el sistema ni las pruebas de unidades ofrecen "un beneficio mucho mayor", ambos necesarios. Si estoy probando "interacciones con cmdlets externos", no es una prueba unitaria. Aquí hay un ejemplo trivial de lógica común que se beneficia de las pruebas unitarias/imitación: Tenemos un guión posterior a la implementación que identifica errores interesantes en un registro de eventos de Windows, excluyendo el correo no deseado. Posh sobresale aquí, no hay necesidad de usar cmdlet. El criterio de filtro es complejo y delicado. Extraiga los criterios de dónde-objeto para funcionar y probar varias entradas. Fácil de encontrar con otros ejemplos. – Precipitous

11

PsUnit ahora se ha actualizado con un marco. Tuve el mismo problema que hace unos meses y pensé que PsUnit era grande y complejo para la cantidad de guiones que tenía que escribir, así que escribí mi propio marco de prueba de unidad para PS. PS tiene el mismo tipo de características que otros lenguajes de script como python, por ejemplo, es posible anular funciones en cualquier lugar en cualquier momento incluso con alcance en los métodos de prueba, lo que es genial para la simulación (a.k.a. burla). Es decir, si tiene una función u objeto que desea probar que depende de otras funciones, puede declararlas en su método de prueba para crear una implementación falsa local.

Así que, independientemente de qué marco de prueba elijas usar, diría que PS es muy fácil de TDD. Esa fue mi experiencia al menos.

+0

PsUnit es bastante dulce y liviano. –

0

discusión muertos pero las preocupaciones son muy vivo.

Lo único que veo que falta en la discusión sobre la utilidad de las pruebas unitarias de PS dado su uso previsto involucra módulos en un sistema empresarial. Imagine una configuración empresarial con un repositorio central para tareas comunes de nivel de red/archivo implementadas en PS. En esta configuración, tiene un pequeño número de desarrolladores y especialistas en redes, todos los cuales tienen tareas que se solapan ligeramente. Un desarrollador crea un módulo que encapsula la lógica de negocios y su utilidad se reconoce inmediatamente de manera que en poco tiempo, otros se incorporan e incorporan el módulo en sus propios esfuerzos. El módulo está incluido en cualquier cosa, desde scripts interactivos únicos hasta aplicaciones de clientes de tamaño medio; Si bien es posible que algunos no estén de acuerdo con los casos de uso de un lenguaje de shell-scripting, la evolución es una constante en este campo.

En este escenario, creo que es valioso definir un conjunto de "contratos" para que sigan estos módulos comunes. Si compartir conocimientos es parte integral de la organización, entonces es posible que más de una persona modifique estos módulos. Tener pruebas unitarias que validen la integridad de los módulos sería muy útil para mantener el orden y minimizar el caos, manteniendo así (tal vez aumentando) el valor de los módulos.

En cuanto a un enfoque preferido, todavía tengo que adoptar uno. PS trae a la mente una sustancia fluida/dinámica/ágil. Que lo contenga dentro de una estructura rígida, como lo que he visto con TDD se siente antinatural. Sin embargo, dado el escenario anterior, este objetivo no puede ser ignorado. No importa, estoy desgarrado, siento perder tu tiempo. Gracias por leer.

+0

Esto suena algo similar a lo que publiqué hace un par de años bajo "PowerShell y .Net - Building Systems as Toolkits" - http://chrisoldwood.blogspot.co.uk/2011/11/i-first-came-across-com-back-in-mid-90s.html. He escrito mucho pegamento en PS y me sentiría más cómodo si pudiera probarlo en una unidad, especialmente en el manejo de errores, ya que a menudo es difícil de simular en un entorno de prueba. –