CMI-LoadTests
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 } }
Rider
In Rider kann das Schema unter diesem Pfad konfiguriert werden:
Settings
-> Languages & Frameworks
-> Schemas and DTDs
-> JSON Schema Mappings
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