API-Erweiterungen
Eine API-Erweiterung erweitert eine OpenAPI -Definition mit semantischen Informationen, die die automatische Generierung von Testfällen verbessern sollen. Erweiterungen werden hauptsächlich vom Assistenten AutoTest verwendet, um die nach dem Zufallsprinzip generierten Testfälle zu optimieren, haben aber eine größere Anwendbarkeit.
Eine Erweiterung besteht aus zwei Teilen:
- Ressourcen geben die Schlüsselressourcentypen, die von der API verwaltet werden, und ihre Methoden an.
- Eigenschaften ordnen semantische Kategorien Schemaeigenschaften zu, um das Format der für diese Felder vorgeschlagenen Werte zu beschränken.
Eine Erweiterung ist einem bestimmten OpenAPI -Dokument zugeordnet und verwendet die Notation JSON-Zeiger zum Suchen von Begriffen in dem Dokument.
Ressourcen
Der Abschnitt resources enthält eine Gruppe von Ressourcendefinitionen, wobei jede Definition mindestens Folgendes enthält:
- Ein Name für die Ressource
- Zeiger auf ein Schema des Typs
object, das die Ressource modelliert - Eine Sammlung von Methoden, die für die Ressource ausgeführt werden
Normalerweise gibt eine Ressourcendefinition auch ein Feld innerhalb des Schemas an, in dem eine eindeutige ID für Instanzen dieses Typs gespeichert wird.
Betrachten Sie beispielsweise den folgenden Auszug aus einer API-Erweiterung:
resources:
Book:
schemas:
primary:
json_ptr: '#/definitions/Book'
properties:
id_name: '$.book_id'
operations:
create:
- json_ptr: '#/paths/~1books/post'
retrieve:
- json_ptr: '#/paths/~1books~1{book_id}/get'
- json_ptr: '#/paths/~1books/get'
update:
- json_ptr: '#/paths/~1books~1{book_id}/put'
delete:
- json_ptr: '#/paths/~1books~1{book_id}/delete'
Der Abschnitt resources enthält eine einzelne Ressourcendefinition mit den folgenden Eigenschaften:
- Sie definiert eine Ressource mit dem Namen
Book - Ein Buch wird durch ein Schema mit demselben Namen modelliert, das sich im Dokument OpenAPI unter
definitionsbefindet. - Jedes Buch hat eine Eigenschaft
book_id, die seine eindeutige ID enthält - Im Dokument OpenAPI unter
pathssind Operationen definiert, die Bücher erstellen, abrufen, aktualisieren und löschen.
Die Übereinstimmung zwischen dem Ressourcennamen und dem Schemanamen ist allgemein, aber nicht erforderlich: Ein Ressourcenname kann beliebig sein, solange er innerhalb der API eindeutig ist.
Das eindeutige ID-Feld für ein Buch wird durch eine vereinfachte Form des JSON-Pfadausdrucks identifiziert, der eine Eigenschaft (book_id) innerhalb des primären Schemas lokalisiert.
Operationen (oder Methoden) für eine Ressource werden nach Kategorie gruppiert:
- Erstellen
- Abrufen
- Aktualisieren!
- Löschen
Es können mehrere Operationen in jeder vorhanden sein. In diesem Beispiel gibt es zwei Operationen, die Bücher abrufen: eine, die ein einzelnes Buch nach ID zurückgibt, und eine andere, die eine Liste von Büchern zurückgibt, und dies ist allgemein. Eine andere Definition kann patch sowie (oder anstelle) put unter updateenthalten.
JSON-Zeigerausdrücke in einer Ressourcendefinition verweisen alle implizit auf das zugehörige OpenAPI -Dokument, sodass das Präfix # eine relative Position innerhalb des Dokuments einführt. Die JSON-Zeigersyntax verwendet die Zeichenfolge ~1 , um für einen Schrägstrich (/) zu stehen, um Verwechslungen mit demselben Zeichen zu vermeiden, das als Trennzeichen verwendet wird, sodass die im OpenAPI -Dokument definierte Operation durch den Begriff definiert wird:
paths:
/books/{book_id}:
get:
wird hier durch den JSON-Zeiger angegeben:
#/paths/~1books~1{book_id}/get
Abhängigkeiten
Eine Ressourcendefinition kann auch eine Abhängigkeit von einem Ressourcentyp zu einem anderen beschreiben.
Zum Beispiel:
Order:
schemas:
primary:
json_ptr: '#/definitions/Order'
properties:
id_name: '$.order_id'
dependencies:
- name: Book
required: true
references:
- name: $.book_id
in: body
dependee_deletion: disabled
- name: Customer
required: true
references:
- name: customer_id
in: path
dependee_deletion: mutual
operations:
create:
- json_ptr: '#/paths/~1customers~1{customer_id}~1orders~1{order_id}/post'
# rest omitted for brevity
Diese Definition besagt, dass die Ressource Order Abhängigkeiten von zwei anderen Ressourcen Customer und Book hat (die in derselben Erweiterung definiert sein müssen).
Beide Abhängigkeiten sind in dem Sinne erforderlich , dass eine Bestellung nur vorhanden sein kann, wenn ein Kunde (zum Aufgeben der Bestellung) und mindestens ein Buch (zum Kauf) vorhanden sind.
Eine Bestellung bezieht sich auf ein vorhandenes Buch über die Eigenschaft book_id im primären Schema und auf einen Kunden über den Pfadparameter customer_id, wie in der Methode create gezeigt (und in anderen Methoden weggelassen).
Ein Kunde ist Eigner einer Gruppe von Bestellungen. Dies ist eine hierarchische Beziehung, die implizit im Pfad enthalten ist:
/customer/{customer_id}/orders/{order_id}
Wenn ein Kunde gelöscht wird, werden auch alle seine Bestellungen gelöscht. Dieses Verhalten wird durch den Wert mutual der Löscheigenschaft angegeben.
Eine andere Beziehung gilt für Bücher: Ein Buch kann erst gelöscht werden, nachdem alle Aufträge, die auf es verweisen, gelöscht wurden. In diesem Fall wird das Löschen als disabled angegeben.
Es gibt drei mögliche Werte für die Eigenschaft dependee_deletion :
enabled: Eine referenzierte Ressource kann gelöscht werden, auch wenn abhängige Ressourcen, die auf sie verweisen, noch vorhanden sind.disabled: Eine referenzierte Ressource kann erst gelöscht werden, wenn alle abhängigen Ressourcen, die auf sie verweisen, gelöscht wurdenmutual: Beim Löschen einer referenzierten Ressource werden alle abhängigen Ressourcen, die auf sie verweisen, gelöscht. Dies ist typisch, wenn das abhängige Objekt dem Referenten gehört oder in diesem enthalten ist.
Reine Ressourcen
Eine reine Ressource ist eine Ressource, die keine Instanzen oder zumindest keine Instanzen hat, die mit eindeutigen IDs verfolgt werden können, und die als Platzhalter für Operationen verwendet wird, die sich nicht wie Ressourcenmethoden verhalten.
Eine reine Ressource unterscheidet sich wie folgt von einer Standardressource:
- Es hat kein ID-Feld (da es keine Instanzen gibt).
- Abhängigkeiten haben keine
dependee_deletion(aus demselben Grund) - Alle Operationen werden unter einer einzelnen
pure-Kategorie gruppiert.
Zum Beispiel:
ServiceAvailability:
schemas:
primary:
json_ptr: '#/definitions/ServiceAvailability'
operations:
pure:
- json_ptr: '#/paths/~1service~1status/get'
ServiceAvailability ist ein Typ, der als Ergebnis einer Servicestatusanforderung zurückgegeben wird, aber keinen eindeutigen persistenten Status hat.
Eigenschaften
Der Abschnitt properties weist Schemaeigenschaften, die in Operationsnutzdaten auftreten, semantische Kategorien zu, um den Wertebereich zu beschränken, der in generierte Anforderungshauptteile interpoliert wird.
Zum Beispiel:
properties:
- json_ptr: '#/definitions/CardPayment'
items:
- name: card_number
semantic: credit_card_number
- name: expiry_date
semantic: expiry
- name: security_code
semantic: cvv
Der JSON-Zeigerausdruck lokalisiert ein Schema mit dem Namen CardPayment im API-Dokument unter definitions. Das Schema muss den Typ object mit mindestens den Eigenschaften card_number, expiry_date und security_code haben, die hier angegeben sind, um eine bestimmte Semantik zu haben, die die automatische Generierung geeigneter Werte leitet, wenn ein CardPayment in Anforderungsnutzdaten auftritt.
Semantische Kategorien müssen aus dem folgenden Satz gezogen werden:
address cvv latitude state_code
age date longitude street
area_code domain minutes temperature
birthday email month time
certificate expiry name timestamp
charset first_name number token
cidr gender paragraph twitter
city geo_location percentage url
color hours phone user_agent
content_encoding humidity phone_number username
content_type iban prefix uuid
coordinates id pressure version
country identity_provider price year
country_code ip_address revision zip_code
credit_card_number language sentence
currency language_code social_security_number
currency_code last_name state
Collection verweist auf ein Schema, das eine Reihe von Ressourcen beschreibt. Es wird in der Regel verwendet, um eine Liste von Ressourcen abzurufen.