API Days Australia - Automatic Testing of (RESTful) API Documentation

28
Automatic testing of (RESTful) API documentation API Days Australia, February 2017 By Rouven Weßling ( ) Ecosystem Developer / Developer Evangelist, Contentful @RouvenWessling photo credit: by Sydney Harbour Bridge, Australia Lenny K Photography (CC-BY)

Transcript of API Days Australia - Automatic Testing of (RESTful) API Documentation

Page 1: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Automatic testing of(RESTful) API documentation

API Days Australia, February 2017

By Rouven Weßling ( )Ecosystem Developer / Developer Evangelist, Contentful

@RouvenWessling

photo credit: by Sydney Harbour Bridge, Australia Lenny K Photography (CC-BY)

Page 2: API Days Australia  - Automatic Testing of (RESTful) API Documentation

A content management developer platform with an API at its core.

Page 3: API Days Australia  - Automatic Testing of (RESTful) API Documentation
Page 4: API Days Australia  - Automatic Testing of (RESTful) API Documentation

What do you do?

Page 5: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Powered by

Page 6: API Days Australia  - Automatic Testing of (RESTful) API Documentation

A new look.

Page 7: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Documentation will be wrong

Page 8: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Users hate that

Page 9: API Days Australia  - Automatic Testing of (RESTful) API Documentation

It's all in the spec

api blueprintA powerful high-level API description language for web APIs.

Page 10: API Days Australia  - Automatic Testing of (RESTful) API Documentation

## Questions Collection [/questions]

### Create a New Question [POST]

You may create your own question using this action. It takes a JSON object containing a question and a collection of answers in the form of choices.

+ Request (application/json) { "question": "Favourite programming language?", "choices": [ "Swift", "Python", "Objective-C", "Ruby" ] }

+ Response 201 (application/json) + Headers Location: /questions/2 + Body { "question": "Favourite programming language?", "published_at": "2015-08-05T08:40:51.620Z", "choices": [ { "choice": "Swift",

Page 11: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Let's get testing

DREDDNo more outdated API documentation.

Page 12: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Testing read-onlynode_modules/.bin/dredd cma.apib https://api.contentful.com \ -m GET

Page 13: API Days Australia  - Automatic Testing of (RESTful) API Documentation
Page 14: API Days Australia  - Automatic Testing of (RESTful) API Documentation
Page 15: API Days Australia  - Automatic Testing of (RESTful) API Documentation

HooksbeforeAll called at the beginning of the whole test run

beforeEach called before each HTTP transaction

before called before some specific HTTP transaction

beforeEachValidation called before each HTTP transaction is validated

beforeValidation called before some specific HTTP transaction is validated

after called a�er some specific HTTP transaction regardless its result

afterEach called a�er each HTTP transaction

afterAll called a�er whole test run

Page 16: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Hooksnode_modules/.bin/dredd cma.apib https://api.contentful.com \ --hookfiles=./test-hooks.js \ -m GET

Page 17: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Skipping Testsvar hooks = require('hooks');

hooks.before( "Webhook calls > Webhook call details > Get the webhook call details", function (transaction) { transaction.skip = true; });

Page 18: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Mutating datavar hooks = require('hooks');

hooks.before( "Entries > Delete an Entry", function (transaction) { client.createEntry(entry, "1234") });

Page 19: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Rate limitingvar hooks = require('hooks'); const DELAY = 1000/6.0;

hooks.afterEach(function(transaction, done) { setTimeout(done, DELAY); });

Page 20: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Changing request datavar hooks = require('hooks');

hooks.beforeEach(function (transaction, done) { transaction.fullPath = transaction.fullPath.replace('fp91oelsziea', 'gbkxklvmolc1');

done(); });

Page 21: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Chai assertionsvar hooks = require('hooks'); var assert = require('chai').assert;

hooks.afterEach(function(transaction, done) { if (!transaction.skip) { assert.match(transaction.real.headers['x-contentful-request-id'], /^content-api:[a-zA-Z0-9]{22}$/ }

done(); });

Page 22: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Security �

Page 23: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Censor private datavar hooks = require('hooks'); const SECRET_HEADERS = ['Authorization'].map(header => header.toLowerCase());

hooks.afterEachValidation(function(transaction, done) { Object.keys(transaction.request.headers).forEach(function(key) { if (SECRET_HEADERS.indexOf(key.toLowerCase()) > -1) { transaction.request.headers[key] = "***HIDDEN SECRET DATA***"; } });

done(); });

Page 24: API Days Australia  - Automatic Testing of (RESTful) API Documentation

CI the beast

Page 25: API Days Australia  - Automatic Testing of (RESTful) API Documentation
Page 26: API Days Australia  - Automatic Testing of (RESTful) API Documentation

ConclusionBase your documentation on an API specTest that specMake it part of your CIDon't substitute your integration tests

Page 27: API Days Australia  - Automatic Testing of (RESTful) API Documentation

Slides available on Slideshare: http://www.slideshare.net/rwessling/

Follow me on Twitter: @RouvenWessling

Page 28: API Days Australia  - Automatic Testing of (RESTful) API Documentation

MeetupThursday, March 2, 2017

7:00 pmPivotal Labs, Level 11, 155 Clarence Street, Sydney

https://www.meetup.com/Contentful-User-Meetup-Sydney/events/237520492/