Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
statnice:bakalar:b4b39iur [2025/05/18 17:58] – zapleka3 | statnice:bakalar:b4b39iur [2025/06/06 21:22] (current) – zapleka3 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== Techniky pro efektivní implementaci uživatelského rozhraní. Příprava uživatelského rozhraní pro testování s/bez uživatele. ==== | + | ====== Techniky pro efektivní implementaci uživatelského rozhraní. Příprava uživatelského rozhraní pro testování s/bez uživatele. |
[[https:// | [[https:// | ||
Line 21: | Line 21: | ||
* **View** – Zobrazuje data z ViewModelu pomocí bindingu, neobsahuje žádnou aplikační logiku. Může být definována v XAML, přičemž `DataContext` odkazuje na odpovídající ViewModel. | * **View** – Zobrazuje data z ViewModelu pomocí bindingu, neobsahuje žádnou aplikační logiku. Může být definována v XAML, přičemž `DataContext` odkazuje na odpovídající ViewModel. | ||
* {{: | * {{: | ||
- | |||
- | MVVM vychází z předchozích vzorů, jako jsou MVC a MVP: | ||
- | |||
- | * **MVC** – Controller zpracovává vstup a mění stav Modelu; View ho pouze zobrazuje. Často dochází k prolínání zodpovědností mezi View a Controllerem. | ||
- | * {{: | ||
- | * **MVP** – Presenter obsluhuje interakci s uživatelem a logiku, View je pasivní. Vhodné pro testovatelnost, | ||
- | * {{: | ||
- | * **MVVM** – ViewModel je zcela oddělený od View. Spojení je dosaženo pomocí *data bindingu* a příkazů, což usnadňuje testování i vývoj. | ||
- | * {{: | ||
=== Klíčové návrhové vzory použité v MVVM === | === Klíčové návrhové vzory použité v MVVM === | ||
Line 35: | Line 26: | ||
* **Observer Pattern** | * **Observer Pattern** | ||
* Definuje *jeden ku mnoha* závislost: když se subjekt (např. Model) změní, informuje všechny zaregistrované pozorovatele (např. ViewModel). Tento vzor pomáhá oddělit Model od View/ | * Definuje *jeden ku mnoha* závislost: když se subjekt (např. Model) změní, informuje všechny zaregistrované pozorovatele (např. ViewModel). Tento vzor pomáhá oddělit Model od View/ | ||
- | * {{: | + | * {{: |
* **Event–Delegate Mechanismus (C# | * **Event–Delegate Mechanismus (C# | ||
Line 112: | Line 103: | ||
**Tlačítko s obrázkem a textem**: | **Tlačítko s obrázkem a textem**: | ||
- | + | < | |
- | ```c | + | ```xaml |
<Button HorizontalAlignment=" | <Button HorizontalAlignment=" | ||
< | < | ||
<Image Source=" | <Image Source=" | ||
- | | + | |
- | </ | + | </ |
- | </ | + | </ |
``` | ``` | ||
+ | </ | ||
- | * **Styl se StaticResource**: | + | **Styl se StaticResource**: |
- | ```xml | + | < |
- | < | + | ```xaml |
+ | < | ||
<Style x: | <Style x: | ||
<Setter Property=" | <Setter Property=" | ||
<Setter Property=" | <Setter Property=" | ||
</ | </ | ||
- | | + | |
+ | <Button Style=" | ||
+ | ``` | ||
+ | </ | ||
- | | + | **Trigger na `IsMouseOver`**: |
- | ``` | + | <markdown> |
+ | ```xaml | ||
+ | <Style TargetType=" | ||
+ | <Style.Triggers> | ||
+ | <Trigger Property="IsMouseOver" | ||
+ | <Setter Property=" | ||
+ | | ||
+ | </ | ||
+ | </ | ||
+ | ``` | ||
+ | </ | ||
- | | + | **Custom seznam s `DataTemplate`**: |
- | ```xml | + | < |
- | <Style TargetType=" | + | ```xaml |
- | <Style.Triggers> | + | < |
- | <Trigger Property="IsMouseOver" | + | < |
- | <Setter Property="Background" | + | <DataTemplate> |
- | </Trigger> | + | <StackPanel> |
- | </Style.Triggers> | + | <TextBlock Text="{Binding Name}"/> |
- | </Style> | + | <TextBlock Text="{Binding Description}"/> |
- | ``` | + | </StackPanel> |
+ | </DataTemplate> | ||
+ | </ | ||
+ | </ListBox> | ||
+ | ``` | ||
+ | </ | ||
- | * **Custom seznam s `DataTemplate`**: | + | **Použití `ContentTemplate` v tlačítku**: |
- | ```xml | + | < |
- | < | + | ```xaml |
- | < | + | < |
- | < | + | < |
- | < | + | < |
- | < | + | < |
- | < | + | <Image Source=" |
- | </ | + | < |
- | </ | + | </ |
- | </ | + | </ |
- | </ | + | </ |
- | ``` | + | </ |
- | + | ``` | |
- | * **Použití `ContentTemplate` v tlačítku**: | + | </ |
- | ```xml | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | <Image Source=" | + | |
- | < | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | ``` | + | |
=== Skins a Themes === | === Skins a Themes === | ||
Line 221: | Line 220: | ||
=== Ukázky použití === | === Ukázky použití === | ||
- | * **Validace pomocí výjimek** | + | **Validace pomocí výjimek** |
- | ```xml | + | < |
- | < | + | ```xaml |
- | <Binding Path=" | + | < |
- | < | + | <Binding Path=" |
- | < | + | < |
- | </ | + | < |
- | </ | + | </ |
- | </TextBox.Text> | + | </ |
- | ``` | + | ``` |
+ | </markdown> | ||
- | * **Validace pomocí `IDataErrorInfo`** | + | **Validace pomocí `IDataErrorInfo`** |
- | ```xml | + | < |
- | <TextBox Text=" | + | ```xaml |
- | ``` | + | <TextBox Text=" |
+ | ``` | ||
+ | </ | ||
- | * **Vlastní validační pravidlo** | + | **Vlastní validační pravidlo** |
- | ```csharp | + | < |
- | public class JpgValidationRule : ValidationRule { | + | ```xaml |
- | public override ValidationResult Validate(object value, CultureInfo cultureInfo) { | + | public class JpgValidationRule : ValidationRule { |
- | string path = value as string; | + | public override ValidationResult Validate(object value, CultureInfo cultureInfo) { |
- | if (!path.EndsWith(" | + | string path = value as string; |
- | return new ValidationResult(false, | + | if (!path.EndsWith(" |
- | return new ValidationResult(true, | + | return new ValidationResult(false, |
- | } | + | return new ValidationResult(true, |
- | } | + | } |
- | ``` | + | } |
- | + | ``` | |
- | | + | </ |
- | < | + | |
- | ```xml | + | **Zobrazení chyby pomocí Triggeru** |
- | <Style TargetType=" | + | < |
- | < | + | ```xaml |
- | <Trigger Property=" | + | <Style TargetType=" |
- | <Setter Property=" | + | < |
- | Value=" | + | <Trigger Property=" |
- | | + | <Setter Property=" |
- | </ | + | Value=" |
- | </ | + | Path=(Validation.Errors)[0].ErrorContent}" |
- | </ | + | </ |
- | ``` | + | </ |
- | </ | + | </ |
+ | ``` | ||
+ | </ | ||
Line 270: | Line 274: | ||
* **Architektury**: | * **Architektury**: | ||
- | | + | |
- | - **MVP** – Presenter zajišťuje komunikaci, View pasivní. | + | * {{: |
- | - **MVVM** – silný binding, ViewModel poskytuje logiku. | + | * **MVP** – presenter obsluhuje interakci s uživatelem a logiku, View je pasivní, vhodné pro testovatelnost, |
- | | + | * {{: |
- | - Wizard, Breadcrumb, Carousel, Undo, Drag& | + | * **MVVM** – silný binding, ViewModel poskytuje logiku, ViewModel je zcela oddělený od View. Spojení je dosaženo pomocí |
- | - Deklarativní popis UI (XAML, HTML) umožňuje | + | * {{: |
* **UI testovací skripty**: | * **UI testovací skripty**: | ||
- | | + | * **Testovací kód (UI Test Scripts)** – Skripty automatizují interakce uživatele s UI (např. kliknutí, vyplnění polí) a ověřují očekávané chování aplikace. Test je obvykle strukturován s identifikátorem, |
- | | + | * Ukázka v Selenium: |
- | | + | |
- | | + | < |
+ | ```java | ||
+ | public void testLogin() throws Exception { | ||
+ | selenium.open("/ | ||
+ | selenium.type(" | ||
+ | selenium.type(" | ||
+ | selenium.click(" | ||
+ | selenium.waitForPageToLoad(" | ||
+ | } | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | |||
+ | | ||
+ | |||
+ | * **Automatizované | ||
+ | * počet zobrazených obrazovek, | ||
+ | * snímky obrazovky (screenshots), | ||
+ | * provedené akce (click, input, scroll...), | ||
+ | * záznam výjimek a chyb, | ||
+ | * metriky jako doba odezvy nebo dostupnost komponent. | ||
+ | |||
+ | | ||
+ | |||
+ | * **Model-based testing** – Na základě | ||
+ | |||
+ | | ||
+ | * Např. operátor `File_Open(" | ||
+ | * Plánovací algoritmus vytvoří posloupnost interakcí, která ověří, že cesta od výchozího stavu k cíli je funkční. | ||
+ | |||
+ | * **Porovnání návrhu a implementace** – Pomocí nástrojů jako Diff Checker lze porovnat očekávaný návrh UI (např. prototyp z Figma) s implementovaným rozhraním a vyhodnotit rozdíly. Toto se využívá hlavně při regresech a kontrolách konzistence vzhledu. | ||
==== Příprava software pro uživatelské testování ==== | ==== Příprava software pro uživatelské testování ==== | ||
- | * **Data mocking**: | + | Aby bylo možné efektivně provádět testování s uživateli (nebo bez nich), je potřeba připravit samotné prostředí – od simulace dat přes zachytávání interakcí až po nástroje pro pokročilou analýzu chování. |
- | - Nahrazení reálných dat fiktivními | + | |
- | - Simulace | + | === Data mocking |
- | * **Wizard-of-Oz**: | + | |
- | - Simulace neexistující funkcionality | + | * Data mocking nahrazuje reálná data fiktivními, čímž umožňuje testování v situacích, kdy ještě neexistuje backend, API nebo validní datové sady. |
- | - Umožňuje testovat | + | * Lze využít k simulaci specifických scénářů – např. |
- | * **Sběr dat**: | + | * Umožňuje testovat UI nezávisle na aktuálním stavu backendu (lo-fi i hi-fi prototypy). |
- | | + | |
- | | + | === Wizard-of-Oz |
- | * **Testování bez uživatele**: | + | |
- | | + | * Tato metoda spočívá v tom, že části systému, které ještě nejsou implementovány (např. hlasové rozpoznání), |
- | | + | * Uživatel je často přesvědčen, |
- | | + | * Použití |
- | | + | * Umožňuje testovat i náročné technologie bez nutnosti jejich okamžité realizace. |
+ | |||
+ | === Sběr dat z testování === | ||
+ | |||
+ | * **Základní | ||
+ | * Videozáznam (1st-person, 3rd-person, screen recording) | ||
+ | | ||
+ | * Dotazníky před/po testování | ||
+ | * **Pokročilé | ||
+ | * **Logy** – záznam interakcí v systému (např. kliknutí, vstupy) | ||
+ | * **Eye-tracking** – sledování fixace očí, pozornosti uživatele | ||
+ | * **Senzory** – biometrie, prostředí | ||
+ | * **KLM model (Keystroke-Level Model)** – predikce doby interakce na základě základních operací (klik, psaní, mentální pauzy) | ||
+ | * **Android Monkey** – náhodné generování uživatelských akcí pro zátěžové testování | ||
+ | |||
+ | === Testování bez uživatele | ||
+ | |||
+ | | ||
+ | |||
+ | * **Heuristická evaluace**: | ||
+ | * Hodnocení použitelnosti | ||
+ | | ||
+ | |||
+ | * **Kognitivní průchod | ||
+ | * Metoda simulující mentální proces | ||
+ | * Krok po kroku ověřuje, zda je rozhraní srozumitelné a odpovídá cílům uživatele. | ||
+ | * Klíčové otázky: | ||
+ | | ||
+ | | ||
+ | | ||
+ | * Q3: Dostane uživatel srozumitelnou zpětnou vazbu? | ||
+ | |||
+ | === Co testovat === | ||
+ | |||
+ | * **Funkčnost** – fungují prvky správně, jak bylo navrženo? | ||
+ | * **Dostupnost | ||
+ | * **Dokončení úkolů** – lze úlohy dokončit s přiměřeným úsilím? | ||
+ | * **Chybovost** – kde může dojít ke zmatku nebo chybě? | ||
+ | * **Čitelnost | ||
+ | * **Použitelnost** – celková přívětivost, | ||