got-swag v1.3.0
Got Swag?
A tool to test Swagger-powered APIs automatically through monkey testing.
Also allows for custom tests written directly in Swagger files
or in separate test suites.
Includes command-line and programmatic interfaces.
Install via npm install got-swag -g.
Usage
got-swag <url> ... [-m] [-t <ms>] [-T] [-v] [-w]
Test a Swagger URL or file (YAML). Additional files are merged.
Options:
-m, --monkey Run monkey tests on GET endpoints
-l, --monkey-limit Maximum number of parameter combinations for each
monkey GET, default is 50
-t, --timeout <ms> Set a timeout (in milliseconds) for test step execution,
default is 2000 ms
-T, --trace Trace: Log requests and responses
-V, --version Show version
-w, --watch Watch the Swagger files and rerun tests on changesMost Mocha options are valid. See https://mochajs.org/#usage for details.
Monkey Testing
The most basic usage of got-swag is monkey testing:
Each GET endpoint of a service is validated using minimal variable
input, if any, and the definitions from the services' Swagger file.
The endpoints are requested with random authentication/variable combinations
until one combination leads to a response status code less than 400.
Just invoke got-swag on a URL with the -m switch:
got-swag http://petstore.swagger.io/v2/swagger.json -mSee monkeystore.yaml for an example of input variables.
Custom Tests
Additionally, got-swag allows to embed custom tests in Swagger files
or separate test suites.
The test steps are written in JS using a small domain-specific language.
Every step is evaluated, even if a previous step failed.
For example, see petstore.yaml (embedded) and yoda.yaml (separate).
Test Syntax Reference
Assertions
ok( actual )equal( actual, expected )notEqual( actual, expected )deepEqual( actual, expected )notDeepEqual( actual, expected )strictEqual( actual, expected )notStrictEqual( actual, expected )deepStrictEqual( actual, expected )notDeepStrictEqual( actual, expected )match( actualString, expectedPattern )
Validation
validate( data, schema )- Validate JSON data against a JSON schema
- If
dataorschemaare omitted (strictly equal toundefined), the last response is validated against the current operation's response schema
Requests
request( options )- Requests the current endpoint
optionsis optional, see httpoptions.datasets the request body
- Shortcuts:
get( url, headers )post( url, data, headers )put( url, data, headers )delete( url, headers )options( url, headers )head( url, headers )- Use
nullforurlto request the current endpoint headersare optional
Authentication
auth( securityDefinitionId, credentials, scopes )- Authenticates against a security definition
scopesare optional and inferred from the API if possible
Utility
encodeURIComponent( s )encodes a string for URI transmissionlog( value )logs a valuestringify( value )alias of JSON.stringifyparse( string )alias of JSON.parsebyteLength( string )alias of Buffer.byteLength for computing 'Content-Length' header manuallymonkeyAuth()tries to authenticate using known method/credentialsmonkeyGet()tries to GET using known parameters
Variables
vars: Variables reusable for all tests- You can write to
varsin test steps, see example
- You can write to
req: Last request datares: Last response datares.statusCode: Integer response status coderes.headers: Response headersres.body: String response bodyres.json: Parsed JSON response, if any
api: Complete Swagger API
Extension Syntax
You can define extension Swagger files on top of existing Swagger files
using the '#/path': value syntax.
For reference, see extended-petstore.yaml.
Programmatic Usage
var gotSwag = require( 'got-swag' );
// test api and report as JSON
gotSwag.test( 'swag.yaml', 'vars.yaml' ).then( function ( report ) {
console.log( report );
} );
// describe mocha tests in current suite
describe( 'My test suite', function () {
gotSwag.describe( 'swag.yaml', 'vars.yaml', { parent: this } );
} );Notes
- Currently,
got-swagonly supports JSON - The DSL is sandboxed using vm
- If you see something like
.../node_modules/got-swag/lib/validate.js:24 throw new Error( result.errors );in your console, it's a Node.js Bug