Tenemos un sistema que tiene algunos scripts bash ejecutándose además del código Java. Dado que estamos tratando de probar todo lo que posiblemente pueda romperse, y esos scripts de bash pueden romperse, queremos probarlos.
El problema es que es difícil probar los scripts bash.
¿Existe una forma o una mejor práctica para probar scripts de bash? ¿O deberíamos dejar de usar scripts bash y buscar soluciones alternativas que sean probables?
Respuestas:
En realidad , existe un shunit2 , un marco de prueba unitario basado en xUnit para scripts de shell basados en Bourne. No lo he usado yo mismo, pero valdría la pena echarle un vistazo.
Se han hecho preguntas similares antes:
fuente
Obtuve la siguiente respuesta de un grupo de discusión:
Este método es como una inyección de dependencia para scripts y suena razonable. Es preferible evitar los scripts bash y utilizar un lenguaje más comprobable y menos oscuro.
fuente
Prueba Bash compatible con TAP : Sistema de prueba automatizado Bash
núcleo de murciélagos
fuente
Nikita Sobolev escribió una excelente publicación de blog comparando algunos marcos de prueba de bash diferentes: Prueba de aplicaciones Bash
Para los impacientes: la conclusión de Nikita fue usar Bats, pero parece que Nikita se perdió el proyecto Bats-core , que me parece que es el que debe usar en el futuro, ya que el proyecto Bats original no se ha mantenido activamente desde 2013.
fuente
Epoxy es un marco de prueba Bash que diseñé principalmente para probar otro software, pero también lo uso para probar módulos bash, incluidos él mismo y Carton .
Las principales ventajas son una sobrecarga de codificación relativamente baja, un anidamiento de aserciones ilimitado y una selección flexible de aserciones para verificar.
Hice una presentación comparándolo con BeakerLib , un marco utilizado por algunos en Red Hat.
fuente
¿Por qué dice que es "difícil" probar los scripts de bash?
¿Qué pasa con los envoltorios de prueba como:
fuente
He creado shellspec porque quería una herramienta fácil de usar y útil.
Está escrito por puro script de shell POSIX. Ha probado con muchos proyectiles más que shunit2. Tiene características poderosas que el núcleo de murciélagos / murciélagos.
Por ejemplo, admite bloques anidados, fáciles de simular / stub, fáciles de omitir / pendientes, pruebas parametrizadas, número de línea de afirmación, ejecución por número de línea, ejecución paralela, ejecución aleatoria, formateador TAP / JUnit, integración de cobertura e CI, perfilador, etc. .
Vea la demostración en la página del proyecto.
fuente
Me gusta bastante shell2junit , una utilidad para generar resultados similares a JUnit a partir de pruebas de script Bash. Esto es útil porque el informe generado se puede leer mediante sistemas de integración continua, como los complementos JUnit para Jenkins y Bamboo.
Si bien shell2junit no proporciona el marco de scripting Bash completo como shunit2 , le permite tener buenos informes de los resultados de la prueba.
fuente
Prueba bashtest . Es una forma sencilla de probar sus scripts. Por ejemplo, tienes
do-some-work.sh
que cambiar algunos archivos de configuración. Por ejemplo, agregue una nueva líneaPASSWORD = 'XXXXX'
al archivo de configuración/etc/my.cfg
.Escribe los comandos de bash línea por línea y luego verifica la salida.
Instalar en pc:
Crear pruebas es simplemente escribir comandos bash.
Archivo
test-do-some-work.bashtest
:Ejecutar pruebas:
Puedes encontrar algunos ejemplos aquí y aquí
fuente
Tal vez esto se pueda utilizar o contribuir a
https://thorsteinssonh.github.io/bash_test_tools/
Destinado a escribir resultados en el protocolo TAP que imagino que es bueno para CI y bueno para aquellos que quieren entornos de shell. Imagino que algunas cosas se ejecutan en entornos de shell, por lo que algunos podrían argumentar que deberían probarse en su entorno de shell.
fuente
Dale una oportunidad a assert.sh
¡Espero eso ayude!
fuente
¡No puedo creer que nadie hablara de OSHT ! Es compatible tanto con TAP como con JUnit, es shell puro (es decir, sin otros lenguajes involucrados), también funciona de forma independiente, y es simple y directo.
La prueba se ve así (fragmentos tomados de la página del proyecto):
Una carrera simple:
La última prueba muestra "no está bien", pero el código de salida es 0 porque es un
TODO
. También se puede establecer detallado:Cambie el nombre para usar una
.t
extensión y colóquelo en unt
subdirectorio, y puede usarprove(1)
(parte de Perl) para ejecutarlo:Establecer
OSHT_JUNIT
o pasar-j
para producir una salida JUnit. JUnit también se puede combinar conprove(1)
.He usado esta biblioteca para probar funciones obteniendo sus archivos y luego ejecutando afirmaciones con
IS
/OK
y sus negativos, y scripts usandoRUN
/NRUN
. Para mí, este marco proporciona la mayor ganancia con la menor cantidad de gastos generales.fuente
Probé muchas de las soluciones presentadas aquí, pero encontré que la mayoría de ellas eran voluminosas y difíciles de usar, así que construí mi propio pequeño marco de prueba: https://github.com/meonlol/t-bash
Es solo un archivo en el repositorio que simplemente puede ejecutar directamente, con un conjunto básico de afirmaciones de estilo JUnit.
Lo he usado profesionalmente en varios proyectos internos y pude hacer que nuestros scripts de bash sean súper estables y resistentes a la regresión.
fuente
Es posible que desee echar un vistazo a bash_unit:
https://github.com/pgrange/bash_unit
fuente
Eche un vistazo a Outthentic , es simple, extensible en muchos lenguajes (Perl, Python, Ruby, Bash a elección) y marco multiplataforma (Linux, Windows) para probar cualquier aplicación de línea de comandos.
fuente
Me ha resultado difícil justificar el uso de bash para scripts más grandes cuando Python tiene ventajas tan enormes:
if [ x"$foo" = x"$bar"]; then ...
", que es propensa a errores.getopt
módulo (y hay un módulo aún más fácil para analizar argumentos, pero el nombre se me escapa).mysql
comando en bash, pero no es la mejor forma de escribir código).$*
o"$*"
o"$@"
o$1
o"$1"
, espacios en los nombres de archivo no es un problema, etc, etc, etc.Ahora solo uso bash para los scripts más simples.
fuente
if [[ $foo = $bar ]]; then ...
. Esto todavía no es mejor que lo que Python tiene para ofrecer, pero es mejor que lo que presentó.trap
(para limpiar / deshacer en caso de error) así como regex (es decir[[ $1 =~ ^[1-3]{3}$ ]]
). Estoy bastante seguro de que la sintaxis oscura que usó se refiere a implementaciones antiguas detest
, no a bash. Bash es excelente para interactuar con herramientas de línea de comandos existentes ... Con frecuencia, una sola tuberíaawk
ogrep
es mucho más fácil que la alternativa de Python.optparse
o su sucesorargparse
. Nunca he visto a nadie usar elgetopt
módulo, ni lo he usado personalmente. Lagetopt
utilidad es bueno, no obstante. El análisis de argumentos desde el shell no es un problema en absoluto una vez que tenga un buen patrón. A menos que esté intentando implementar subcomandos de estilo git o algo así, no hay muchos problemas.