KI GeneriertAutomatisiertes Testen von REST-APIs mit PowerShell und Keycloak-Authentifizierung
Veröffentlicht:REST-APIs sind ein zentrales Element moderner Softwarearchitekturen und werden von vielen Anwendungen und Diensten genutzt. Eine robuste und automatisierte Teststrategie stellt sicher, dass APIs erwartungsgemäß funktionieren und Fehler frühzeitig erkannt werden. In diesem Blogbeitrag stellen wir Ihnen ein PowerShell-Skript vor, das speziell für das Testen von REST-APIs entwickelt wurde und die Authentifizierung über Keycloak unterstützt.
Voraussetzungen
Bevor wir ins Detail gehen, sollten Sie sicherstellen, dass Sie die folgenden Voraussetzungen erfüllen:
- PowerShell: Stellen Sie sicher, dass PowerShell auf Ihrem System installiert ist. Ich empfehle Version 7 und neuer.
- ImportExcel-Modul: Dieses Modul wird benötigt, wenn Sie die Testergebnisse in eine Excel-Datei exportieren möchten. Installieren Sie es mit dem Befehl
Install-Module ImportExcel. - JSON-Datei mit Testfällen: Eine Datei namens
api_test.json, die die zu testenden Endpunkte und die erwarteten Ergebnisse enthält.
Das Skript im Detail
Das Skript, das wir Ihnen vorstellen, ermöglicht das automatisierte Testen von REST-APIs und unterstützt die Authentifizierung über Keycloak. Hier ist das vollständige Skript:
```
param (
[switch]$OutputToExcel = $false,
[string]$Username = "",
[string]$Password = "",
[string]$InputFile = "api_test.json",
[string]$BaseUrl = "http://localhost:5000"
)
& Cls
#Install-Module ImportExcel
$baseUri = $BaseUrl
$RequestURL = "https://auth.bla.test/auth/realms/Staging/protocol/openid-connect/token"
$body = @{
grant_type='password'
username=$Username
password=$Password
client_id='frontend'
client_secret='<CLIENT_SECRET_KEY'
scope='openid'
}
# Token Request
$result = Invoke-WebRequest -Method POST -Uri $RequestURL -ContentType "application/x-www-form-urlencoded" -Body $body -Credential $credentials
Write-Output $result.Content
$JWT_TOKEN = ($result.Content | ConvertFrom-Json).access_token
Write-Output $JWT_TOKEN
$GetRequests = Get-Content -Path "api_test.json" | ConvertFrom-Json
if ($GetRequests -eq $null) {
Write-Host "No requests found in the file"
return
}
$output = @()
Write-Host "Running tests for $($GetRequests.evaluationTests.Count) requests"
foreach ($request in $GetRequests.evaluationTests) {
$url = $baseUri + $request.Url
$method = $request.Method
$targetStatus = $request.TargetStatus
$body = $request.Body
$statusCode = 0
$headers = @{}
$headers.Add("Content-Type", "application/json")
if ($request.UseAuth) {
$headers.Add("Authorization", "bearer $JWT_TOKEN")
}
try {
$bodyJSON = $body | ConvertTo-Json
$response = Invoke-RestMethod -Uri $url -Method $method -Body $bodyJSON -Headers $headers -StatusCodeVariable "statusCode" -SkipHttpErrorCheck
$request.Status = $statusCode
if ($statusCode -eq $targetStatus) {
$request | Add-Member -MemberType NoteProperty -Name "Success" -Value $true
$output += $request
Write-Host "$($request.TestName) - Success" -ForegroundColor Green
} else {
$request | Add-Member -MemberType NoteProperty -Name "Success" -Value $false
$output += $request
Write-Host "$($request.TestName) - Failed. Expected $targetStatus but got $($statusCode)" -ForegroundColor Red
if ($request.Manditory) {
#break
}
}
} catch {
Write-Host "$($request.TestName) - Failed. $($error[0].Exception.Message)" -ForegroundColor Red
$request.Status = $statusCode
$request.Error = $error[0].Exception.Message
$request | Add-Member -MemberType NoteProperty -Name "Success" -Value $false
$output += $request
if ($request.Manditory) {
#break
}
}
}
if ($OutputToExcel) {
$output | Export-Excel -Path "output.xlsx" -AutoSize -AutoFilter -FreezeTopRow -BoldTopRow -Show -PivotChartType PieExploded3D -PivotRows TestName -PivotData Success
} else {
$output | Out-GridView
}
```Erklärung des Skripts
Parameter
- OutputToExcel: Ein Schalter, um die Ergebnisse in eine Excel-Datei zu exportieren.
- Username: Der Benutzername für die Keycloak-Authentifizierung.
- Password: Das Passwort für die Keycloak-Authentifizierung.
- InputFile: Die JSON-Datei, die die Testfälle enthält.
- BaseUrl: Die Basis-URL der zu testenden API.
Token-Anfrage
Das Skript sendet eine POST-Anfrage an den Keycloak-Server, um ein JWT-Token zu erhalten, das für die Authentifizierung der API-Anfragen verwendet wird.
Testfälle ausführen
Das Skript liest die Testfälle aus der api_test.json Datei und führt für jeden Testfall die entsprechende API-Anfrage durch. Die Ergebnisse werden mit den erwarteten Ergebnissen verglichen und entsprechend markiert.
Beispiel Konfigurationsdatei
```
{
"evaluationTests": [
{
"TestName":"Ping Check",
"Url": "/ping",
"Method": "GET",
"Status": 0,
"TargetStatus": 200,
"Body": "",
"Error": "",
"Manditory": true,
"UseAuth": false
},
{
"TestName":"Version Check",
"Url": "/version",
"Method": "GET",
"Status": 0,
"TargetStatus": 200,
"Body": "",
"Error": "",
"Manditory": true,
"UseAuth": false
},
{
"TestName":"Get Projects",
"Url": "/projects",
"Method": "GET",
"Status": 0,
"TargetStatus": 200,
"Body": "",
"Error": "",
"Manditory": false,
"UseAuth": true
},
{
"TestName":"Single Project",
"Url": "/projects/1",
"Method": "GET",
"Status": 0,
"TargetStatus": 200,
"Body": "",
"Error": "",
"Manditory": false,
"UseAuth": true
},
{
"TestName":"Create Projects",
"Url": "/projects",
"Method": "POST",
"Status": 0,
"TargetStatus": 201,
"Body": {
"name": "Test",
"system": 1
},
"Error": "",
"Manditory": false,
"UseAuth": true
}
]
}
```Ausgabe
Am Ende werden die Testergebnisse entweder in eine Excel-Datei exportiert oder in einem GridView angezeigt, je nach gesetztem Parameter. Ihr seht genau welche Endpoints funktionieren und ob es irgendwo ein Problem gibt.
Fazit
Dieses PowerShell-Skript bietet eine einfache und effektive Möglichkeit, automatisierte Tests für REST-APIs durchzuführen, einschließlich der Authentifizierung über Keycloak. Es ist flexibel anpassbar und kann leicht in bestehende Testumgebungen integriert werden. Automatisierte Tests helfen, die Qualität und Zuverlässigkeit Ihrer APIs sicherzustellen und ermöglichen es Ihnen, schneller auf Änderungen und potenzielle Fehler zu reagieren. Probieren Sie es aus und passen Sie es nach Ihren Bedürfnissen an!