Passa al contenuto principale

Riferimento API

Riferimento API per l'esecutore batch, l'esecutore di scenari, la configurazione, le asserzioni e i generatori di report di @powerduck/openapi-cli. Le esportazioni elencate di seguito sono disponibili dalla radice del pacchetto.

Panoramica delle esportazioni​

EsportazioneTipoDescrizione
runTestsfunzioneEsegue tutte le operazioni raccolte e restituisce un TestReport
resolveConfigfunzioneRisolve un CliConfig da argomenti, file di configurazione e valori predefiniti
loadSpecfunzione asincronaCarica una specifica da un percorso locale o un URL remoto e ne risolve i riferimenti
isRemoteSpecfunzioneIndica se il percorso della specifica inizia con http(s)://
DEFAULT_CONFIGcostanteValori predefiniti incorporati
runDeclarativeAssertionsfunzioneValuta un array di DeclarativeAssertion rispetto a una risposta
extractAssertionsfunzioneEstrae le asserzioni dichiarative x-tests da un'operazione
extractPostmanScriptsfunzioneEstrae il testo dello script di test Postman da un'operazione
resolveJsonPathfunzioneRisoluzione essenziale di JSONPath (notazione con punti e indici di array)
generateJsonReportfunzioneScrive report.json su disco e ne restituisce il percorso
generateCliReportfunzioneGenera il testo colorato del report CLI senza stamparlo
printCliReportfunzioneStampa il report CLI sullo standard output e restituisce il testo
generateHtmlReportfunzioneScrive report.html su disco e ne restituisce il percorso
CliArgstipoStruttura dell'input per la risoluzione di argomenti CLI e configurazione
DeclarativeAssertiontipoOggetto di una singola asserzione dichiarativa
CliConfigtipoInterfaccia principale di configurazione
TestReporttipoReport completo restituito da runTests
TestResulttipoEsito dei test di un'operazione
TestSummarytipoConteggi aggregati dei test superati e non superati
AssertionResulttipoEsito di un'asserzione
ReportFormattipo"json" | "cli" | "html"
ProtocolNametipo"http" | "sse" | "websocket" | "graphql" | "grpc" | "mcp"
TestStatustipo"passed" | "failed" | "skipped" | "error"
AuthConfigtipoConfigurazione dell'autenticazione
TlsConfigtipoConfigurazione TLS e certificati
FilterConfigtipoFiltro delle operazioni
collectOperationsfunzioneRaccoglie le operazioni applicando il filtro batch
executeStepfunzione asincronaEsegue un'operazione con impostazioni specifiche del passaggio
buildSummaryfunzioneCalcola conteggi e percentuale di successo dai risultati
formatAssertionErrorfunzioneConverte un errore di asserzione in testo leggibile
buildImplicitAssertionsfunzioneCrea le asserzioni predefinite per ciascun protocollo
runScenariofunzione asincronaEsegue passaggi ordinati con variabili condivise e iterazioni basate sui dati
resolveStepsfunzioneRisolve tutti i riferimenti dello scenario prima di inviare richieste
applyExtractsfunzioneEstrae i valori della risposta in variabili di testo
stepReffunzioneNormalizza il riferimento di un passaggio
ScenarioDefinition, ScenarioStep, ScenarioStepRequest, ScenarioExtracttipiDefinizioni degli input e delle estrazioni dello scenario
ScenarioStatus, ScenarioStepResult, ScenarioEvent, ScenarioEventType, ScenarioReport, RunScenarioOptionstipiRisultati, eventi in tempo reale e opzioni di esecuzione dello scenario

runTests​

runTests(config: CliConfig): Promise<TestReport>

Carica la specifica con loadSpec, raccoglie le operazioni rispettando config.filter e le esegue con concorrenza limitata (min(config.concurrency ?? 5, queue.length)). Esegue le asserzioni dichiarative e Postman, aggiunge asserzioni implicite del protocollo quando non sono presenti asserzioni dell'utente, ordina i risultati per percorso e poi per metodo e restituisce un TestReport.

Il TestReport restituito ha questa struttura:

interface TestReport {
summary: TestSummary;
results: TestResult[];
config: CliConfig;
generatedAt: string; // ISO timestamp
version: string; // runner version string
}

resolveConfig​

resolveConfig(args: CliArgs): CliConfig

Unisce args (opzioni CLI), un eventuale file JSON di configurazione (args.config) e DEFAULT_CONFIG. Carica l'envFile risolto, se presente, quindi espande i riferimenti ${ENV_VAR} in serverUrl, proxy, nei valori degli header, in auth.token e nei valori delle variabili. Genera "No OpenAPI spec path provided..." se non viene indicata una specifica e Invalid proxy URL: <url> se proxy non è interpretabile.

CliArgs rispecchia le opzioni CLI:

interface CliArgs {
spec?: string;
server?: string;
output?: string;
format?: string;
method?: string;
path?: string;
tag?: string;
operationId?: string;
concurrency?: number;
timeout?: number;
proxy?: string;
ca?: string;
cert?: string;
key?: string;
insecure?: boolean;
header?: string[];
bearer?: string;
variable?: string[];
config?: string;
env?: string;
failOnError?: boolean;
grpcReflection?: boolean;
grpcProto?: string[];
mcpTransport?: string;
mcpCommand?: string;
mcpArgs?: string;
mcpCwd?: string;
}

loadSpec​

loadSpec(config: CliConfig): Promise<unknown>

Legge config.specPath. Se isRemoteSpec è vero, recupera il contenuto tramite HTTP(S), seguendo fino a 5 reindirizzamenti, applicando config.timeout e inviando User-Agent: @powerduck/openapi-cli; altrimenti legge il file locale. Il contenuto viene interpretato come JSON e deve essere un oggetto contenente un oggetto paths. Tenta quindi di risolvere i riferimenti $ref interni; in caso di errore, lascia la specifica invariata.

isRemoteSpec​

isRemoteSpec(specPath: string): boolean

Restituisce true quando specPath, dopo la rimozione degli spazi iniziali e finali, corrisponde a /^https?:\/\//i.

DEFAULT_CONFIG​

const DEFAULT_CONFIG = {
outputDir: "./openapi-cli-report",
formats: ["json", "cli", "html"],
concurrency: 5,
timeout: 30000,
failOnError: true,
grpcReflection: true,
mcpTransport: "streamable-http",
};

Motore delle asserzioni​

runDeclarativeAssertions​

runDeclarativeAssertions(
assertions: DeclarativeAssertion[],
ctx: { status?: number; headers?: Record<string,string>; body?: unknown; bodyText?: string; durationMs: number },
): AssertionResult[]

Valuta ogni asserzione dichiarativa nel contesto di una risposta. Gli errori di valutazione vengono registrati come un AssertionResult non superato.

extractAssertions​

extractAssertions(operation: any, pathItem?: any): DeclarativeAssertion[]

Raccoglie gli array x-tests dall'elemento del percorso e dall'operazione, in quest'ordine, mantenendo solo gli oggetti con entrambi i campi name e assert.

extractPostmanScripts​

extractPostmanScripts(operation: any): string | undefined

Restituisce il testo in operation["x-postman-scripts"].test, se presente.

resolveJsonPath​

resolveJsonPath(obj: unknown, path: string): unknown

Risoluzione essenziale con supporto per il prefisso $. o $, la notazione con punti e gli indici numerici degli array, ad esempio $.data.items[0].id. Restituisce undefined se un segmento non esiste.

DeclarativeAssertion​

interface DeclarativeAssertion {
name: string;
assert: "status" | "header" | "bodyContains" | "jsonPath" | "responseTime" | "bodyEquals";
value?: number; // assert=status
key?: string; // assert=header
contains?: string; // assert=header / bodyContains
path?: string; // assert=jsonPath
equals?: unknown; // assert=jsonPath
exists?: boolean; // assert=jsonPath
max?: number; // assert=responseTime
body?: string; // assert=bodyEquals
}

Generatori di report​

generateJsonReport​

generateJsonReport(report: TestReport, outputDir: string): string

Il report può contenere header, corpi delle richieste, variabili e impostazioni di autenticazione; rimuovi i valori sensibili prima di condividerlo o salvarlo.

Crea outputDir ricorsivamente e scrive report.json usando JSON.stringify(report, null, 2). Restituisce il percorso assoluto.

generateCliReport​

generateCliReport(report: TestReport): string

Genera il testo colorato del report CLI con sequenze di escape ANSI: intestazione, riepilogo, barra di avanzamento, righe dei risultati e dettagli delle asserzioni. Non lo stampa.

printCliReport​

printCliReport(report: TestReport): string

Chiama generateCliReport, stampa il risultato con console.log e restituisce il testo.

generateHtmlReport​

generateHtmlReport(report: TestReport, outputDir: string): string

Crea outputDir e scrive un report.html autonomo con riepilogo, barra di avanzamento, pulsanti di filtro, righe espandibili e modalità chiara e scura. Restituisce il percorso del file.

Tipi dei risultati​

TestResult​

interface TestResult {
operationId: string;
path: string;
method: string;
protocol: ProtocolName | string;
status: TestStatus;
durationMs: number;
request?: {
method?: string;
url?: string;
headers?: Record<string, string>;
body?: unknown;
target?: string;
};
response?: {
status?: number;
statusText?: string;
contentType?: string;
sizeBytes?: number;
body?: unknown;
text?: string;
headers?: Record<string, string>;
events?: unknown[];
streaming?: boolean;
};
assertions?: AssertionResult[];
error?: string;
timestamp: string;
}

TestSummary​

interface TestSummary {
total: number;
passed: number;
failed: number;
errors: number;
skipped: number;
durationMs: number;
passRate: number; // rounded to one decimal
}

AssertionResult​

interface AssertionResult {
name: string;
passed: boolean;
error?: string;
}

Esecutore di scenari​

runScenario​

runScenario(definition: ScenarioDefinition, options: RunScenarioOptions): Promise<ScenarioReport>

Esegue i passaggi in ordine con un ambito di variabili condiviso per ogni iterazione. Risolve tutti i riferimenti alle operazioni prima dell'esecuzione e ignora il filtro batch, quindi può utilizzare qualsiasi operazione della specifica. Le variabili iniziali provengono dalla configurazione e dallo scenario; i valori estratti diventano disponibili per i passaggi successivi. stopOnFailure è true per impostazione predefinita. options.signal annulla l'esecuzione e i passaggi rimanenti vengono registrati come saltati; le eccezioni nei listener di onEvent non interrompono l'esecuzione.

Il campo data dello scenario esegue l'intera sequenza con un nuovo ambito per ogni riga. iterations permette di richiedere ulteriori ripetizioni; il conteggio effettivo è il maggiore tra quello dichiarato e il numero di righe, fino a un massimo di 1000. Il campo request.data di un passaggio ripete quel passaggio e solo le estrazioni dell'ultima esecuzione rimangono nell'ambito condiviso.

Tipi degli scenari​

Le dichiarazioni seguenti descrivono gli input e gli output degli scenari. ScenarioDataRow e ScenarioIterations sono strutture ausiliarie riportate per chiarezza; non sono esportazioni denominate dalla radice del pacchetto. Le loro strutture sono accessibili tramite le interfacce pubbliche.

import type { RequestValues } from "@powerduck/openapi-request";

interface ScenarioExtract {
name: string;
from: "body" | "header" | "status";
path?: string;
key?: string;
}

type ScenarioDataRow = Record<string, string>;

interface ScenarioStepRequest {
values?: RequestValues;
serverUrl?: string;
extract?: ScenarioExtract[];
assertions?: DeclarativeAssertion[];
data?: ScenarioDataRow[];
}

interface ScenarioStep {
ref?: string;
method?: string;
path?: string;
name?: string;
request?: ScenarioStepRequest;
skip?: boolean;
}

interface ScenarioDefinition {
name: string;
description?: string;
steps: ScenarioStep[];
variables?: Record<string, string>;
stopOnFailure?: boolean;
data?: ScenarioDataRow[];
iterations?: number;
}

type ScenarioStatus = "passed" | "failed" | "error" | "cancelled";

interface ScenarioStepResult extends TestResult {
index: number;
ref: string;
name?: string;
scenarioIteration?: number;
scenarioIterations?: number;
stepIteration?: number;
stepIterations?: number;
extracted?: Record<string, string>;
variablesAfter?: Record<string, string>;
notRun?: boolean;
notRunReason?: string;
}

type ScenarioEventType =
| "scenario:start"
| "step:start"
| "step:finish"
| "step:skip"
| "scenario:finish"
| "scenario:cancel";

interface ScenarioEvent {
type: ScenarioEventType;
scenario: string;
stepIndex?: number;
step?: ScenarioStepResult;
status?: ScenarioStatus;
message?: string;
scenarioIteration?: number;
scenarioIterations?: number;
stepIteration?: number;
stepIterations?: number;
}

interface ScenarioIterations {
scenarioCount: number;
stepCounts: number[];
}

interface ScenarioReport {
name: string;
description?: string;
status: ScenarioStatus;
summary: TestSummary;
steps: ScenarioStepResult[];
variables: Record<string, string>;
iterations?: ScenarioIterations;
config: CliConfig;
startedAt: string;
durationMs: number;
generatedAt: string;
version: string;
}

interface RunScenarioOptions {
config: CliConfig;
spec?: unknown;
onEvent?: (event: ScenarioEvent) => void;
signal?: AbortSignal;
}

stepRef e resolveSteps​

stepRef(step: ScenarioStep): string
resolveSteps(definition: ScenarioDefinition, operations: OperationInfo[]): ResolvedStep[]

stepRef privilegia method e path espliciti; altrimenti normalizza ref conservando un operationId senza prefisso. resolveSteps restituisce elementi con step, op e il riferimento ref normalizzato; genera un'eccezione se un riferimento non viene trovato, anche nei passaggi saltati.

applyExtracts​

applyExtracts(extracts: ScenarioExtract[] | undefined, response: TestResult["response"]): Record<string, string>

Legge valori del corpo tramite JSONPath, header senza distinzione tra maiuscole e minuscole oppure lo stato della risposta. Omette valori mancanti e null; converte gli altri in testo, serializzando gli oggetti come JSON.

Funzioni ausiliarie dell'esecutore​

Le firme delle funzioni ausiliarie usano tipi che non sono esportazioni denominate dalla radice. Deducili dalle funzioni pubbliche invece di importare file interni:

import { collectOperations, executeStep, resolveSteps } from "@powerduck/openapi-cli";

type OperationInfo = ReturnType<typeof collectOperations>[number];
type StepExecutionOptions = Parameters<typeof executeStep>[2];
type StepExecution = Awaited<ReturnType<typeof executeStep>>;
type ResolvedStep = ReturnType<typeof resolveSteps>[number];

collectOperations​

collectOperations(spec: any, config: CliConfig): OperationInfo[]

Raccoglie operazioni standard e aggiuntive, assegna un operationId di riserva, deduce il protocollo e applica config.filter. Ogni elemento contiene path, method, operation, pathItem, operationId e protocol.

executeStep​

executeStep(client: ReturnType<typeof createClient>, op: OperationInfo, options: StepExecutionOptions): Promise<StepExecution>

Il client proviene da createClient in @powerduck/openapi-request. Le opzioni richiedono config e spec; signal, variables, values, serverUrl ed extraAssertions sono facoltativi. L'output contiene result, la risposta response normalizzata, l'eventuale request e l'ambito di variabili env prodotto dagli script. Gli esecutori batch e di scenari condividono questo flusso di esecuzione.

buildSummary​

buildSummary(results: TestResult[], durationMs: number): TestSummary

Conta i risultati superati, non superati, con errore e saltati. La percentuale di successo è il rapporto tra risultati superati e totale, arrotondato a una cifra decimale; senza risultati, è zero.

formatAssertionError​

formatAssertionError(error: unknown): string | undefined

Ricava un messaggio leggibile da una stringa, un Error o un campo message o msg; come ultima risorsa, serializza il valore. Un input falso in contesto booleano restituisce undefined.

buildImplicitAssertions​

buildImplicitAssertions(protocol: string, response: TestResult["response"]): AssertionResult[]

Crea i controlli elencati in Asserzioni implicite. I protocolli sconosciuti non generano controlli impliciti.

Asserzioni implicite​

Quando un'operazione non definisce né x-tests né uno script Postman, l'esecutore aggiunge un'asserzione implicita specifica del protocollo:

ProtocolloControllo implicito
http, sseLo stato HTTP è 2xx
graphqlLo stato HTTP è 2xx e non è presente un array errors non vuoto al livello principale
grpcIl codice di stato gRPC è 0 (OK)
mcpLa risposta JSON-RPC contiene result e non contiene error
websocketLa connessione ha raggiunto lo stato open senza eventi di errore