Si desea ser muy conveniente para probar contra API e integrarlo en CI para verificar cada confirmación, entonces el Boot de primavera es definitivamente la mejor opción.
Escribe un caso de prueba rápidamente
@RunWith (SpringRunner.class) @SpringBoottest (WebEnVironment = SpringBoottest.WebenVironment.random_port) @activeprofiles ({perfiles.env_it}) clase pública DemoPoRoRationTest {@aUtowired Fooservice privado Fooservice; @Test public void test () {System.out.println ("probado"); }}Entre ellos, SpringBoottest define algunas configuraciones al ejecutarlo. El código anterior utiliza puertos aleatorios y, por supuesto, también puede predefinir puertos, como este
@SpringBoottest (webEnvironment = springboottest.webenvironment.defined_port, propiedades = {"server.port = 9990"})ActiveProfiles forzan el uso de su perfil. A partir de la mejor práctica, las direcciones de bases de datos u otros componentes de recursos configurados por el perfil de TI deben aislarse del entorno de desarrollo o estadificación. Porque cuando se ejecuta en muchas situaciones, necesitamos borrar los datos de la prueba.
Puede encontrar que dicho caso se puede inyectar con automáticamente en cualquier servicio deseado. Esto se debe a que Spring carga todo el contexto, que es el mismo que el entorno de ejecución real, incluida la base de datos, el caché y otros componentes. Si siente que no necesita todos los recursos durante las pruebas, puede eliminar la configuración correspondiente en el perfil. Este es un entorno operativo completo, la única diferencia es que se cerrará automáticamente después de que se complete el caso de uso.
Prueba una API REST
Recomiendo encarecidamente una biblioteca para agregar a Gradle
TestCompile 'Io.Rest-Assured: Assured: 3.0.3'
Apoya a JSONPATH, que es muy útil. Haga clic aquí para ver documentos específicos
@Sql (scripts = "/testdata/users.sql")@testpublic void test001login () {string username =" [email protected] "; Cadena contraseña = "demo"; JwtauthenticationRequest solicitud = new JwtauthenticationRequest (nombre de usuario, contraseña); Respuesta respuesta = dada (). ContentType (contentType.json) .Body (request) .When (). Post ("/Auth/Login"). Entonces () .Statuscode (httpstatus.ok.value ()) .extract () .Response (); afirmar que (respuesta.path ("token"), es (isnull.notnullValue ())); afirmar que (respuesta.path ("expiración"), es (isnull.notnullValue ()));} @SQL se usa para realizar datos de prueba de inserción SQL antes de la prueba. Tenga en cuenta que given().body() se pasa en un objeto Java JWTAuthenticationRequest, porque la seguridad de REST lo ayudará automáticamente a usar Jackson para serializar el objeto en una cadena JSON. Por supuesto, también puedes poner el JSON convertido en el cuerpo, el efecto es el mismo.
El resultado de retorno se ve atrapado por una respuesta, y luego los datos se pueden obtener utilizando JSONPATH para la verificación. Por supuesto, hay otra forma más intuitiva, que puede obtener la respuesta completa a través de la respuesta.
En este punto, lo más básico se completa. Agregar una prueba de Gradle de paso a Jenkins puede lograr pruebas cada vez que se envía el código.
Algunas situaciones complicadas
Datos mixtos
Este es el más fácil de suceder. Un proyecto tiene muchos desarrolladores, y cada desarrollador escribirá su propio caso de TI, entonces, ¿qué pasa si hay un impacto entre los datos? Es fácil de entender. Por ejemplo, en un escenario en el que escribe un lote de prueba, el método de verificación final es ver si la cantidad de datos escritos es de 10,000 líneas. Luego, otro Dev escribió otros casos y agregó un nuevo datos a esta tabla, que se convirtió en filas 10W+1, por lo que el caso escrito en lotes no podría escapar.
Para evitar esta situación, usamos cada clase de prueba para borrar los datos. Dado que es una operación basada en clase, puede escribir una clase base para resolverla.
@RunWith (SpringRunner.class) @SpringBoottest (WebEnvironment = SpringBoottest.WebenVironment.random_port) @activeProfiles ({perfiles.env_it}) public abstract ClassInteNregationTest {JDBCTPLACE estático privado JDBCTPLACE; @AUtoWired public void setDataSource (DataSource DataSource) {JDBCTEMPLATE = new JDBCTemplate (DataSource); } @Value ("$ {local.server.port}") protegido int Port; @Bebore public void setUpenv () {bestssured.port = port; BRANTESSURADO.BASEPATH = "/API"; BRESTAESSURSED.BASEURI = "http: // localhost"; BRESTAESSURSED.Config = Bestassured.Config (). HttpClient (httpClientConfig.httpClientConfig (). HttpMultipartMode (httpmultipartmode.browser_compatible)); } public void Toatdownenv () {ded (). ContentType (contentType.json) .When (). Post ("/Auth/Logout"); } @AfterClass public static void cleanDB () lanza SQLException {Resource Resource = new ClassPathResource ("/testData/CleanDB.SQL"); Conexión conexión = jdbctemplate.getDataSource (). GetConnection (); ScriptUtils.executesqlscript (conexión, recurso); Connection.Close (); }}@AfterClass usa JDBCTemplate para ejecutar un CleanDB.SQL, que borra todos los datos de prueba de esta manera.
@ Value("${local.server.port}") también debe mencionarse, porque el puerto es aleatorio, el descanso no sabe a qué puerto se envía la solicitud. Aquí, use @Value para obtener el número de puerto actual y configúrelo en Backssured.port para resolver este problema.
Cómo procesar datos compartidos
Ejecutar un completo puede requerir docenas de clases y cientos de métodos. Entonces, ¿qué pasa si se requieren algunos datos para todos los casos y debe eliminarse solo después de que se hayan ejecutado todos los casos? En otras palabras, este tipo de limpieza de datos no se basa en la clase, sino en una ejecución a la vez. Por ejemplo, datos de usuario iniciales, biblioteca de la ciudad, etc.
Jugamos un truco inteligente y usamos Flyway
@Configuration@ConditionAlonClass ({DataSource.class}) Clase pública UpgradeAutoconfiguration {public static final String Flyway = "Flyway"; @Bean (name = flyway) @profile ({env_it}) Public UpdateDeService CleanandUpgradeService (DataSource DataSource) {UpdateDeService UpdateDeService = new FlywayUpgradeService (DataSource); intente {UpdateDeService.CleanandUpgrade (); } catch (Exception Ex) {logger.error ("Flyway fallido!", Ex); } return UpdateDeService; }} Puede ver que cuando el perfil es, Flyway dejará caer todas las tablas y ejecutará el script de actualización a su vez, creando así una tabla de datos completa, que por supuesto está vacía. En la ruta de prueba del proyecto, agregue una gran versión de SQL, para que Flyway pueda insertar datos de prueba comunes al final, como src/test/resources/db/migration/V999.0.1__Insert_Users.sql , resuelve perfectamente varios problemas de datos.
resumen
El uso del servicio de prueba incorporado en Spring Boot puede verificar rápidamente la API. No tengo que comenzar el servicio y luego hacer clic en la página manual para probar mi API. Me comunico directamente con mis colegas frontales el formato de solicitud y escribo un caso para verificarlo.
Por supuesto, también existe una desventaja de este método, que es que es inconveniente probar el sistema. Anteriormente, los casos de prueba API de la compañía fueron escritos por JMeter, que sería mucho más conveniente al hacer pruebas de rendimiento.