Hyödynnä CSS-valesääntöjen voima tehokkaaseen testikopioiden luontiin modernissa web-kehityksessä. Opi strategioita, parhaita käytäntöjä ja edistyneitä tekniikoita kestävien ja ylläpidettävien käyttöliittymien rakentamiseen.
CSS-valesääntö: Testikopioiden luonnin hallinta vankkaa web-kehitystä varten
Frontend-kehityksen dynaamisessa maailmassa sovellustemme luotettavuuden ja ylläpidettävyyden varmistaminen on ensiarvoisen tärkeää. Kun rakennamme yhä monimutkaisempia käyttöliittymiä, vankasta testaustrategiasta tulee välttämätön. Vaikka yksikkö- ja integraatiotestit ovat ratkaisevan tärkeitä JavaScript-logiikkamme toiminnan varmentamisessa, tyylittely ja sen vaikutus käyttökokemukseen aiheuttavat usein ainutlaatuisia testaushaasteita. Tässä kohtaa "CSS-valesäännön" konsepti ja laajempi CSS:n testikopioiden luomisen käytäntö tulevat mukaan kuvaan tarjoten tehokkaan tavan eristää komponentteja ja testata niiden toiminnallisuutta ilman, että tarvitsee luottaa varsinaiseen renderöintimoottoriin tai monimutkaisiin tyylitiedostoihin.
Testikopioiden ymmärtäminen ohjelmistotestauksessa
Ennen kuin sukellamme CSS-valesääntöjen yksityiskohtiin, on olennaista ymmärtää testikopioiden perusperiaatteet. Gerard Meszaros otti termin käyttöön merkkiteoksessaan "xUnit Test Patterns". Testikopiot ovat objekteja, jotka korvaavat tuotanto-objektisi testeissä. Ne jäljittelevät todellisen objektin toimintaa, jolloin voit hallita sen vuorovaikutuksia ja eristää testattavan koodin.
Testikopioiden käytön tärkeimpiä tarkoituksia ovat:
- Eristäminen: Koodin yksikön testaaminen erillään sen riippuvuuksista.
- Hallinta: Riippuvuuksien vastausten saneleminen, mikä mahdollistaa ennustettavat testitulokset.
- Tehokkuus: Testien nopeuttaminen välttämällä hitaita tai epäluotettavia ulkoisia palveluita (kuten tietokantoja tai verkkokutsuja).
- Toistettavuus: Sen varmistaminen, että testit ovat johdonmukaisia ja toistettavia ulkoisista tekijöistä riippumatta.
Yleisiä testikopioiden tyyppejä ovat:
- Dummy: Objekteja, joita siirretään ympäriinsä, mutta joita ei koskaan todella käytetä. Niiden ainoa tarkoitus on täyttää parametrilistoja.
- Fake: Objekteja, joilla on suoritettava toteutus, mutta jotka eivät täytä todellisen toteutuksen sopimusta. Niitä käytetään usein muistissa olevissa tietokannoissa tai yksinkertaistetuissa verkkoyhteyksissä.
- Stub: Tarjoaa valmiita vastauksia testin aikana tehtyihin puheluihin. Niitä käytetään yleensä, kun riippuvuuden on palautettava tiettyjä tietoja.
- Spy: Stub, joka myös tallentaa tietoja siitä, miten sitä kutsuttiin. Tämän avulla voit tarkistaa vuorovaikutukset.
- Mock: Objekteja, jotka korvaavat todelliset toteutukset ja jotka on ohjelmoitu odotuksilla siitä, mitä tehdä. Ne tarkistavat vuorovaikutukset ja epäonnistuvat usein testissä, jos odotukset eivät täyty.
CSS:n testaamisen haaste
Perinteiset yksikkötestit keskittyvät usein JavaScript-logiikkaan olettaen, että käyttöliittymä renderöityy oikein koodin hallitsemien tietojen ja tilan perusteella. CSS:llä on kuitenkin kriittinen rooli käyttökokemuksessa, joka vaikuttaa asetteluun, ulkoasuun ja jopa saavutettavuuteen. CSS:n huomiotta jättäminen testauksessa voi johtaa:
- Visuaaliset regressiot: Tahattomat muutokset käyttöliittymässä, jotka rikkovat aiotun ulkoasun.
- Asetteluongelmat: Komponentit näkyvät virheellisesti CSS-ristiriitojen tai odottamattoman toiminnan vuoksi.
- Saavutettavuusongelmat: Tyylittely, joka estää vammaisia käyttäjiä vuorovaikuttamasta sovelluksen kanssa.
- Huono suorituskyky: Tehoton CSS, joka hidastaa renderöintiä.
CSS:n testaaminen suoraan tavallisilla JavaScript-yksikkötestauskehyksillä voi olla hankalaa. Selainten renderöintimoottorit ovat monimutkaisia, ja niiden käyttäytymisen tarkka simulointi Node.js-ympäristössä (jossa useimmat yksikkötestit suoritetaan) on haastavaa.
"CSS-valesääntö"-konseptin esittely
Termi "CSS-valesääntö" ei ole virallisesti määritelty CSS-määrittely tai laajalti hyväksytty toimialatermi samalla tavalla kuin "mock" tai "stub". Sen sijaan se on käsitteellinen lähestymistapa frontend-testauksen yhteydessä. Se viittaa käytäntöön luoda yksinkertaistettu, hallittu esitys CSS-säännöistä testausympäristössäsi. Tavoitteena on eristää komponenttisi käyttäytyminen ja varmistaa, että se voi toimia odotetusti, vaikka todellisia, monimutkaisia tyylitiedostoja ei ole täysin käytetty tai niitä on tarkoituksella manipuloitu testaustarkoituksiin.
Ajattele sitä CSS-objektin mockaamisena tai stubatun tyylitiedoston luomisena, jonka kanssa JavaScript-koodisi voi olla vuorovaikutuksessa. Tämän avulla voit:
- Tarkista komponenttien renderöintilogiikka: Varmista, että komponenttisi käyttää oikeita CSS-luokkia tai sisäisiä tyylejä sen propsien, tilan tai elinkaaren perusteella.
- Testaa ehdollista tyylittelyä: Vahvista, että eri tyylejä käytetään eri olosuhteissa.
- CSS-in-JS-kirjastojen mockaaminen: Jos käytät kirjastoja, kuten Styled Components tai Emotion, saatat joutua mockaamaan niiden luomia luokkanimiä tai lisättyjä tyylejä.
- Simuloi CSS:stä riippuvaisia käyttäytymismalleja: Esimerkiksi testaaminen, reagoiko komponentti oikein CSS-siirtymän päättymiseen tai tietyn media queryn täyttymiseen.
Strategiat CSS-valesääntöjen ja testikopioiden toteuttamiseen
"CSS-valesääntöjen" tai CSS:n testikopioiden toteutus voi vaihdella testauskehyksen ja testattavien CSS:n tiettyjen näkökohtien mukaan. Tässä on useita yleisiä strategioita:
1. CSS-luokkien käytön mockaaminen
Monet frontend-kehykset ja -kirjastot luottavat CSS-luokkien käyttämiseen elementteihin hallitakseen niiden ulkoasua ja käyttäytymistä. Testeissäsi voit varmistaa, että oikeat luokat on liitetty DOM-elementteihin.
Esimerkki Jestin ja React Testing Libraryn kanssa:
Harkitse React-komponenttia, joka käyttää 'highlighted'-luokkaa, kun prop on tosi:
// Button.jsx
import React from 'react';
import './Button.css'; // Oletetaan, että Button.css määrittää .button ja .highlighted
function Button({ children, highlighted }) {
return (
<button className={`button ${highlighted ? 'highlighted' : ''}`}>
{children}
</button>
);
}
export default Button;
Tämän komponentin testi keskittyisi 'highlighted'-luokan olemassaolon tai puuttumisen varmentamiseen:
// Button.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import Button from './Button';
it('applies highlighted class when prop is true', () => {
render(<Button highlighted>Click Me</Button>);
const buttonElement = screen.getByRole('button', { name: /Click Me/i });
expect(buttonElement).toHaveClass('highlighted');
expect(buttonElement).toHaveClass('button'); // Also verify base class
});
it('does not apply highlighted class when prop is false', () => {
render(<Button>Click Me</Button>);
const buttonElement = screen.getByRole('button', { name: /Click Me/i });
expect(buttonElement).not.toHaveClass('highlighted');
expect(buttonElement).toHaveClass('button');
});
Tässä skenaariossa emme väärennä itse CSS-sääntöä, vaan testaamme pikemminkin JavaScript-logiikkaa, joka *määrittää*, mitä CSS-luokkia käytetään. Kirjastot, kuten React Testing Library, ovat tässä erinomaisia tarjoamalla apuohjelmia DOM:n kyselyyn ja määritteiden, kuten `className`, vahvistamiseen.
2. CSS-in-JS-kirjastojen mockaaminen
CSS-in-JS-ratkaisut, kuten Styled Components, Emotion tai JSS, luovat yksilöllisiä luokkanimiä tyyleille ja lisäävät ne DOM:iin. Näitä kirjastoja käyttävien komponenttien testaaminen edellyttää usein mockaamista tai ymmärtämistä, miten nämä luodut luokkanimet käyttäytyvät.
Esimerkki Styled Componentsilla:
Harkitse komponenttia, joka käyttää Styled Componentsia:
// StyledButton.js
import styled from 'styled-components';
const StyledButton = styled.button`
background-color: blue;
color: white;
${props => props.primary && `
background-color: green;
font-weight: bold;
`}
`;
export default StyledButton;
Testauksen aikana saatat haluta vahvistaa, että oikeita tyylejä käytetään tai että oikea tyylitelty komponentti renderöidään. Kirjastot, kuten Jest-Styled-Components, voivat auttaa tyyliteltyjen komponenttien tilannekuvien ottamisessa, mutta hienojakoisempiin väittämiin voit tarkastaa luodut luokkanimet.
Kuitenkin, jos testaat ensisijaisesti *logiikkaa*, joka sanelee, milloin `primary`-propsi välitetään, testaustapa pysyy samanlaisena kuin edellisessä esimerkissä: vahvista propsien olemassaolo tai renderöity tulos.
Jos sinun on mockattava *luodut luokkanimet* suoraan, voit ohittaa komponentin tyylit tai käyttää CSS-in-JS-kirjaston itsensä tarjoamia testausapuohjelmia, vaikka tämä on harvinaisempaa tyypillisessä komponenttitestauksessa.
3. CSS-muuttujien (mukautettujen ominaisuuksien) mockaaminen
CSS-mukautetut ominaisuudet (muuttujat) ovat tehokkaita teemoitukseen ja dynaamiseen tyylittelyyn. Voit testata JavaScript-logiikkaa, joka asettaa nämä ominaisuudet elementteihin tai dokumenttiin.
Esimerkki:
// App.js
import React, { useEffect } from 'react';
function App() {
useEffect(() => {
document.documentElement.style.setProperty('--primary-color', 'red');
}, []);
return (
<div className="container">
App Content
</div>
);
}
export default App;
Testissäsi voit vahvistaa, että CSS-muuttuja on asetettu oikein:
// App.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';
it('sets the primary color CSS variable', () => {
render(<App />);
const rootElement = document.documentElement;
expect(rootElement.style.getPropertyValue('--primary-color')).toBe('red');
});
4. CSS-animaatioiden ja -siirtymien mockaaminen
JavaScriptin testaaminen, joka luottaa CSS-animaatioihin tai -siirtymiin (esim. kuuntelee `animationend`- tai `transitionend`-tapahtumia), edellyttää näiden tapahtumien simulointia.
Voit lähettää nämä tapahtumat manuaalisesti testeissäsi.
Esimerkki:
// FadingBox.jsx
import React, { useState } from 'react';
import './FadingBox.css'; // Olettaa, että .fade-out-luokka käynnistää animaation
function FadingBox({ children, show }) {
const [isVisible, setIsVisible] = useState(true);
const handleAnimationEnd = () => {
if (!show) {
setIsVisible(false);
}
};
if (!isVisible) return null;
return (
<div
className={`box ${show ? '' : 'fade-out'`}
onAnimationEnd={handleAnimationEnd}
>
{children}
</div>
);
}
export default FadingBox;
`handleAnimationEnd`-logiikan testaaminen:
// FadingBox.test.js
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import FadingBox from './FadingBox';
it('hides the box after fade-out animation ends', () => {
const { rerender } = render(<FadingBox show={true}>Content</FadingBox>);
const boxElement = screen.getByText('Content').closest('.box');
// Simulate the animation ending
fireEvent.animationEnd(boxElement);
// The component should still be visible because 'show' prop is true.
// If we were to rerender with show={false} and then fire animationEnd,
// it should then become invisible.
// Let's test the case where it *should* hide:
rerender(<FadingBox show={false}>Content</FadingBox>);
const boxElementFading = screen.getByText('Content').closest('.box');
// Simulate animation end for the fading element
fireEvent.animationEnd(boxElementFading);
// The element should no longer be in the DOM
// Note: This often requires mocking the animation to complete instantly for tests
// or carefully simulating the timing. For simplicity, we'll check if the element
// *would* be removed if the handler correctly updated state.
// A more robust test might involve spies on state updates or checking for the
// absence of the element after an appropriate delay or mock animation.
// A more direct test for the handler itself:
const mockHandleAnimationEnd = jest.fn();
render(<FadingBox show={false} onAnimationEnd={mockHandleAnimationEnd}>Content</FadingBox>);
const boxElementTest = screen.getByText('Content').closest('.box');
fireEvent.animationEnd(boxElementTest);
expect(mockHandleAnimationEnd).toHaveBeenCalledTimes(1);
// To truly test hiding, you'd need to simulate the animation class being added,
// then the animation ending, and then check if the element is gone.
// This can get complex and might be better handled by end-to-end tests.
});
Monimutkaisempaan animaatiotestaukseen erilliset kirjastot tai päästä päähän -testauskehykset, kuten Cypress tai Playwright, ovat usein sopivampia, koska ne voivat olla vuorovaikutuksessa selaimen renderöinnin kanssa realistisemmin.
5. Mock Service Workersin (MSW) käyttäminen käyttöliittymään vaikuttaviin API-vastauksiin
Vaikka kyse ei ole suoraan CSS:stä, MSW on tehokas työkalu verkkopyyntöjen mockaamiseen. Joskus käyttöliittymän toiminta käynnistyy API-vastauksista, jotka puolestaan vaikuttavat tyylittelyyn (esim. API:n "featured"-lippu voi johtaa erityiseen CSS-luokkaan). MSW:n avulla voit simuloida näitä API-vastauksia testeissäsi.
Esimerkkiskenaario:
Tuoteluettelokomponentti voi näyttää "Suositeltu"-merkin, jos API:n tuotetiedot sisältävät `isFeatured: true` -lipun. Tällä merkillä olisi erityinen CSS-tyylittely.
MSW:n avulla voit siepata API-kutsun ja palauttaa mock-dataa, joka sisältää tai jättää pois `isFeatured`-lipun, ja testata sitten, miten komponentti renderöi merkin ja siihen liittyvän CSS:n.
6. Yleisten tyylien ohittaminen tai testikohtaisten tyylitiedostojen käyttäminen
Joissakin tapauksissa, erityisesti integraatiotestien yhteydessä tai testattaessa komponenttien ja yleisten tyylien välistä vuorovaikutusta, saatat haluta tarjota minimaalisen, hallitun joukon globaaleja tyylejä.
- Minimaalinen nollaus: Voit tarjota CSS-nollausperustan varmistaaksesi johdonmukaisen lähtökohdan testeissä.
- Testikohtaiset ohitukset: Joissakin testeissä saatat lisätä pienen tyylitiedoston, joka ohittaa tietyt tyylit tarkistaaksesi käyttäytymisen hallituissa olosuhteissa. Tämä on lähempänä "valesäännön" ajatusta.
Voit esimerkiksi lisätä tyylitunnisteen asiakirjan päähän testiasetuksesi aikana:
// setupTests.js or similar file
const CSS_MOCKS = `
/* Minimal styles for testing */
.mock-hidden { display: none !important; }
.mock-visible { display: block !important; }
`;
const styleElement = document.createElement('style');
styleElement.textContent = CSS_MOCKS;
document.head.appendChild(styleElement);
Tämä lähestymistapa tarjoaa "valesääntöjä", joita voit sitten soveltaa elementteihin testeissäsi simuloidaksesi tiettyjä näyttötiloja.
Työkalut ja kirjastot CSS-testaukseen
Useat suositut testauskirjastot ja -työkalut helpottavat CSS:ään luottavien komponenttien testaamista:
- Testing Library (React, Vue, Angular jne.): Kuten esimerkeissä näkyy, se on erinomainen DOM:n kyselyyn ja määritteiden ja luokkanimien vahvistamiseen.
- Jest: Laajalti käytetty JavaScript-testauskehys, joka tarjoaa väittelyapuohjelmia, mockausominaisuuksia ja testiajon.
- Enzyme (vanhemmille React-projekteille): Tarjoaa apuohjelmia React-komponenttien testaamiseen renderöimällä ne ja tarkastamalla niiden tulosteet.
- Cypress: Päästä päähän -testauskehys, joka toimii selaimessa ja mahdollistaa visuaalisten näkökohtien ja käyttäjävuorovaikutusten realistisemman testauksen. Sitä voidaan käyttää myös komponenttien testaukseen.
- Playwright: Samanlainen kuin Cypress, Playwright tarjoaa selainten välisen päästä päähän -testauksen ja komponenttien testausominaisuudet, ja sillä on vahva tuki vuorovaikutukselle selaimen kanssa.
- Jest-Styled-Components: Suunniteltu erityisesti Styled Componentsin tilannekuvien testaamiseen.
Milloin käyttää "CSS-valesääntöjä" vs. muita testaustapoja
On tärkeää erottaa CSS:ään *vaikuttavan* JavaScript-logiikan testaaminen ja CSS-renderöinnin testaaminen sinänsä. "CSS-valesäännöt" kuuluvat pääasiassa edelliseen luokkaan – sen varmistaminen, että koodisi käsittelee oikein luokkia, tyylejä tai määritteitä, jotka CSS-moottori tulkitsee myöhemmin.
- Yksikkötestit: Ihanteellinen sen tarkistamiseen, että komponentti käyttää oikeita luokkia tai sisäisiä tyylejä sen propsien ja tilan perusteella. Tässä "valesäännöt" koskevat usein DOM:n määritteiden vahvistamista.
- Integraatiotestit: Voi tarkistaa, miten useat komponentit ovat vuorovaikutuksessa, mukaan lukien se, miten niiden tyylit saattavat vaikuttaa toisiinsa, mutta eivät silti välttämättä testaa suoraan selaimen renderöintimoottoria.
- Komponenttitestit (työkaluilla, kuten Storybook/Cypress): Mahdollistavat visuaalisen testauksen eristetymmässä ympäristössä. Näet, miten komponentit renderöidään tietyillä propsilla ja tyyleillä.
- Päästä päähän (E2E) -testit: Parasta koko sovelluksen testaamiseen, mukaan lukien CSS-renderöinti, asettelu ja monimutkaiset käyttäjävuorovaikutukset todellisessa selainympäristössä. Nämä ovat ratkaisevan tärkeitä visuaalisten regressioiden havaitsemiseksi ja yleisen käyttökokemuksen varmistamiseksi.
Sinun ei yleensä tarvitse "väärentää" CSS-sääntöjä niin pitkälle, että luot CSS-jäsentimen JavaScriptissä yksikkötesteille. Tavoitteena on yleensä testata sovelluksesi logiikkaa, joka *luottaa* CSS:ään, ei testata itse CSS-jäsentää.
Parhaat käytännöt tehokkaaseen CSS-testaukseen
- Keskity käyttäytymiseen, älä vain ulkonäköön: Testaa, että komponenttisi käyttäytyy oikein, kun tiettyjä tyylejä käytetään (esim. painike on poistettu käytöstä ja sitä ei voi napsauttaa `disabled`-luokan vuoksi). Vaikka visuaalinen ulkonäkö on tärkeää, tarkat pikselintarkat tarkistukset yksikkötesteissä ovat usein hauraita.
- Hyödynnä saavutettavuusominaisuuksia: Käytä ARIA-määritteitä ja semanttista HTML:ää. ARIA-roolien tai -määritteiden olemassaolon testaaminen voi epäsuorasti varmistaa, että tyylisi tukee saavutettavuutta.
- Priorisoi JavaScript-logiikan testaaminen: Frontend-testauksen ytimen tulisi olla JavaScript-logiikka. Varmista, että oikeat luokat, määritteet ja DOM-rakenteet luodaan.
- Käytä visuaalista regressiotestausta strategisesti: Tahattomien visuaalisten muutosten havaitsemiseen työkalut, kuten Percy, Chromatic tai Applitools, ovat korvaamattomia. Ne vertaavat komponenttiesi kuvakaappauksia lähtötasoon ja merkitsevät merkittävät erot. Nämä suoritetaan tyypillisesti CI/CD-putkissa.
- Pidä testit kohdistettuina: Yksikkötestien tulisi olla nopeita ja eristettyjä. Vältä monimutkaisia DOM-manipulointeja, jotka jäljittelevät selaimen renderöintimoottoria liian tarkasti.
- Ota huomioon CSS-järjestys ja -spesifisyys testeissä: Jos testisi sisältää elementin laskennallisen tyylin vahvistamisen, ole tietoinen CSS-spesifisyydestä ja järjestyksestä, jossa tyylejä käytetään. Työkalut, kuten `getComputedStyle` selaintestausympäristöissä, voivat olla hyödyllisiä.
- CSS-kehysten mockaaminen: Jos käytät UI-kehystä, kuten Tailwind CSS tai Bootstrap, testiesi tulisi keskittyä siihen, miten komponenttisi hyödyntävät kehyksen luokkia, ei kehyksen sisäisen CSS:n testaamiseen.
Globaalit näkökohdat CSS-testaukseen
Globaalia yleisöä varten kehitettäessä CSS-testauksen on otettava huomioon useita tekijöitä:
- Kansainvälistyminen (i18n) ja lokalisointi (l10n): Varmista, että tyylit mukautuvat eri kielten pituuksiin ja tekstin suuntiin (esim. oikealta vasemmalle kirjoitettavat kielet, kuten arabia tai heprea). Testaus voi sisältää eri `dir`-määritteiden simuloinnin HTML-elementeissä ja asettelun säätöjen tarkistamisen.
- Fonttien renderöinti: Eri käyttöjärjestelmät ja selaimet renderöivät fontteja hieman eri tavalla. Visuaaliset regressiotestit tulisi ihannetapauksessa määrittää ottamaan huomioon pienet renderöintierot eri alustoilla.
- Responsiivinen suunnittelu: Testaa, miten komponentit mukautuvat eri näytön kokoihin ja resoluutioihin, jotka ovat yleisiä eri alueilla ja laitetyypeissä. E2E- tai komponenttitestaustyökalut ovat tässä ratkaisevan tärkeitä.
- Suorituskykybudjetit: Varmista, että CSS, erityisesti suurten globaalien tyylitiedostojen tai kehysten kanssa, ei vaikuta negatiivisesti latausaikoihin. Suorituskykytestaus voidaan integroida CI/CD:hen.
- Saavutettavuusstandardit: Noudata WCAG:ta (Web Content Accessibility Guidelines). Oikeiden värikontrastisuhteiden, tarkennusindikaattorien ja semanttisen rakenteen testaaminen on elintärkeää globaalin saavutettavuuden kannalta.
Johtopäätös
"CSS-valesäännön" käsite ei koske monimutkaisen CSS-tulkin luomista yksikkötesteillesi. Pikemminkin se on ajattelutapa ja joukko strategioita JavaScript-logiikan testaamiseen tehokkaasti, mikä määrää, miten CSS:ää käytetään komponentteihisi. Luomalla asianmukaisia testikopioita CSS:ään liittyville vuorovaikutuksille – ensisijaisesti vahvistamalla luokkien, määritteiden ja mukautettujen ominaisuuksien oikean sovelluksen – voit rakentaa vankempia, ylläpidettävämpiä ja luotettavampia frontend-sovelluksia.
DOM-väitteisiin tarkoitettujen Testing Libraryn kaltaisten työkalujen hyödyntäminen sekä visuaaliset regressiotyökalut ja päästä päähän -testauskehykset tarjoavat kattavan testauspyramidin käyttöliittymällesi. Tämän avulla voit luottavaisesti iteroida suunnitelmiasi ja ominaisuuksiasi tietäen, että sovelluksesi tyylittely käyttäytyy tarkoitetulla tavalla erilaisissa käyttäjäskenaarioissa ja globaaleissa yhteyksissä.
Hyödynnä näitä testaustekniikoita varmistaaksesi, että käyttöliittymäsi ei ole vain toimiva, vaan myös visuaalisesti johdonmukainen ja kaikkien käyttäjien käytettävissä maailmanlaajuisesti.