api-regression-detector
The api-regression-detector is a collection of command-line tools intended to be used for API regression testing. It provides functionalities to initialize tables in a database, perform API calls (sending requests and receiving responses), dump modified tables in the database, and compare expected results in the JSON format.
Table of contents:
- Install
- Usage
- db-init
- db-dump
- compare
- call-http
- call-grpc
Install
go install github.com/Jumpaku/api-regression-detector/cmd/call-http@latest
go install github.com/Jumpaku/api-regression-detector/cmd/call-grpc@latest
go install github.com/Jumpaku/api-regression-detector/cmd/compare@latest
go install github.com/Jumpaku/api-regression-detector/cmd/db-init@latest
go install github.com/Jumpaku/api-regression-detector/cmd/db-dump@latest
Usage
db-init
The db-init
initializes tables in the database using JSON data.
db-init <database-driver> <connection-string>
db-init -h | --help
<database-driver>
: Supported database driver name, which can be one of mysql, spanner, sqlite3, or postgres.
<connection-string>
: Connection string corresponding to the database driver.
-h
--help
: Show help.
To initialize tables in the database, db-init
expects JSON data to be provided via stdin. The JSON data should be represented as the following type DBInitInput
:
type DBInitInput = InitTable[];
type InitTable = {
/** name of the table to be initialized */
name: string,
/** rows to be inserted */
rows: Row[]
}
type Row = { [columnName: string]: ColumnValue };
type ColumnValue = boolean | string | number | null
Example JSON data:
[
{
"name": "example_table",
"rows": [
{
"c0": "abc",
"c1": 123,
"c2": true,
"c3": "2022-12-25T00:45:17Z",
"id": 1
},
{
"c0": "",
"c1": 0,
"c2": false,
"c3": "2022-12-24T15:54:17Z",
"id": 2
}
]
},
{
"name": "child_example_table_1",
"rows": [
{
"id": 1,
"example_table_id": 1
}
]
},
{
"name": "child_example_table_2",
"rows": [
{
"id": 2,
"example_table_id": 2
}
]
}
]
Output
Nothing.
db-dump
The db-dump
outputs data within tables in JSON format.
db-dump <database-driver> <connection-string>
db-dump -h | --help
<database-driver>
: Supported database driver name, which can be one of mysql, spanner, sqlite3, or postgres.
<connection-string>
: Connection string corresponding to the database driver.
-h
--help
: Show help.
To output tables in the database, db-dump
expects JSON data to be provided via stdin. The JSON data should be represented as the following type DBDumpInput
:
/** Array of table names to be dumped */
type DBDumpInput = string[];
Example JSON data:
[
"example_table",
"child_example_table_1",
"child_example_table_2"
]
Output
The db-dump
tool outputs the data of rows in the specified tables to stdout as JSON data. The JSON data is represented as the following type DBDumpOutput
:
type DBDumpOutput = { [tableName: string]: Row[] };
type Row = { [columnName: string]: ColumnValue };
type ColumnValue = boolean | string | number | null
Example:
{
"example_table": [
{
"c0": "abc",
"c1": 123,
"c2": true,
"c3": "2022-12-25T00:45:17Z",
"id": 1
},
{
"c0": "",
"c1": 0,
"c2": false,
"c3": "2022-12-24T15:54:17Z",
"id": 2
}
],
"child_example_table_1": [
{
"example_table_id": 1,
"id": 1
}
],
"child_example_table_2": [
{
"example_table_id": 2,
"id": 2
}
]
}
compare
compare
compares two JSON files.
compare [--show-diff] [--no-superset] <expected-json> <actual-json>
compare -h | --help
<expected-json>
: JSON file path of the expected data.
<actual-json>
: JSON file path of the actual data.
--show-diff
: Show the difference (default: false).
--no-superset
: Disallow superset match (default: false).
-h
--help
: Show help.
No specific input is required.
Output
compare
outputs the comparison result of the specified two JSON files to stdout. The result is represented as the following type CompareOutput
:
type CompareOutput =
| "FullMatch" /** two JSON data match exactly */
| "SupersetMatch" /** second JSON data is an extension of first JSON data */
| "NoMatch" /** two JSON data are incompatible exactly */;
With --show-diff
option, compare
outputs difference of specified two JSON data after the result as follows:
NoMatch
|[
| {
| "add": {
| ...skipped 2 object properties...,
+| "c": 3,
+| "d": 4
| }
| },
| {
| "remove": {
-| "a": 1
| }
| },
| {
| "change": {
~| "a": 1 => 2
| }
| }
|]
expected.json
[
{
"add": {
"a": 1,
"b": 2
}
},
{
"remove": {
"a": 1
}
},
{
"change": {
"a": 1
}
}
]
actual.json
[
{
"add": {
"d": 4,
"a": 1,
"b": 2,
"c": 3
}
},
{
"remove": {}
},
{
"change": {
"a": 2
}
}
]
call-http
call-http
calls an HTTP API by sending a JSON request and receiving a JSON response.
call-http <endpoint-url> <http-method>
call-http -h | --help
<endpoint-url>
: The URL of the HTTP endpoint, which may have path parameters enclosed in '[' and ']'.
<http-method>
: One of GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, or PATCH.
-h
--help
: Show help.
call-http
sends an API request provided via stdin in JSON format.
Output
call-http
receives the API response and outputs the response body to stdout in JSON format.
call-grpc
call-grpc
calls a GRPC API by sending a JSON request and receiving a JSON response.
call-grpc <grpc-endpoint> <grpc-full-method>
call-grpc -h | --help
<grpc-endpoint>
: Host and port joined by ':'.
<grpc-full-method>
: Full method in the form 'package.name.ServiceName/MethodName'.
-h
--help
: Show help screen.
call-grpc
sends an API request provided via stdin in JSON format.
Output
call-grpc
receives the API response and outputs the response body to stdout in JSON format.