¿Existe una mejor práctica establecida para separar pruebas unitarias y pruebas de integración en GoLang (testificar)? Tengo una combinación de pruebas unitarias (que no dependen de ningún recurso externo y, por lo tanto, se ejecutan muy rápido) y pruebas de integración (que dependen de recursos externos y, por lo tanto, se ejecutan más lentamente). Entonces, quiero poder controlar si incluir o no las pruebas de integración cuando digo go test
.
La técnica más sencilla parece ser definir una bandera -integrate en main:
var runIntegrationTests = flag.Bool("integration", false
, "Run the integration tests (in addition to the unit tests)")
Y luego, para agregar una declaración if en la parte superior de cada prueba de integración:
if !*runIntegrationTests {
this.T().Skip("To run this test, use: go test -integration")
}
¿Es esto lo mejor que puedo hacer? Busqué en la documentación de Testify para ver si tal vez hay una convención de nomenclatura o algo que logre esto para mí, pero no encontré nada. ¿Me estoy perdiendo de algo?
fuente
var integration = flag.Bool("integration", true, "Enable integration testing.")
fuera de una función, la variable se mostrará en el alcance del paquete y la bandera funcionará correctamenteRespuestas:
@ Ainar-G sugiere varios patrones excelentes para separar las pruebas.
Este conjunto de prácticas de Go de SoundCloud recomienda utilizar etiquetas de compilación ( descritas en la sección "Restricciones de compilación" del paquete de compilación ) para seleccionar qué pruebas ejecutar:
Como una opción similar, también puede hacer que las pruebas de integración se ejecuten de forma predeterminada utilizando una condición de compilación
// +build !unit
y luego deshabilitarlas bajo demanda ejecutándolasgo test -tags=unit
.@adamc comenta:
Para cualquier otra persona que intente usar etiquetas de compilación, es importante que el
// +build test
comentario sea la primera línea de su archivo y que incluya una línea en blanco después del comentario; de lo contrario, el-tags
comando ignorará la directiva.Además, la etiqueta utilizada en el comentario de la compilación no puede tener un guión, aunque se permiten guiones bajos. Por ejemplo,
// +build unit-tests
no funcionará, mientras que// +build unit_tests
sí.fuente
// + build unit
pruebas unitarias y usar -tag unit para ejecutar las pruebas// +build
comentario de prueba sea la primera línea de su archivo y que incluya una línea en blanco después del comentario; de lo contrario, el-tags
comando ignorará la directiva. Además, la etiqueta utilizada en el comentario de la compilación no puede tener un guión, aunque se permiten guiones bajos. Por ejemplo,// +build unit-tests
no funcionará, mientras que// +build unit_tests
sígo test -tags=integration ./...
no funciona, ignora la etiquetaPara ampliar mi comentario a la excelente respuesta de @ Ainar-G, durante el año pasado he estado usando la combinación de
-short
con laIntegration
convención de nomenclatura para lograr lo mejor de ambos mundos.Prueba de unidad e integración armonía, en el mismo archivo
Banderas de construcción previamente me obligó a tener varios archivos (
services_test.go
,services_integration_test.go
, etc.).En su lugar, tome este ejemplo a continuación, donde los dos primeros son pruebas unitarias y tengo una prueba de integración al final:
Observe que la última prueba tiene la convención de:
Integration
en el nombre de la prueba.-short
directiva de bandera.Básicamente, la especificación dice: "escribe todas las pruebas normalmente. Si se trata de una prueba de larga duración o una prueba de integración, sigue esta convención de nomenclatura y verifica
-short
que seas amable con tus compañeros".Ejecute solo pruebas unitarias:
esto le proporciona un buen conjunto de mensajes como:
Ejecute solo pruebas de integración:
Esto ejecuta solo las pruebas de integración. Útil para pruebas de humo en canarios en producción.
Obviamente, la desventaja de este enfoque es que si alguien ejecuta
go test
, sin el-short
indicador, ejecutará de forma predeterminada todas las pruebas: pruebas unitarias y de integración.En realidad, si su proyecto es lo suficientemente grande como para tener pruebas unitarias y de integración, entonces lo más probable es que esté usando un
Makefile
en el que puede tener directivas simples para usargo test -short
en él. O simplemente póngalo en suREADME.md
archivo y termine el día.fuente
import
probar mi paquete, lo que termina mostrándome cómo se ve mi API para los demás. Luego sigo con cualquier lógica restante que deba cubrirse como nombres de paquetes de prueba internos.package services
contiene un sute de prueba de integración, por lo que para probar la API del paquete como una caja negra, deberíamos nombrarlo de otra manerapackage services_integration_test
, no nos dará la oportunidad de trabajar con estructuras internas. Por lo tanto, el paquete para las pruebas unitarias (acceso a los componentes internos) debe nombrarsepackage services
. ¿Es tan?Veo tres posibles soluciones. La primera es utilizar el modo corto para pruebas unitarias. Por lo tanto, usaría
go test -short
con pruebas unitarias y lo mismo pero sin la-short
bandera para ejecutar sus pruebas de integración también. La biblioteca estándar usa el modo corto para omitir las pruebas de ejecución prolongada o hacer que se ejecuten más rápido al proporcionar datos más simples.El segundo es usar una convención y llamar a sus pruebas
TestUnitFoo
oTestIntegrationFoo
y luego usar la-run
marca de prueba para indicar qué pruebas ejecutar. Por lo que lo usaríago test -run 'Unit'
para pruebas unitarias ygo test -run 'Integration'
para pruebas de integración.La tercera opción es usar una variable de entorno y obtenerla en la configuración de sus pruebas con
os.Getenv
. Luego, usaría simplego test
para pruebas unitarias yFOO_TEST_INTEGRATION=true go test
para pruebas de integración.Personalmente, preferiría la
-short
solución ya que es más simple y se usa en la biblioteca estándar, por lo que parece que es una forma de facto de separar / simplificar las pruebas de larga duración. Pero las soluciones-run
yos.Getenv
ofrecen más flexibilidad (también se requiere más precaución, ya que las expresiones regulares están involucradas-run
).fuente
Tester-Go
) comunes a los IDE (Atom, Sublime, etc.) tienen la opción incorporada para ejecutarse con-short
bandera, junto con-coverage
y otros. por lo tanto, utilizo una combinación de Integración en el nombre de la prueba, junto conif testing.Short()
comprobaciones dentro de esas pruebas. me permite tener lo mejor de ambos mundos: ejecutar-short
dentro de IDE y ejecutar explícitamente solo pruebas de integración congo test -run "Integration"
Estaba tratando de encontrar una solución para lo mismo recientemente. Estos fueron mis criterios:
Las soluciones antes mencionadas (bandera personalizada, etiqueta de compilación personalizada, variables de entorno) realmente no cumplían con todos los criterios anteriores, así que después de investigar un poco y jugar, se me ocurrió esta solución:
La implementación es sencilla y mínima. Aunque requiere una convención simple para las pruebas, es menos propenso a errores. Una mejora adicional podría ser exportar el código a una función auxiliar.
Uso
Ejecute pruebas de integración solo en todos los paquetes de un proyecto:
Ejecute todas las pruebas ( regulares e integradas):
Ejecute solo pruebas regulares :
Esta solución funciona bien sin herramientas, pero un Makefile o algunos alias pueden facilitar su uso. También se puede integrar fácilmente en cualquier IDE que admita la ejecución de pruebas go.
El ejemplo completo se puede encontrar aquí: https://github.com/sagikazarmark/modern-go-application
fuente