Im Shopify-Architektur-Ratgeber sprechen wir über Grundlagen. Heute: Der letzte 10% des Projekts, der oft 90% der Probleme verursacht.
Bei smplx. haben wir gelernt: Ein "fast fertig" Shop ist nicht dasselbe wie ein "Launch-ready" Shop. Testing und QA sind nicht Extras – sie sind Architektur.
Warum QA kritisch ist
Die Zahlen:
- 0.1% der Besucher machen einen Kauf
- Jeder Fehler im Checkout = direkte Revenue-Verluste
- Mobile ist fragil (das sehen Browser-Tests nicht)
- Payment-Fehler sind existenzbedrohend
Realität: Du kannst nicht alles manuell testen. Du brauchst Strategie.
Was du testen musst
1. Checkout Flow (Höchste Priorität)
Kritische Pfade:
- Produkt hinzufügen → Cart
- Mengen ändern
- Coupon eingeben (gültig, ungültig, expired)
- Checkout starten
- Shipping-Methode wählen
- Payment eingeben
- Order confirmation zeigen
- Email erhalten
Szenarios:
- Normales Kreditkarten-Checkout
- Guest Checkout
- Logged-In Customer
- Express Payment (Google Pay, Apple Pay)
- Multi-Currency (wenn relevant)
- Aus verschiedenen Ländern
Test-Payments:
Stripe Test Cards:
- 4242 4242 4242 4242 (Success)
- 4000 0000 0000 0002 (Decline)
- 4000 0025 0000 3155 (Requires 3D Secure)
Klarna Test:
- 4111 1111 1111 1111 (Success - Invoice)
2. Responsive & Browser-Testing
Geräte testen:
- Desktop (1920x1080, 1440x900, 1024x768)
- Tablet (iPad, Samsung Tab)
- Mobile (iPhone 12, iPhone SE, Samsung Galaxy)
- Old Mobile (iPhone 8)
Browser testen:
- Chrome (Neueste Version)
- Safari (Mac + iOS)
- Firefox (Neueste)
- Edge
- Mobile Safari (iOS)
- Chrome Mobile (Android)
Tools:
BrowserStack: https://www.browserstack.com
- Real devices in der Cloud
- Automatisierte Screenshot-Tests
3. Performance-Testing (Web Vitals)
Mit Lighthouse testen:
# Terminal
lighthouse https://shop.example.com --view
Ziele:
- LCP < 2.5s
- INP < 100ms
- CLS < 0.1
- Overall Score > 85
Mit Web Vitals messen:
// Im Theme oder Headless App
import { getCLS, getFID, getFCP, getLCP, getTTFB } from 'web-vitals';
function sendMetrics(metric) {
// Sende zu Analytics
fetch('/api/metrics', {
method: 'POST',
body: JSON.stringify(metric)
});
}
getCLS(sendMetrics);
getFID(sendMetrics);
getFCP(sendMetrics);
getLCP(sendMetrics);
getTTFB(sendMetrics);
4. SEO-Testing
Mit axe DevTools (kostenlos):
# Browser Extension für Chrome
# Prüft: Accessibility + Basic SEO
Manuell checken:
- H1 auf jeder Seite (genau ein)
- Meta Descriptions (alle Pages)
- Open Graph Tags (sozial teilen)
- Structured Data (JSON-LD für Products)
- Sitemap.xml existiert
- robots.txt nicht zu restriktiv
Beispiel: Product Structured Data
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{{ product.title }}",
"description": "{{ product.description }}",
"image": "{{ product.featured_image | image_url: width: 800 }}",
"brand": {
"@type": "Brand",
"name": "{{ shop.name }}"
},
"offers": {
"@type": "Offer",
"price": "{{ product.selected_or_first_available_variant.price | divided_by: 100 }}",
"priceCurrency": "{{ shop.currency }}",
"availability": "https://schema.org/{% if product.selected_or_first_available_variant.available %}InStock{% else %}OutOfStock{% endif %}"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "{{ product.metafields.reviews.rating.value | default: 5 }}",
"reviewCount": "{{ product.metafields.reviews.count.value | default: 0 }}"
}
}
</script>
5. Accessibility-Testing
Tools:
- axe DevTools (Chrome Extension)
- WAVE (WebAIM)
- Lighthouse Accessibility Audit
Kritische Checks:
- Alle Images haben Alt-Text
- Farbkontrast ist ausreichend
- Keyboard Navigation funktioniert (Tab durch Links)
- Formular-Labels richtig (nicht nur Placeholder)
- ARIA-Labels wo nötig
Beispiel: Accessible Form
<!-- ❌ FALSCH -->
<input type="email" placeholder="Email">
<!-- ✅ RICHTIG -->
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
6. Payment & Tax Compliance
Testen:
- Shipping Calculations (richtig nach Land)
- Tax Calculations (Sales Tax, VAT)
- Currency Conversions (wenn Multi-Currency)
- Payment Methods verfügbar (je nach Land)
- Address Validation funktioniert
Beispiel: Shipping kalkulieren
// Shopify GraphQL
query CalculateShipping {
cart(cartId: "...") {
estimatedCost {
shippingEstimate {
amount
}
totalTaxEstimate {
amount
}
subtotalAmount {
amount
}
totalAmount {
amount
}
}
}
}
7. Mobile Payment Testing
Wichtig: Apple Pay und Google Pay funktionieren nur auf echten Geräten!
Setup:
- Apple Pay auf Testgerät
- Google Pay auf Android
Testen mit echten Geräten:
Stripe Test Card für Apple Pay:
- Card Number: 4242 4242 4242 4242
- Exp: 12/26
- CVC: 123
Testing-Tools und -Setups
Automated Testing: End-to-End
Mit Playwright (empfohlen):
// test.spec.js
import { test, expect } from '@playwright/test';
test('Kompletter Checkout Flow', async ({ page }) => {
// 1. Zur Shop gehen
await page.goto('https://shop.example.com');
// 2. Produkt klicken
await page.click('[data-test="product-card"]');
expect(page).toHaveURL(/\/products\//);
// 3. Zu Cart hinzufügen
await page.click('button:has-text("Add to cart")');
await page.waitForURL('**/cart');
// 4. Checkout starten
await page.click('button:has-text("Checkout")');
await page.waitForURL('**/checkout');
// 5. Email eingeben
await page.fill('input[type="email"]', 'test@example.com');
// 6. Shipping Address
await page.fill('input[placeholder="First name"]', 'Test');
await page.fill('input[placeholder="Last name"]', 'User');
await page.fill('input[placeholder="Address"]', '123 Main St');
// 7. Shipping Method wählen
await page.click('text=Standard Shipping');
// 8. Payment
// Stripe iFrame handling ist komplex
// Aber Shopify managed Checkout macht es leichter
// 9. Order Confirmation
expect(page).toContain('Order #');
});
test('Coupon wird angewendet', async ({ page }) => {
await page.goto('https://shop.example.com/cart');
await page.fill('input[placeholder="Discount code"]', 'SAVE10');
await page.click('button:has-text("Apply")');
// Preis sollte updated sein
await page.waitForSelector('text=Subtotal');
const originalPrice = await page.locator('text=Subtotal').evaluate(el => el.textContent);
expect(originalPrice).toContain('$');
});
Ausführen:
npx playwright test
# Oder mit UI
npx playwright test --ui
Performance Testing: Lighthouse CI
// lighthouserc.json
{
"ci": {
"collect": {
"url": [
"https://shop.example.com",
"https://shop.example.com/products",
"https://shop.example.com/collections"
],
"numberOfRuns": 3
},
"assert": {
"preset": "lighthouse:recommended",
"assertions": {
"largest-contentful-paint": ["error", { "maxNumericValue": 2500 }],
"cumulative-layout-shift": ["error", { "maxNumericValue": 0.1 }],
"first-input-delay": ["error", { "maxNumericValue": 100 }]
}
}
}
}
lhci autorun
Pre-Launch Checkliste
72 Stunden vor Launch
Funktionalität:
- Alle Produkte visible + Bilder laden
- Varianten funktionieren (alle Optionen)
- Inventur korrekt (nicht Oversell möglich)
- Alle Payment Methods aktiv
- Alle Shipping Methoden tested
- Alle Coupons/Discounts tested
- Email-Bestätigungen funktionieren
Performance:
- Lighthouse Score > 85
- LCP < 2.5s (mobil)
- Keine broken Images
- Keine 404er
SEO:
- Sitemap.xml submitted zu Google
- Meta Descriptions alle Pages
- Robots.txt nicht zu restriktiv
- Structured Data ok (Rich Snippets)
Security:
- HTTPS überall
- CSP Headers gesetzt
- XSS-Schutz
- CSRF Protection (Shopify default)
Legal:
- Privacy Policy current
- Terms & Conditions ok
- Return Policy clear
- Impressum (DSGVO)
24 Stunden vor Launch
- Database Backup
- Monitoring Setup (Analytics, Error Tracking)
- Incident Response Plan (wer macht was wenn Problem)
- Support-System online (Email, Chat)
- Marketing-Kampagne bereit (nicht noch am Launch-Tag starten)
Nach Launch (24-48h monitoring)
- Error Rates monitored
- Payment Success Rate > 95%
- Page Load Times ok
- Customer Support Tickets scannen (gibt Patterns)
- Conversion Rate normal (keine Anomalien)
Post-Launch Monitoring
Real User Monitoring (RUM)
// Im Theme oder App
// Sende Metriken zu Monitoring-Service
window.addEventListener('error', (event) => {
fetch('/api/errors', {
method: 'POST',
body: JSON.stringify({
message: event.message,
stack: event.error?.stack,
url: window.location.href,
timestamp: new Date()
})
});
});
// Unhandled Promise Rejections
window.addEventListener('unhandledrejection', (event) => {
fetch('/api/errors', {
method: 'POST',
body: JSON.stringify({
message: 'Unhandled Promise Rejection',
error: event.reason,
timestamp: new Date()
})
});
});
Key Metrics im Blick
Dashboard mit:
- Conversion Rate (Visits → Purchases)
- Cart Abandonment Rate
- Average Order Value
- Payment Success Rate
- Page Load Time (Real Users)
- Error Rate (Frontend + Backend)
- Customer Support Tickets
Tools:
- Google Analytics 4 (kostenlos)
- Shopify Admin Reports
- Sentry (Error Tracking)
- Databox (KPI Dashboard)
Incident Response
Wenn Problem passiert:
1. Detect (Monitoring alert)
└─ Severity: Critical/High/Medium/Low
2. Acknowledge (Team wird benachrichtigt)
└─ On-Call Person: [Name]
3. Assess
└─ Impact: Revenue-Loss? UX-Broken? API Down?
4. Mitigate (Schnell!)
└─ Theme Rollback?
└─ App ausschalten?
└─ Maintenance Mode?
5. Fix (Root Cause)
└─ Code Debug
└─ Deploy Fix
6. Monitor (24h nach Fix)
└─ Error rate noch ok?
└─ Performance normal?
7. Postmortem (nächster Tag)
└─ Warum passiert?
└─ Wie prevent wir es in Zukunft?
Testing für verschiedene Shopify-Architekturen
Theme-Based Shop (Liquid)
Focus:
- Theme Performance
- Liquid Template Errors
- CSS/JS Conflicts
- Browser Compatibility
Tools:
- Lighthouse
- BrowserStack
- Chrome DevTools
Headless Shop (Next.js/Remix)
Focus:
- API Error Handling
- Storefront API Rate Limits
- SSR/SSG Performance
- Data Freshness
Tools:
- Jest (Unit Tests)
- Playwright (E2E Tests)
- K6 (Load Testing)
// Jest Example
describe('Product Page', () => {
it('should fetch product data from Storefront API', async () => {
const response = await fetchProduct('123');
expect(response).toHaveProperty('id');
expect(response).toHaveProperty('title');
});
it('should handle API errors gracefully', async () => {
const response = await fetchProduct('invalid');
expect(response).toBeNull();
});
});
Multi-App Ecosystem
Focus:
- App Communication (wenn Apps interagieren)
- Webhook Handling
- API Rate Limits
- Data Consistency
Tools:
- API Monitoring (Postman, Insomnia)
- Webhook Testing (webhook.cool)
- Load Testing (Apache JMeter)
QA Checkliste (Kopierbar)
# Pre-Launch QA Checklist
## Functional Testing
- [ ] Homepage loads
- [ ] Product pages load with images
- [ ] Variants work (all options)
- [ ] Add to cart works
- [ ] Cart shows correct totals
- [ ] Checkout flow complete
- [ ] Payment processes successfully
- [ ] Order confirmation email sent
- [ ] Customer account created (if applicable)
## Responsive Design
- [ ] Mobile (320px) looks ok
- [ ] Tablet (768px) looks ok
- [ ] Desktop (1920px) looks ok
- [ ] Touch targets are at least 44x44px
- [ ] No horizontal scroll
- [ ] Images scale properly
## Performance
- [ ] Lighthouse Score > 85
- [ ] LCP < 2.5s
- [ ] FID < 100ms
- [ ] CLS < 0.1
- [ ] Page size < 5MB
## SEO
- [ ] Meta descriptions set
- [ ] H1 tags correct
- [ ] Open Graph tags
- [ ] Structured data valid
- [ ] Sitemap submitted
## Security
- [ ] HTTPS everywhere
- [ ] No console errors
- [ ] Payment data secure
- [ ] PII protected
## Browsers
- [ ] Chrome (latest)
- [ ] Safari (Mac + iOS)
- [ ] Firefox (latest)
- [ ] Edge (latest)
## Payment
- [ ] Test card works
- [ ] Invalid card rejected
- [ ] Tax calculated
- [ ] Shipping calculated
- [ ] Coupons work
Über den Autor
Claudio Gerlich ist Technical Architect bei smplx. und seit 2020 spezialisiert auf Shopify. Mit dutzenden Launches haben wir gelernt: 90% der Launch-Probleme sind vermeidbar mit guter QA-Strategie.
QA ist nicht "langweilig testen". Es ist Risikovermeidung. Es ist Revenue-Protection.
smplx. ist Shopify Technical Partner (seit 2020) mit Sitz in Coesfeld, NRW.