API Testing in Your CI Pipeline
Total Page:16
File Type:pdf, Size:1020Kb
API Testing in your CI Pipeline [email protected] www.container-solutions.com Jason Smith Senior Engineer Container Solutions @jasonrichardsmi @containersoluti The Three Things ● Specifications ● Testing your API ● Mocking your API www.container-solutions.com [email protected] The Three Things ● Specifications ● Testing your API ● Mocking your API www.container-solutions.com [email protected] 19 Nov 1863 www.container-solutions.com [email protected] Now www.container-solutions.com [email protected] IDL (Interface Description Language) J. R. Nestor W. A. Wulf D. A. Lamb August 1981 Carnegie-Mellon University Computer Science Department www.container-solutions.com [email protected] IDL (Interface Description Language) In order to work together harmoniously, ... programs ... must have a precise and compatible definition of the data structures they use to communicate with each other. www.container-solutions.com [email protected] IDL (Interface Description Language) ● Precision ● Representation Independence ● Language Independence ● Maintainability ● Communication Form www.container-solutions.com [email protected] SOAP WSDL www.container-solutions.com [email protected] REST Tony Tam recounts the history of Swagger and the Open API Initiative www.container-solutions.com [email protected] REST Not standardized... www.container-solutions.com [email protected] OpenAPI Specification Formerly Swagger Open API Initiative(Linux Foundation) www.container-solutions.com [email protected] Other Major Players API Blueprint RAML www.container-solutions.com [email protected] YAML! www.container-solutions.com [email protected] So many tools sswagger-js lua-Spore Mojolicious::Plugin::Swagger2 bootprint-swagger swagger-jack swagger-ui NSwag cakephp-swagger Dredd hapi-swagger swagger-tools Swashbuckle Swagger-PHP ember-swagger-ui Swagger Validation swagger-editor Swashbuckle.AspNetCore SwaggerAssertions generator-openapi-repo swagger-node-client swagger-core AutoRest php-swaggerize-fastroute-library intellij-swagger ratify swagger-parser SwaggerProvider SwaggerGen linter-swagger swagger-express swagger-codegen NSwag Jane OpenAPI ReDoc NelmioApiDocBundle swagger-node QSwag gossi/swagger swagger-commander Restler validator-badge SwaggerWcf calcinai/strut swagger-confluence swagger-assert ring-swagger Nancy.Swagger falsy swagger-diff Swaggervel compojure-api a127 pyramid-swagger swagger.ed django-rest-swagger fnhouse-swagger api-spec-converter flask-restplus SwagDefGen django-tastypie-swagger pedestal-swagger blueoak-server pyswagger vscode-apielements flask-restful-swagger swagger1st express-openapi flex ember-swagger-ui swagger-docs Friboo fleek-parser Flasgger commandcar source2swagger swagger-sdk fleek-response flask-swagger SwagGen swagger_engine cbSwagger fleek-router bravado swagger-mock-validator Scalatra swaggerize fleek-validator bravado-core Spectacle spray-swagger cowboy-swagger fury-adapter-swagger swagger-spec-validator octohipster Api-doc PhoenixSwagger generator-swaggerize swagger-py-codegen swagger-docs-cfml gform-admin go-swagger got-swag Connexion swagger swagger-cli-client goa hapi-swaggered pecan-swagger go-restful Swagger2Postman grpc-gateway hippie-swagger swagger-parser Sashay swagger2 oas-nodegen swagger-tester beego servant-swagger pokemock swagger-aggregator Swagger spec generator assertj-swagger sails-swagger swagger-stub restapidoc binder-swagger-java serverless_swagger bottle-swagger swaggydoc dropwizard-swagger swagger-jsdoc prance swagger4spring-web elide swagger-mongodb Apivore swagger-jaxrs-doclet jooby-swagger swagger-tools grape-swagger swaggerj4 restlet-framework swaggerize-express swagger-blocks swaggerapi springfox swaggerize-hapi swagger_engine swagger-validator swagger-codegen-maven-plugin swagmock svelte swagger-ajax-client swagger2markup Swagger Express Middleware rspec-rails-swagger swagger-angular-client swagger2markup-gradle-plugin Swagger Parser rswag swagger-client-generator swagger-maven-plugin test2doc.js sbt-swagger-codegen swagger-validate swagger-codegen-gradle-plugin koa-joi-swagger play-swagger ServiceStack swagger-request-validator Raisin Fintrospect fubumvc-swagger Swagger Parser Swagger2 SwagGen dotswaggen Jester - Jolie rEST routER Swagger2::Client APIs.guru Swagger Framework www.container-solutions.com [email protected] The Repo https://github.com/ContainerSolutions/DreddDemo www.container-solutions.com [email protected] + = https://github.com/ContainerSolutions/DreddDemo www.container-solutions.com [email protected] The API Swagger Editor Swagger UI https://github.com/ContainerSolutions/DreddDemo www.container-solutions.com [email protected] Simple Server Go (Gorilla Mux) Special Handlers https://github.com/ContainerSolutions/DreddDemo www.container-solutions.com [email protected] Special Handlers authMiddleware NopeHandler https://github.com/ContainerSolutions/DreddDemo www.container-solutions.com [email protected] The Three Things ● Specifications ● Testing your API ● Mocking your API www.container-solutions.com [email protected] Dredd https://github.com/apiaryio/dredd “Dredd reads your API description and step by step validates whether your API implementation replies with responses as they are described in the documentation.” www.container-solutions.com [email protected] Dredd dry-run: null hookfiles: dredd/hooks.js language: nodejs sandbox: false server: ./main dredd.yml server-wait: 2 init: false custom: {} names: false only: [] reporter: [] output: [] header: [] ... www.container-solutions.com [email protected] Dredd Hooks ● POST > /items Requires Auth ● GET > /nope returns error www.container-solutions.com [email protected] Dredd $dredd www.container-solutions.com [email protected] www.container-solutions.com [email protected] Makefile builddredd: @docker build -t dreddtest -f dredd/DockerDredd . dreddtest: builddredd @docker run\ -e "DEMOSHASALT=test_salt"\ dreddtest www.container-solutions.com [email protected] Run the test $make dreddtest www.container-solutions.com [email protected] Circle-CI machine: services: - docker test: override: - make dreddtest www.container-solutions.com [email protected] Travis-CI language: go go: 1.6 services: - docker script: - make dreddtest www.container-solutions.com [email protected] Results https://travis-ci.org/ContainerSolutions/DreddDemo https://circleci.com/gh/ContainerSolutions/DreddDemo https://semaphoreci.com/jasonrichardsmith/dredddemo http://54.72.105.103:8080/job/DreddDemo/ www.container-solutions.com [email protected] The Three Things ● Specifications ● Testing your API ● Mocking your API www.container-solutions.com [email protected] Mocking your api www.container-solutions.com [email protected] Pokemock https://github.com/mobilcom-debitel/pokemock Drakov https://github.com/Aconex/drakov www.container-solutions.com [email protected] www.container-solutions.com [email protected] Pokemock FROM node:7-alpine RUN npm install -g pokemock COPY apispec/spec.yml . COPY pokemock/runpokemock.sh . ENTRYPOINT /bin/sh runpokemock.sh www.container-solutions.com [email protected] Let’s make it public https://sloppy.io/ www.container-solutions.com [email protected] Those tests Badges www.container-solutions.com [email protected] What you get from the start ● A formal contract ● API testing ● A mock for consumer testing www.container-solutions.com [email protected] Thank You! Jason Smith Senior Engineer Container Solutions @jasonrichardsmi.