Frontend Testanforderungen: UI-Komponenten
Version: 1.0 | Stand: 30. Dezember 2025
Übersicht
Dieses Dokument beschreibt Tests für ALLE interaktiven UI-Komponenten in LLARS.
Komponenten: 20+ Custom LLARS | 45+ Vuetify | 100+ Tooltips | 10 Dialoge
Datei: llars-frontend/src/components/common/LBtn.vue
Varianten
| ID |
Test |
Erwartung |
Art |
| BTN-V01 |
variant="primary" |
Grüner Hintergrund (#b0ca97) |
Visual |
| BTN-V02 |
variant="secondary" |
Beige Hintergrund (#D1BC8A) |
Visual |
| BTN-V03 |
variant="accent" |
Teal Hintergrund (#88c4c8) |
Visual |
| BTN-V04 |
variant="success" |
Mint Hintergrund (#98d4bb) |
Visual |
| BTN-V05 |
variant="warning" |
Gold Hintergrund (#e8c87a) |
Visual |
| BTN-V06 |
variant="danger" |
Coral Hintergrund (#e8a087) |
Visual |
| BTN-V07 |
variant="cancel" |
Grauer Hintergrund (#9e9e9e) |
Visual |
| BTN-V08 |
variant="text" |
Transparenter Hintergrund |
Visual |
| BTN-V09 |
variant="tonal" |
Leichter Hintergrund |
Visual |
| BTN-V10 |
variant="outlined" |
Border ohne Fill |
Visual |
Größen
| ID |
Test |
Erwartung |
Art |
| BTN-S01 |
size="small" |
Kleinere Höhe/Padding |
Visual |
| BTN-S02 |
size="default" |
Standard Größe |
Visual |
| BTN-S03 |
size="large" |
Größere Höhe/Padding |
Visual |
Icons
| ID |
Test |
Erwartung |
Art |
| BTN-I01 |
prepend-icon="mdi-plus" |
Icon links vor Text |
Visual |
| BTN-I02 |
append-icon="mdi-arrow-right" |
Icon rechts nach Text |
Visual |
| BTN-I03 |
Nur Icon (kein Text) |
Icon zentriert |
Visual |
States
| ID |
Test |
Erwartung |
Art |
| BTN-ST01 |
loading=true |
Spinner anstatt Content |
E2E |
| BTN-ST02 |
disabled=true |
Ausgegraut, nicht klickbar |
E2E |
| BTN-ST03 |
block=true |
Volle Breite |
Visual |
| BTN-ST04 |
Hover |
Brightness +10%, translateY(-1px) |
Visual |
| BTN-ST05 |
Focus |
2px Outline primary |
A11y |
| BTN-ST06 |
Active (gedrückt) |
Scale(0.98) |
Visual |
| ID |
Test |
Erwartung |
Art |
| BTN-T01 |
tooltip="Hilfe" |
Tooltip bei Hover |
E2E |
| BTN-T02 |
tooltipLocation="top" |
Tooltip oben |
E2E |
| BTN-T03 |
tooltipLocation="bottom" |
Tooltip unten |
E2E |
| BTN-T04 |
tooltipLocation="left" |
Tooltip links |
E2E |
| BTN-T05 |
tooltipLocation="right" |
Tooltip rechts |
E2E |
Events
| ID |
Test |
Erwartung |
Art |
| BTN-E01 |
@click |
Event fired |
Unit |
| BTN-E02 |
@click disabled |
Kein Event |
Unit |
| BTN-E03 |
@click loading |
Kein Event |
Unit |
Datei: llars-frontend/src/components/common/LIconBtn.vue
Varianten
| ID |
Test |
Erwartung |
Art |
| IBTN-V01 |
variant="default" |
Grauer Hintergrund |
Visual |
| IBTN-V02 |
variant="primary" |
Primary Hintergrund |
Visual |
| IBTN-V03 |
variant="danger" |
Danger Hintergrund |
Visual |
| IBTN-V04 |
variant="success" |
Success Hintergrund |
Visual |
| IBTN-V05 |
variant="warning" |
Warning Hintergrund |
Visual |
Größen
| ID |
Test |
Erwartung |
Art |
| IBTN-S01 |
size="x-small" |
20px |
Visual |
| IBTN-S02 |
size="small" |
28px |
Visual |
| IBTN-S03 |
size="default" |
36px |
Visual |
| IBTN-S04 |
size="large" |
44px |
Visual |
| IBTN-S05 |
size="x-large" |
52px |
Visual |
Accessibility
| ID |
Test |
Erwartung |
Art |
| IBTN-A01 |
aria-label von tooltip |
Korrekt gesetzt |
A11y |
| IBTN-A02 |
Keyboard fokussierbar |
Tab erreicht Button |
A11y |
| IBTN-A03 |
Enter/Space aktiviert |
Click-Event |
A11y |
3. LTag (Tag/Chip-Komponente)
Datei: llars-frontend/src/components/common/LTag.vue
Varianten
| ID |
Test |
Erwartung |
Art |
| TAG-V01 |
variant="primary" |
Primary Farbe |
Visual |
| TAG-V02 |
variant="secondary" |
Secondary Farbe |
Visual |
| TAG-V03 |
variant="accent" |
Accent Farbe |
Visual |
| TAG-V04 |
variant="success" |
Success Farbe |
Visual |
| TAG-V05 |
variant="info" |
Info Farbe |
Visual |
| TAG-V06 |
variant="warning" |
Warning Farbe |
Visual |
| TAG-V07 |
variant="danger" |
Danger Farbe |
Visual |
| TAG-V08 |
variant="gray" |
Gray Farbe |
Visual |
Größen
| ID |
Test |
Erwartung |
Art |
| TAG-S01 |
size="sm" |
Klein (20px) |
Visual |
| TAG-S02 |
size="md" |
Medium (24px) |
Visual |
| TAG-S03 |
size="lg" |
Groß (32px) |
Visual |
Features
| ID |
Test |
Erwartung |
Art |
| TAG-F01 |
closable=true |
X-Button sichtbar |
E2E |
| TAG-F02 |
closable @close |
Event fired |
E2E |
| TAG-F03 |
clickable=true |
Pointer Cursor |
E2E |
| TAG-F04 |
clickable @click |
Event fired |
E2E |
| TAG-F05 |
prepend-icon |
Icon links |
Visual |
| TAG-F06 |
append-icon |
Icon rechts |
Visual |
4. LSlider (Gradient-Slider)
Datei: llars-frontend/src/components/common/LSlider.vue
Initialzustand
| ID |
Test |
Erwartung |
Art |
| SLD-I01 |
Initial grau |
Slider grau bis Touch |
E2E |
| SLD-I02 |
startActive=true |
Sofort farbig |
E2E |
| SLD-I03 |
Nach Touch |
Slider wird farbig |
E2E |
Gradient Farben
| ID |
Test |
Erwartung |
Art |
| SLD-G01 |
Wert 0-30% |
Rot (#e8a087) |
Visual |
| SLD-G02 |
Wert 31-70% |
Gelb (#e8c87a) |
Visual |
| SLD-G03 |
Wert 71-100% |
Grün (#98d4bb) |
Visual |
Fixed Color Mode
| ID |
Test |
Erwartung |
Art |
| SLD-F01 |
colorMode="fixed" |
Feste Farbe |
Visual |
| SLD-F02 |
color="primary" |
Primary Farbe |
Visual |
Interaktion
| ID |
Test |
Erwartung |
Art |
| SLD-INT01 |
Drag Thumb |
Wert ändert sich |
E2E |
| SLD-INT02 |
Click auf Track |
Wert springt |
E2E |
| SLD-INT03 |
Keyboard Arrow |
+/- step |
A11y |
| SLD-INT04 |
min/max respektiert |
Wert nicht außerhalb |
E2E |
| SLD-INT05 |
step respektiert |
Korrekte Schritte |
E2E |
Events
| ID |
Test |
Erwartung |
Art |
| SLD-E01 |
@update:modelValue |
Bei jeder Änderung |
Unit |
| SLD-E02 |
@change |
Bei Release |
Unit |
| SLD-E03 |
@touched |
Bei erster Interaktion |
Unit |
Datei: llars-frontend/src/components/common/LTooltip.vue
Positionen
| ID |
Test |
Erwartung |
Art |
| TTP-P01 |
location="top" |
Tooltip oben |
E2E |
| TTP-P02 |
location="bottom" |
Tooltip unten |
E2E |
| TTP-P03 |
location="left" |
Tooltip links |
E2E |
| TTP-P04 |
location="right" |
Tooltip rechts |
E2E |
| TTP-P05 |
location="start" |
Tooltip am Start |
E2E |
| TTP-P06 |
location="end" |
Tooltip am Ende |
E2E |
Timing
| ID |
Test |
Erwartung |
Art |
| TTP-T01 |
openDelay=300 (default) |
300ms Verzögerung |
E2E |
| TTP-T02 |
openDelay=0 |
Sofort sichtbar |
E2E |
| TTP-T03 |
closeDelay=0 (default) |
Sofort ausblenden |
E2E |
| TTP-T04 |
closeDelay=500 |
500ms verzögert |
E2E |
Content
| ID |
Test |
Erwartung |
Art |
| TTP-C01 |
text="Hilfe" |
Text angezeigt |
E2E |
| TTP-C02 |
#content Slot |
Custom HTML |
E2E |
| TTP-C03 |
Langer Text |
Richtig umbrechen |
Visual |
Datei: llars-frontend/src/components/common/LActionGroup.vue
Presets
| ID |
Test |
Erwartung |
Art |
| ACT-P01 |
"view" |
Auge-Icon, Tooltip "Anzeigen" |
E2E |
| ACT-P02 |
"edit" |
Stift-Icon, Tooltip "Bearbeiten" |
E2E |
| ACT-P03 |
"delete" |
Mülleimer-Icon, Danger-Farbe |
E2E |
| ACT-P04 |
"stats" |
Chart-Icon |
E2E |
| ACT-P05 |
"download" |
Download-Icon |
E2E |
| ACT-P06 |
"copy" |
Copy-Icon |
E2E |
| ACT-P07 |
"lock" |
Schloss-Icon |
E2E |
| ACT-P08 |
"unlock" |
Schloss-offen-Icon |
E2E |
| ACT-P09 |
"refresh" |
Refresh-Icon |
E2E |
| ACT-P10 |
"close" |
X-Icon |
E2E |
| ACT-P11 |
"add" |
Plus-Icon, Success-Farbe |
E2E |
| ACT-P12 |
"settings" |
Zahnrad-Icon |
E2E |
| ACT-P13 |
"play" |
Play-Icon |
E2E |
| ACT-P14 |
"pause" |
Pause-Icon |
E2E |
| ACT-P15 |
"stop" |
Stop-Icon |
E2E |
Custom Actions
| ID |
Test |
Erwartung |
Art |
| ACT-C01 |
Custom icon |
Icon angezeigt |
E2E |
| ACT-C02 |
Custom tooltip |
Tooltip angezeigt |
E2E |
| ACT-C03 |
Custom variant |
Farbe korrekt |
E2E |
| ACT-C04 |
loading=true |
Spinner |
E2E |
| ACT-C05 |
disabled=true |
Ausgegraut |
E2E |
Events
| ID |
Test |
Erwartung |
Art |
| ACT-E01 |
@action |
(key, action) emitted |
Unit |
| ACT-E02 |
Action disabled |
Kein Event |
Unit |
7. LCard (Card-Komponente)
Datei: llars-frontend/src/components/common/LCard.vue
| ID |
Test |
Erwartung |
Art |
| CARD-H01 |
title |
Titel angezeigt |
Visual |
| CARD-H02 |
subtitle |
Untertitel angezeigt |
Visual |
| CARD-H03 |
icon |
Avatar mit Icon |
Visual |
| CARD-H04 |
color |
Akzentfarbe (Border-Top) |
Visual |
Status
| ID |
Test |
Erwartung |
Art |
| CARD-S01 |
status="Aktiv" |
Badge angezeigt |
Visual |
| CARD-S02 |
statusVariant="success" |
Grünes Badge |
Visual |
| CARD-S03 |
statusVariant="danger" |
Rotes Badge |
Visual |
Stats
| ID |
Test |
Erwartung |
Art |
| CARD-ST01 |
stats Array |
Stats-Row angezeigt |
Visual |
| CARD-ST02 |
stats.icon |
Icon pro Stat |
Visual |
| CARD-ST03 |
stats.value |
Wert angezeigt |
Visual |
| CARD-ST04 |
stats.label |
Label angezeigt |
Visual |
Interaktion
| ID |
Test |
Erwartung |
Art |
| CARD-I01 |
clickable=true |
Hover-Effekt |
E2E |
| CARD-I02 |
clickable @click |
Event fired |
E2E |
| CARD-I03 |
flat=true |
Kein Schatten |
Visual |
| CARD-I04 |
outlined=true |
Border statt Elevation |
Visual |
8. LTabs (Tab-Navigation)
Datei: llars-frontend/src/components/common/LTabs.vue
Tabs
| ID |
Test |
Erwartung |
Art |
| TABS-T01 |
tabs Array |
Alle Tabs angezeigt |
Visual |
| TABS-T02 |
tab.label |
Label sichtbar |
Visual |
| TABS-T03 |
tab.icon |
Icon sichtbar |
Visual |
| TABS-T04 |
tab.badge |
Badge-Zahl angezeigt |
Visual |
Varianten
| ID |
Test |
Erwartung |
Art |
| TABS-V01 |
variant="filled" (default) |
Gefüllter Hintergrund |
Visual |
| TABS-V02 |
variant="outlined" |
Border ohne Fill |
Visual |
| TABS-V03 |
variant="underlined" |
Unterstreichung |
Visual |
Interaktion
| ID |
Test |
Erwartung |
Art |
| TABS-I01 |
Tab klicken |
v-model aktualisiert |
E2E |
| TABS-I02 |
Aktiver Tab |
Visuell hervorgehoben |
Visual |
| TABS-I03 |
grow=true |
Gleiche Breite |
Visual |
9. LAvatar (Avatar-Komponente)
Datei: llars-frontend/src/components/common/LAvatar.vue
Größen
| ID |
Test |
Erwartung |
Art |
| AVA-S01 |
size="xs" |
24px |
Visual |
| AVA-S02 |
size="sm" |
32px |
Visual |
| AVA-S03 |
size="md" (default) |
40px |
Visual |
| AVA-S04 |
size="lg" |
56px |
Visual |
| AVA-S05 |
size="xl" |
80px |
Visual |
Quellen
| ID |
Test |
Erwartung |
Art |
| AVA-Q01 |
seed="abc" |
DiceBear generiert |
Visual |
| AVA-Q02 |
src="url" |
Custom Image |
Visual |
| AVA-Q03 |
username (fallback) |
Initiale |
Visual |
Varianten
| ID |
Test |
Erwartung |
Art |
| AVA-V01 |
variant="bottts-neutral" |
Robot-Style |
Visual |
| AVA-V02 |
variant="shapes" |
Geometrisch |
Visual |
| AVA-V03 |
variant="fun-emoji" |
Emoji-Style |
Visual |
| AVA-V04 |
variant="identicon" |
Identicon |
Visual |
10. LChart (Chart-Komponente)
Datei: llars-frontend/src/components/common/LChart.vue
Daten
| ID |
Test |
Erwartung |
Art |
| CHART-D01 |
data Array |
Linie gezeichnet |
Visual |
| CHART-D02 |
series Array |
Mehrere Linien |
Visual |
| CHART-D03 |
Leere Daten |
Empty State |
Visual |
Optionen
| ID |
Test |
Erwartung |
Art |
| CHART-O01 |
fill=true |
Gradient-Fill |
Visual |
| CHART-O02 |
grid=true |
Grid-Linien |
Visual |
| CHART-O03 |
smooth=true |
Bezier-Kurven |
Visual |
| CHART-O04 |
title |
Titel angezeigt |
Visual |
| CHART-O05 |
loading=true |
Loading-State |
Visual |
11. LGauge (Metrik-Anzeige)
Datei: llars-frontend/src/components/common/LGauge.vue
Anzeige
| ID |
Test |
Erwartung |
Art |
| GAUGE-A01 |
icon |
Icon angezeigt |
Visual |
| GAUGE-A02 |
label |
Label angezeigt |
Visual |
| GAUGE-A03 |
value |
Wert angezeigt |
Visual |
| GAUGE-A04 |
suffix |
Suffix nach Wert |
Visual |
| GAUGE-A05 |
percent |
Prozent-Bar |
Visual |
Farben
| ID |
Test |
Erwartung |
Art |
| GAUGE-C01 |
colorMode="threshold" |
Auto-Farbe |
Visual |
| GAUGE-C02 |
percent < 60% |
Grün |
Visual |
| GAUGE-C03 |
percent 60-80% |
Gelb |
Visual |
| GAUGE-C04 |
percent > 80% |
Rot |
Visual |
| GAUGE-C05 |
colorMode="fixed" |
Feste Farbe |
Visual |
12. LLoading (Loading-Animation)
Datei: llars-frontend/src/components/common/LLoading.vue
Größen
| ID |
Test |
Erwartung |
Art |
| LOAD-S01 |
size="sm" |
Klein |
Visual |
| LOAD-S02 |
size="md" (default) |
Medium |
Visual |
| LOAD-S03 |
size="lg" |
Groß |
Visual |
Features
| ID |
Test |
Erwartung |
Art |
| LOAD-F01 |
label="Loading..." |
Label angezeigt |
Visual |
| LOAD-F02 |
Animation läuft |
Floating-Effekt |
Visual |
| LOAD-F03 |
prefers-reduced-motion |
Animation reduziert |
A11y |
13. LUserSearch (User-Suche)
Datei: llars-frontend/src/components/common/LUserSearch.vue
Suche
| ID |
Test |
Erwartung |
Art |
| USRCH-S01 |
Tippen |
Debounced API-Call |
E2E |
| USRCH-S02 |
Ergebnisse |
Dropdown angezeigt |
E2E |
| USRCH-S03 |
User auswählen |
v-model aktualisiert |
E2E |
| USRCH-S04 |
Avatar in Liste |
Avatare angezeigt |
Visual |
| ID |
Test |
Erwartung |
Art |
| USRCH-B01 |
showAddButton=true |
Add-Button sichtbar |
E2E |
| USRCH-B02 |
Add klicken |
@add Event |
E2E |
14. LThemeToggle (Theme-Umschalter)
Datei: llars-frontend/src/components/common/LThemeToggle.vue
Optionen
| ID |
Test |
Erwartung |
Art |
| THEME-O01 |
System |
System-Theme aktiv |
E2E |
| THEME-O02 |
Light |
Helles Theme |
E2E |
| THEME-O03 |
Dark |
Dunkles Theme |
E2E |
Interaktion
| ID |
Test |
Erwartung |
Art |
| THEME-I01 |
Menu öffnet |
Optionen sichtbar |
E2E |
| THEME-I02 |
Option wählen |
Theme wechselt |
E2E |
| THEME-I03 |
Checkmark |
Aktive Option markiert |
Visual |
15. Test-Code für Komponenten
// e2e/components/lbtn.spec.ts
import { test, expect } from '@playwright/test'
test.describe('LBtn Component', () => {
test('BTN-V01: primary variant has correct color', async ({ page }) => {
await page.goto('/component-test')
const btn = page.locator('button.l-btn.primary')
await expect(btn).toHaveCSS('background-color', 'rgb(176, 202, 151)')
})
test('BTN-ST01: loading state shows spinner', async ({ page }) => {
await page.goto('/component-test')
const btn = page.locator('button.l-btn[loading]')
await expect(btn.locator('.v-progress-circular')).toBeVisible()
})
test('BTN-ST02: disabled button not clickable', async ({ page }) => {
await page.goto('/component-test')
const btn = page.locator('button.l-btn[disabled]')
await expect(btn).toBeDisabled()
})
test('BTN-T01: tooltip appears on hover', async ({ page }) => {
await page.goto('/component-test')
const btn = page.locator('button.l-btn[data-tooltip="Hilfe"]')
await btn.hover()
await expect(page.locator('.v-tooltip')).toBeVisible()
})
test('BTN-E01: click event fires', async ({ page }) => {
await page.goto('/component-test')
const btn = page.locator('button.l-btn.clickable')
await btn.click()
await expect(page.locator('.click-result')).toHaveText('clicked')
})
})
// vitest/components/LSlider.test.js
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import LSlider from '@/components/common/LSlider.vue'
describe('LSlider', () => {
it('SLD-I01: starts gray when not touched', () => {
const wrapper = mount(LSlider, {
props: { modelValue: 50 }
})
expect(wrapper.classes()).toContain('inactive')
})
it('SLD-G01: low value has red color', async () => {
const wrapper = mount(LSlider, {
props: { modelValue: 20, startActive: true }
})
const color = wrapper.vm.gradientColor
expect(color).toContain('#e8a087')
})
it('SLD-E03: touched event fires on first interaction', async () => {
const wrapper = mount(LSlider, {
props: { modelValue: 50 }
})
await wrapper.find('input').trigger('input')
expect(wrapper.emitted('touched')).toBeTruthy()
})
})
16. Checkliste für manuelle Tests
Slider (LSlider)
Cards (LCard)
Letzte Aktualisierung: 30. Dezember 2025