Automatisiertes Testen von REST-APIs mit PowerShell und Keycloak-Authentifizierung KI Generiert

Automatisiertes 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:

  1. PowerShell: Stellen Sie sicher, dass PowerShell auf Ihrem System installiert ist. Ich empfehle Version 7 und neuer.
  2. 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.
  3. 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!