Lewati ke konten utama

Referensi API

Referensi API untuk pelaksana batch, pelaksana skenario, konfigurasi, asersi, dan pembuat laporan di @powerduck/openapi-cli. Ekspor berikut tersedia dari akar paket.

Ringkasan ekspor​

EksporJenisDeskripsi
runTestsfungsiMenjalankan semua operasi yang dikumpulkan dan mengembalikan TestReport
resolveConfigfungsiMenyusun CliConfig dari argumen, berkas konfigurasi, dan nilai bawaan
loadSpecfungsi asinkronMemuat spesifikasi dari jalur lokal atau URL jarak jauh dan menyelesaikan referensinya
isRemoteSpecfungsiMemeriksa apakah jalur spesifikasi diawali http(s)://
DEFAULT_CONFIGkonstantaNilai bawaan yang disertakan
runDeclarativeAssertionsfungsiMengevaluasi array DeclarativeAssertion terhadap respons
extractAssertionsfungsiMengambil asersi deklaratif x-tests dari operasi
extractPostmanScriptsfungsiMengambil string skrip pengujian Postman dari operasi
resolveJsonPathfungsiResolver JSONPath sederhana (notasi titik dan indeks array)
generateJsonReportfungsiMenulis report.json ke disk dan mengembalikan jalur berkasnya
generateCliReportfungsiMembuat string laporan CLI berwarna tanpa mencetaknya
printCliReportfungsiMencetak laporan CLI ke keluaran standar dan mengembalikan stringnya
generateHtmlReportfungsiMenulis report.html ke disk dan mengembalikan jalur berkasnya
CliArgstipeStruktur masukan untuk menyelesaikan argumen CLI dan konfigurasi
DeclarativeAssertiontipeObjek satu asersi deklaratif
CliConfigtipeAntarmuka konfigurasi utama
TestReporttipeLaporan lengkap yang dikembalikan runTests
TestResulttipeHasil pengujian satu operasi
TestSummarytipeJumlah keseluruhan pengujian lulus dan gagal
AssertionResulttipeHasil satu asersi
ReportFormattipe"json" | "cli" | "html"
ProtocolNametipe"http" | "sse" | "websocket" | "graphql" | "grpc" | "mcp"
TestStatustipe"passed" | "failed" | "skipped" | "error"
AuthConfigtipeKonfigurasi autentikasi
TlsConfigtipeKonfigurasi TLS dan sertifikat
FilterConfigtipeFilter operasi
collectOperationsfungsiMengumpulkan operasi dengan menerapkan filter batch
executeStepfungsi asinkronMenjalankan satu operasi dengan pengaturan khusus langkah
buildSummaryfungsiMenghitung jumlah dan tingkat kelulusan dari hasil pengujian
formatAssertionErrorfungsiMengubah kesalahan asersi menjadi teks yang mudah dibaca
buildImplicitAssertionsfungsiMembuat asersi bawaan khusus protokol
runScenariofungsi asinkronMenjalankan langkah berurutan dengan variabel bersama dan iterasi berbasis data
resolveStepsfungsiMenyelesaikan semua referensi skenario sebelum mengirim permintaan
applyExtractsfungsiMengekstrak nilai respons ke variabel string
stepReffungsiMenormalkan referensi langkah
ScenarioDefinition, ScenarioStep, ScenarioStepRequest, ScenarioExtracttipeDefinisi masukan dan ekstraksi skenario
ScenarioStatus, ScenarioStepResult, ScenarioEvent, ScenarioEventType, ScenarioReport, RunScenarioOptionstipeHasil skenario, peristiwa langsung, dan opsi eksekusi

runTests​

runTests(config: CliConfig): Promise<TestReport>

Memuat spesifikasi dengan loadSpec, mengumpulkan operasi sesuai config.filter, lalu menjalankannya dengan konkurensi terbatas (min(config.concurrency ?? 5, queue.length)). Menjalankan asersi deklaratif dan Postman, menambahkan asersi implisit protokol jika tidak ada asersi pengguna, mengurutkan hasil menurut jalur lalu metode, dan mengembalikan TestReport.

TestReport yang dikembalikan memiliki struktur berikut:

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

resolveConfig​

resolveConfig(args: CliArgs): CliConfig

Menggabungkan args (opsi CLI), berkas konfigurasi JSON opsional (args.config), dan DEFAULT_CONFIG. Memuat envFile hasil resolusi jika ada, lalu memperluas referensi ${ENV_VAR} pada serverUrl, proxy, nilai header, auth.token, dan nilai variabel. Melempar "No OpenAPI spec path provided..." jika spesifikasi tidak diberikan, serta Invalid proxy URL: <url> jika proxy tidak dapat diurai.

CliArgs sesuai dengan opsi 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>

Membaca config.specPath. Jika isRemoteSpec bernilai benar, mengambil konten melalui HTTP(S), mengikuti hingga 5 pengalihan, menerapkan config.timeout, dan mengirim User-Agent: @powerduck/openapi-cli; jika tidak, membaca berkas lokal. Konten diurai sebagai JSON dan harus berupa objek dengan objek paths. Selanjutnya, fungsi mencoba menyelesaikan $ref internal; jika gagal, spesifikasi dibiarkan tanpa perubahan.

isRemoteSpec​

isRemoteSpec(specPath: string): boolean

Mengembalikan true jika specPath, setelah spasi di awal dan akhir dihapus, cocok dengan /^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",
};

Mesin asersi​

runDeclarativeAssertions​

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

Mengevaluasi setiap asersi deklaratif terhadap konteks respons. Kesalahan evaluasi dicatat sebagai AssertionResult yang gagal.

extractAssertions​

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

Mengumpulkan array x-tests dari item jalur lalu operasi, dengan hanya menyertakan objek yang memiliki name dan assert.

extractPostmanScripts​

extractPostmanScripts(operation: any): string | undefined

Mengembalikan string pada operation["x-postman-scripts"].test, jika ada.

resolveJsonPath​

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

Resolver sederhana yang mendukung awalan $. atau $, notasi titik, dan indeks array numerik, misalnya $.data.items[0].id. Mengembalikan undefined jika suatu segmen tidak ada.

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
}

Pembuat laporan​

generateJsonReport​

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

Laporan dapat berisi header, isi permintaan, variabel, dan pengaturan autentikasi; hapus nilai sensitif sebelum membagikan atau menyimpannya.

Membuat outputDir secara rekursif dan menulis report.json dengan JSON.stringify(report, null, 2). Mengembalikan jalur absolut.

generateCliReport​

generateCliReport(report: TestReport): string

Membuat string laporan CLI berwarna menggunakan urutan escape ANSI: judul, ringkasan, bilah progres, baris hasil, dan detail asersi. String tidak dicetak.

printCliReport​

printCliReport(report: TestReport): string

Memanggil generateCliReport, mencetak hasil dengan console.log, lalu mengembalikan stringnya.

generateHtmlReport​

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

Membuat outputDir dan menulis report.html mandiri yang memuat ringkasan, bilah progres, tombol filter, baris yang dapat diperluas, serta mode terang dan gelap. Mengembalikan jalur berkas.

Tipe hasil​

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;
}

Pelaksana skenario​

runScenario​

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

Menjalankan langkah secara berurutan dengan cakupan variabel bersama untuk setiap iterasi skenario. Semua referensi operasi diselesaikan sebelum eksekusi dan filter batch diabaikan, sehingga operasi mana pun dalam spesifikasi dapat digunakan. Variabel awal berasal dari konfigurasi dan skenario; nilai hasil ekstraksi tersedia bagi langkah berikutnya. Nilai bawaan stopOnFailure adalah true. options.signal membatalkan eksekusi dan langkah yang tersisa dicatat sebagai dilewati; pengecualian dari listener onEvent tidak menghentikan eksekusi.

data pada tingkat skenario menjalankan seluruh rangkaian dengan cakupan baru untuk setiap baris. iterations dapat meminta pengulangan tambahan; jumlah efektif adalah nilai yang lebih besar antara jumlah yang ditetapkan dan jumlah baris, dengan maksimum 1000. request.data pada tingkat langkah mengulang langkah tersebut, dan hanya ekstraksi dari eksekusi terakhir yang dipertahankan dalam cakupan bersama.

Tipe skenario​

Deklarasi berikut menjelaskan masukan dan keluaran skenario. ScenarioDataRow dan ScenarioIterations adalah struktur pendukung yang ditampilkan agar lebih jelas; keduanya bukan ekspor bernama dari akar paket. Strukturnya dapat diakses melalui antarmuka publik.

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 dan resolveSteps​

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

stepRef mengutamakan method dan path eksplisit; jika tidak tersedia, fungsi menormalkan ref sambil mempertahankan operationId tanpa awalan. resolveSteps mengembalikan entri berisi step, op, dan ref yang dinormalkan; fungsi melempar pengecualian jika ada referensi yang tidak ditemukan, termasuk pada langkah yang dilewati.

applyExtracts​

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

Membaca nilai isi melalui JSONPath, header tanpa membedakan huruf besar dan kecil, atau status respons. Nilai yang tidak ada dan null diabaikan; nilai lainnya diubah menjadi string, sedangkan objek diserialisasi sebagai JSON.

Fungsi pembantu pelaksana​

Tanda tangan fungsi pembantu menggunakan tipe pendukung yang bukan ekspor bernama dari akar paket. Inferensikan tipe tersebut dari fungsi publik alih-alih mengimpor berkas internal:

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[]

Mengumpulkan operasi standar dan tambahan, memberikan operationId pengganti jika perlu, menyimpulkan protokol, dan menerapkan config.filter. Setiap entri berisi path, method, operation, pathItem, operationId, dan protocol.

executeStep​

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

client berasal dari createClient di @powerduck/openapi-request. Opsi wajib adalah config dan spec, sedangkan signal, variables, values, serverUrl, dan extraAssertions bersifat opsional. Hasil berisi result, response yang dinormalkan, request opsional, serta cakupan variabel env yang dihasilkan skrip. Pelaksana batch dan skenario menggunakan alur eksekusi yang sama.

buildSummary​

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

Menghitung hasil lulus, gagal, kesalahan, dan dilewati. Tingkat kelulusan adalah jumlah lulus dibagi total, dibulatkan ke satu angka desimal; tanpa hasil, nilainya nol.

formatAssertionError​

formatAssertionError(error: unknown): string | undefined

Mengambil pesan yang mudah dibaca dari string, Error, atau bidang message maupun msg, lalu menggunakan serialisasi sebagai pilihan terakhir. Masukan yang bernilai salah dalam konteks boolean menghasilkan undefined.

buildImplicitAssertions​

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

Membuat pemeriksaan yang tercantum pada Asersi implisit. Protokol yang tidak dikenal tidak menghasilkan pemeriksaan implisit.

Asersi implisit​

Jika operasi tidak mendefinisikan x-tests maupun skrip Postman, pelaksana menambahkan satu asersi implisit khusus protokol:

ProtokolPemeriksaan implisit
http, sseStatus HTTP adalah 2xx
graphqlStatus HTTP 2xx dan tidak ada array errors yang tidak kosong pada tingkat teratas
grpcKode status gRPC adalah 0 (OK)
mcpRespons JSON-RPC memiliki result tanpa error
websocketKoneksi mencapai open tanpa peristiwa kesalahan