A/B Testing mit Node.js

65
A/B-Testing mit Node Wolfgang Dirscherl / pixelio.de

Transcript of A/B Testing mit Node.js

Page 1: A/B Testing mit Node.js

A/B-Testing mit Node

Wolfgang Dirscherl / pixelio.de

Page 2: A/B Testing mit Node.js

Basti• Sebastian Springer

• aus München

• arbeite bei MaibornWolff GmbH

• https://github.com/sspringer82

• @basti_springer

• JavaScript Entwickler

Page 3: A/B Testing mit Node.js

A/B-Testing Frontend-Testing

ExpressAB Feature Flags

Sixpack

Agenda

Rainer Sturm / pixelio.de

Page 4: A/B Testing mit Node.js

Thommy Weiss / pixelio.de

A/B-Testing?

Page 5: A/B Testing mit Node.js

A/B-Testing?

Von einem bestimmten Feature werden zwei unterschiedliche Versionen an Benutzer ausgespielt, um zu sehen, welche Variante das gewünschte Ziel besser erfüllt.

Page 6: A/B Testing mit Node.js
Page 7: A/B Testing mit Node.js

Multivarianten-Testing

Beim Multivarianten-Testing werden parallel mehrere Versionen und eine Kontrollversion ausgespielt, um zu

prüfen, welche besser performt. Vorteil: Das Ergebnis liegt wesentlich schneller vor als beim

A/B-Testing Nachteil: es werden mehr Nutzer benötigt, um aussagekräftig

zu sein

Page 8: A/B Testing mit Node.js

Was kann man testen?

lichtkunst.73 / pixelio.de

Page 9: A/B Testing mit Node.js

Was kann man testen?

Grundsätzlich kann nahezu jeder Aspekt einer Applikation getestet werden. Die Spanne reicht von angepassten

Layouts über eine veränderte Seitenstruktur bis hin zu unterschiedlichen Workflows.

Je nachdem, wie tief in die Applikation eingegriffen werden soll, müssen unterschiedliche Werkzeuge verwendet

werden.

Page 10: A/B Testing mit Node.js

Vorgehensweise

1. Hypothese(n) 2. Umfang des Experiments festlegen 3. Unterschiedliche Varianten implementieren 4. Ausspielen 5. Tracken 6. Auswerten 7. Die bessere Version verwenden

Page 11: A/B Testing mit Node.js

Die Hypothese

Wenn wir unsere Registrierung von einem großen Formular in mehrere Tabs aufteilen, werden innerhalb von 4 Wochen

20% mehr Felder ausgefüllt.

Page 12: A/B Testing mit Node.js

Die Hypothese

Die Hypothese muss möglichst klar und messbar formuliert werden. Damit kann der Erfolg des Experiments gemessen

werden.

Page 13: A/B Testing mit Node.js

Multivarianten

Manchmal kann man keine konkrete Hypothese formulieren, sondern muss beispielsweise die Positionierung eines Buttons

oder Formulars einfach ausprobieren. Hier kommen Multivarianten-Tests zum Einsatz.

Page 14: A/B Testing mit Node.js

Umfang festlegen

Peter Reinäcker / pixelio.de

Page 15: A/B Testing mit Node.js

Den Umfang festlegen

Experimente sollten immer zeitlich begrenzt werden. Je mehr parallele Tests laufen, desto unübersichtlicher wird die Situation. Außerdem können sich Experimente gegenseitig

beeinflussen.

Der Umfang muss so gewählt werden, dass aussagekräftige Daten geliefert werden.

Page 16: A/B Testing mit Node.js

Implementieren

w.r.wagner / pixelio.de

Page 17: A/B Testing mit Node.js

Frontendbasierte Tests

Page 18: A/B Testing mit Node.js

Frontendbasierte Tests

Die Seitenstruktur wird mit einem JavaScript-Framework entsprechend des Tests angepasst.

Page 19: A/B Testing mit Node.js

Was kann ich damit testen?

Diese Art von Tests beschränkt sich vor allem auf strukturelle Manipulationen der Seite.

Serverseitige Strukturen oder Datenbankanpassungen sind nicht möglich.

Page 20: A/B Testing mit Node.js
Page 21: A/B Testing mit Node.js

Optimizely

Optimizely ist ein klassisches frontendbasiertes Werkzeug für A/B- und multivarianten-Tests. Es gibt sowohl eine (eingeschränkte) freie als auch eine kostenpflichtige

Version. Mittlerweile gibt es auch Erweiterungen für andere

Plattformen wie Node

Page 22: A/B Testing mit Node.js

Verteilung• Prozentuale Verteilung

• Browser

• Sources

• Cookies

• Request Parameters

• Geo/Language

Page 23: A/B Testing mit Node.js

Arbeitsweise

https://help.optimizely.com/Build_Campaigns_and_Experiments/How_Optimizely_Works%3A_Snippet_order_of_execution_and_JavaScript_evaluation_timing

Page 24: A/B Testing mit Node.js

Code Snippetfunction callbackFn(activate, options) { var utils = window.optimizely.get('utils'); var $ = window.optimizely.get('jquery');

utils.waitForElement('button').then(function(el) { if ($('button').length > 0) { activate(); } }); }

Page 25: A/B Testing mit Node.js

Optimizely

Page 26: A/B Testing mit Node.js

Vorteile

Leichtgewichtig und schnell umzusetzen

Kann auch von Frontend- Entwicklern

durchgeführt werden

Unabhängig vom Backend

Page 27: A/B Testing mit Node.js

Änderungen sind nicht persistent

Nicht versioniert

Quellcode wird nach der Auslieferung manipuliert

Zusätzlicher Overhead

Nachteile

Page 28: A/B Testing mit Node.js
Page 29: A/B Testing mit Node.js

Tests mit Node.js

In einer Node.js-Webapplikation können A/B-Tests direkt integriert werden. Das hat den Vorteil dass bereits auf dem

Server entschieden werden kann, welche Variante ausgespielt wird.

Page 30: A/B Testing mit Node.js

A/B-Tests mit Express

https://github.com/omichelsen/express-ab

Für das Web Application Framework Express gibt es eine Middleware, die die Steuerung der Experimente übernimmt. Diese Experimente basieren auf den Routen der Applikation.

Page 31: A/B Testing mit Node.js

A/B-Tests mit Express

npm install express express-ab cookie-parser

Als Middleware kann express-ab jederzeit auch in eine bestehende Express-Applikation integriert werden.

Page 32: A/B Testing mit Node.js

const express = require('express'); const cookieParser = require('cookie-parser'); const ab = require('express-ab');

const app = express(); app.use(cookieParser());

const profileTest = ab.test('Profile Test');

app.get('/', profileTest(), (req, res) => { res.send('variant A'); });

app.get('/', profileTest(), (req, res) => { res.send('variant B'); });

app.listen(8080);

Page 33: A/B Testing mit Node.js

Express-ab

Über die Informationen im Cookie des Benutzers wird die jeweilige Variante zugeordnet, sodass ein Benutzer stets die

selbe Variante erhält.

Page 34: A/B Testing mit Node.js

Verteilung

Die Varianten eines Experiments können unterschiedlich gewichtet werden:

profileTest(null, 0.2)

Dieses Experiment wird in 20% der Anfragen ausgespielt. Insgesamt sollte die Summe der Varianten 1 Ergeben.

Page 35: A/B Testing mit Node.js

Experiments

Page 36: A/B Testing mit Node.js

Google Experiments

Express-ab kann auch mit Google Experiments verwendet werden. Dabei handelt es sich um einen Teil von Google

Analytics, der dazu verwendet werden kann Multivarianten-Tests durchzuführen.

Mit express-ab kann man sowohl auf die Experiment-ID als auch auf die jeweilige Variante zugreifen und diese auch an

den Browser fürs Tracking weiterreichen.

Page 37: A/B Testing mit Node.js

Google Experiments

Page 38: A/B Testing mit Node.js

Google Experimentsconst profileTest = ab.test('Profile Test', { id: '123456789' });

app.get('/', profileTest(), (req, res) => { // res.locals.ab.name - 'Profile Test' // res.locals.ab.id - '123456789' // res.locals.ab.variantId - 0 res.send('variant A'); });

Page 39: A/B Testing mit Node.js

Tiefere Integration

Mit den Informationen, welche Variante ausgespielt wird, können auch innerhalb der Applikationslogik umgesetzt

werden.

Page 40: A/B Testing mit Node.js

Unterschiedliche Modelsclass Controller { getProfile(req, res) { let model; switch (res.locals.ab.variantId ) { case 0: model = new RefProfileModel(); break; case 1: model = new PerfProfileModel(); break; default: model = new ProfileModel(); break; }

res.render('profile', model); } }

Page 41: A/B Testing mit Node.js

Im Template

res.render('profile', {variant: res.locals.ab.variantId});

<% if (variant === 0) { %> <a href="javascript:void(0)" id="submit">Submit</a> <% } else if (variant === 1) {%> <button id="submit">Submit</button> <% } %>

Page 42: A/B Testing mit Node.js

Feature Flags

S. Hofschlaeger / pixelio.de

Page 43: A/B Testing mit Node.js

Feature Flags

Feature Flags sind eine weitere Variante, um unter anderem A/B-Tests durchzuführen.

Im einfachsten Fall ist ein solches Feature-Flag eine Abfrage im Code, die anhand einer Konfiguration den Code-Block

ausführt oder nicht.

Page 44: A/B Testing mit Node.js

Feature Flagsapp.get('/profile', async (req, res) => { const data = {};

if (await config.isEnabled('newConfig')) { res.render('newProfile.ejs', data); } else { res.render('profile.ejs', data); } });

Page 45: A/B Testing mit Node.js

Feature Flagsconst fs = require('fs'); const util = require('util'); const readFile = util.promisify(fs.readFile);

module.exports = { async isEnabled(feature) { const content = await readFile('config.json', 'utf-8'); const contentObj = JSON.parse(content); return contentObj.hasOwnProperty(feature) && contentObj[feature]; } }

Page 46: A/B Testing mit Node.js

Feature Flags

Nachdem ein Feature Flag nicht mehr benötigt wird, sollte zumindest die Abfrage entfernt werden.

Page 47: A/B Testing mit Node.js

Aufräumen

Page 48: A/B Testing mit Node.js

Sixpack

Alexander Klaus / pixelio.de

Page 49: A/B Testing mit Node.js

Sixpack

Sixpack ist ein Open Source A/B-Testing-Framework das unabhängig von Sprache und Plattform ist. Die Server-Komponente ist in Python geschrieben. Es gibt Client-

Bibliotheken unter anderem auch für Node.

Page 50: A/B Testing mit Node.js

Sixpack Web UI

Page 51: A/B Testing mit Node.js

Sixpackconst sixpack = require('sixpack-client');

const session = new sixpack.Session(); session.participate('test-exp', ['alt-one', 'alt-two'], (err, res) => { if (err) { throw err; } let alt = res.alternative.name if (alt === 'alt-one') { console.log('default: ' + alt); } else { console.log(alt); } });

Page 52: A/B Testing mit Node.js
Page 53: A/B Testing mit Node.js

Optimizely

Optimizely bietet nicht nur die Möglichkeit das Frontend zu “verbiegen”, sondern stellt auch APIs für verschiedene Sprachen und Plattformen wie Node.js zur Verfügung.

npm install optimizely-server-sdk

Page 54: A/B Testing mit Node.js

Optimizelyconst optimizely = require('optimizely-server-sdk'); const optimizelyClient = optimizely.createInstance({ datafile: datafile });

const variation = optimizelyClient.activate(‘profile', userId);

if (variation === 'variant A') { // Execute code for variation A } else if (variation === 'variant B') { // Execute code for variation B } else { // Execute default code }

optimizelyClient.track("my_conversion", userId);

Page 55: A/B Testing mit Node.js

Auswertung

S. Hofschlaeger / pixelio.de

Page 56: A/B Testing mit Node.js

Tracking und Auswertung

Der mitunter wichtigste Teil eines Experiments ist seine Auswertung. Zu diesem Zweck bieten die verschiedenen

Werkzeuge Möglichkeiten zur Auswertung. Sowohl Optimizely als auch Sixpack und Google Experiments

verfügen über eine grafische Oberfläche.

Page 57: A/B Testing mit Node.js
Page 58: A/B Testing mit Node.js

Fallstricke

Kurt Michel / pixelio.de

Page 59: A/B Testing mit Node.js

Fallstricke

Komplexität

Laufzeit

Teilnehmer

Zeitraum

Page 60: A/B Testing mit Node.js

KomplexitätEinzelne A/B- oder Multivarianten-Tests sind relativ gut

kontrollierbar.

Sind viele Experimente in einer großen Applikation parallel aktiv, sollten diese an einer zentralen Stelle verwaltet werden.

Wenn möglich sollten verschachtelte Experimente vermieden werden. Derartige Konstellationen können sich gegenseitig

beeinflussen und verfälschen unter Umständen die Ergebnisse.

Page 61: A/B Testing mit Node.js

Laufzeit

Die Laufzeit muss so gewählt werden, dass die Ergebnisse aussagekräftig sind.

Werden mehrere Experimente hintereinander geschaltet, sollten Sie auch über die gleiche Laufzeit verfügen.

Page 62: A/B Testing mit Node.js

Teilnehmer

Damit ein Experiment ausgewertet werden kann, müssen genügend Benutzer die an den verschiedenen Varianten

teilnehmen.

Dies ist wichtig, damit nicht wenige Teilnehmer das Ergebnis verfälschen.

Page 63: A/B Testing mit Node.js

Zeitraum

Experimente sollten in einem möglichst neutralen Zeitraum stattfinden.

In einem Online-Shop ist der Traffic in der Weihnachtszeit am höchsten. Diese Zeit ist auch nicht immer repräsentativ.

Page 64: A/B Testing mit Node.js

Fragen?

Rainer Sturm / pixelio.de

Page 65: A/B Testing mit Node.js

KONTAKT

Sebastian Springer [email protected]

MaibornWolff GmbH Theresienhöhe 13 80339 München

@basti_springer

https://github.com/sspringer82