Skip to content

CMI-LoadTests

Nightlies

Beschreibung

Dieses Repository kontrolliert die CMI Lasttest Umgebung und setzt sich hierbei aus mehreren Komponenten zusammen.

  • Einer Pipeline in .github/workflows/loadtests.yml,
    die die gewählten Testszenarien in der Azure Umgebung laufen lässt
  • Ein CLI, das die Umgebung für die gewählten Testfälle vorbereitet und gleichzeitig als CLient der Tests fungiert.
  • Testfälle im .yml format, die von der CLI ausgeführt werden
    und deren Metriken in eine Datenbank der Azure Umgebung gelogged werden

Implementation der Testfälle

Um einen Test in der LastTestUmgebung zu ergänzen, muss eine neue Datei Mein Neuer Test.yml im Ordner TestCases hinterlegt werden.

Beispiele lassen sich zur Orientierung bereits im Ordner 'TestCases/Samples' finden.

Aufbau

Testfälle werden in der form von Yaml Dateien in den Ordner TestCases abgelegt. In diesen Testfall Dateien wird stets das Verhalten des Webclients oder eine API in bestimmten workflows abgebildet.

Schema einbinden

Zur unterstützung wurde ein Yaml Schema entwickelt, das in die LSP Software eingebunden werden kann.

Neovim/Vscode

In Neovim oder Vscode kann das Schema direkt in der json config hinterlegt werden. Hier am Beispiel yamlls in Neovim.

M.capabilities = vim.lsp.protocol.make_client_capabilities()
M.capabilities.textDocument.completion.completionItem.documentationFormat = 
{ "markdown", "plaintext" }
M.capabilities.textDocument.completion.completionItem.snippetSupport = true
M.capabilities.textDocument.completion.completionItem.preselectSupport = true
M.capabilities.textDocument.completion.completionItem.insertReplaceSupport = true
M.capabilities.textDocument.completion.completionItem.labelDetailsSupport = true
M.capabilities.textDocument.completion.completionItem.deprecatedSupport = true
M.capabilities.textDocument.completion.completionItem.commitCharactersSupport = true
M.capabilities.textDocument.completion.completionItem.tagSupport = 
{ valueSet = { 1 } }
M.capabilities.textDocument.completion.completionItem.resolveSupport =
{ properties = { "documentation", "detail", "additionalTextEdits" } }
M.capabilities.textDocument.foldingRange = 
{ dynamicRegistration = false, lineFoldingOnly = true }
local server = require("lspconfig")
local opts = vim.tbl_deep_extend("force", 
                                 server,
                                 { 
                                    capabilities = M.capabilities
                                 })
local schemas= {}
local is_schemastore_loaded, schemastore = pcall(require, "schemastore")

if is_schemastore_loaded then
  schemas = schemastore.yaml.schemas()
  opts.settings = { yaml = { schemas = schemastore.yaml.schemas() } }
end

schemas["/home/crashdummy/coding/CMI/cmi-loadtests/cmiLoadTestSchema.yml"] = "/home/crashdummy/coding/CMI/cmi-loadtests/TestCases/**/*.yml"
opts.settings = { yaml = { schemas = schemas } }

lsp

Rider

In Rider kann das Schema unter diesem Pfad konfiguriert werden:
Settings -> Languages & Frameworks -> Schemas and DTDs -> JSON Schema Mappings riderlsp

Implementation des Testfalls

Jeder Test folgt folgendem Schema:

name: 'TestFallName ( Sollte nicht verändert werden )'
description: "Optionale Kurzbeschreibung für Metadaten in Grafana/PowerBI"
threshold: 5 <-- Maximale Zeit in Sekunden, die dieser Test benötigen darf
systemsUnderTest: 'CMI Server'
steps:
  - name: Suche nach Geschäft
    type: Search
    typeId: -4711
    fulltext: "16ef078b183542b78740be976758029b"

Für die ermittlung der Payloads kann auf den Webclient zugegriffen werden.
Änderungen an den Stammdaten werden überschrieben.
Sollte hier eine Datengrundlage geschaffen werden, muss dies eingeplant und ein Snapshot gezogen werden.

Besondere Optionen

CanRepeat

Die Option $root:canRepeat ist ein boolean Wert, der besagt,
ob dieser Test innerhalb eines Runs wiederholt ausgeführt werden kann.

Dieser Wert ist standardmässig auf true gesetzt. Innherhalb eines Testlaufs laufen die Tests 4x in Folge, um eine präzisere Metrik zu erhalten.

Dieses Flag muss zwingend auf false gesetzt werden, sollte der Testfall nicht idempotent sein.

Ein gutes Beispiel dafür wäre der AbschliessenCommand.
Ein bereits abgeschlossenes Geschäft kann nicht erneut abgeschlossen werden.

In einer zukünftigen Version wird es eine tearDown instruktion geben,
mittels der sich das Objekt "erholen" kann.

name: "GeschaeftAbschliessen"
description: "Schliesst ein eröffnetes Geschäft ab"
threshold: 10
systemsUnderTest: 'CMI Server'
steps:
  - name: "AbschliessenCommand auf Geschäft -TestGeschaeft- ausführen"
    type: MenuCommand
    body: |
      { Request AbschliessenCommand }

teardown:
  - name: "Geschäft wiedereröffnen"
    type: MenuCommand
    body: |
      { Request WiederEröffnenCommand }

Steps

Als Steps stehen hier folgende Möglichkeiten zur Verfügung