In de afgelopen twee sprints hebben we gewerkt aan een aantal verbeteringen in de Pricewatch, waaronder het eenvoudiger wijzigen van je prijsalerts. Daarnaast zijn we met ons aanbod van abonnementen overgestapt op jaarbetalingen en maakte een van onze developers jacht op een flaky test.
Verbeterde interactie in prijsalerts
Prijsalerts zijn een handige manier om op de hoogte gesteld te worden van prijsdalingen van jouw favoriete producten. Eenmaal ingesteld kon je een prijsalert echter alleen wijzigen door hem uit te zetten en opnieuw in te stellen. Deze interactie hebben we daarom verbeterd. Het instellen van een prijsalert verloopt voortaan via het notificatie-icoontje achter wacht je op een prijsdaling, maar werkt verder op dezelfde manier als voorheen. Handig is dat de ingestelde prijs daarna altijd zichtbaar blijft, mits je ingelogd bent, anders alleen binnen de sessie. Wil je de prijsalert wijzigen, dan doe je dat eenvoudig via het bewerkicoontje. Verwijderen gaat vanzelfsprekend via het prullenbakicoontje.
Voor de oplettende kijker: het ontwerp van de willen-, hebben- en vergelijken-knoppen hebben we ook gelijkgetrokken met die van de nieuwe prijsalert. De functionele werking is echter onveranderd.
Andere Pricewatch-verbeteringen
Naast de nieuwe manier van prijsalerts instellen hebben we nog enkele andere verbeteringen doorgevoerd. De e-mailtekst van prijsalerts hebben we verduidelijkt door uit te leggen dat de prijs van het product gedaald is onder de ingestelde prijs én wat die ingestelde prijs was. Voorheen werd alleen vermeld wat de nieuwe grens voor de prijsalert was, wat soms tot verwarring leidde.
Daarnaast hebben we aan het productoverzicht in de Pricewatch een Getest-label toegevoegd. Hiermee kun je in één oogopslag zien welke producten door het Tweakers Testlab getest zijn. Filteren op producten die getest zijn, kon al langer via het "Getest vanaf"-filter onder het kopje "Overige".
Tot slot hebben we een kleine aanpassing doorgevoerd in de knoppen van de Pricewatch zodat ze consistent zijn met ons designsysteem. De zogenaamde chevrons (») zijn weggehaald en knoppen die leiden naar een webshop, zijn voorzien van een icoon om duidelijk te maken dat je Tweakers verlaat. Ook zijn de knoppen iets groter geworden.
Inzicht in stemmen op deals
Eind september introduceerden we op de Prijsdalingen-pagina in de Pricewatch de mogelijkheid om bij een deal te stemmen. Daarmee kun je aangeven of je de getoonde deal ook echt een deal vindt of niet. Om inzicht te geven in de verhouding tussen de plus- en minstemmen, hebben we daar een pop-upje aan toegevoegd dat aangeeft waarop de zichtbare score gebaseerd is. Zo kun je nog beter onderscheiden of de getoonde deal ook door anderen als deal gezien wordt.
Abonnementen met jaarbetaling
In verband met een wijziging bij onze interne betalingsprovider zijn we overgestapt op abonnementen met alleen jaarbetaling. Dat betekent dat zowel het Hero- als het Elite-abonnement voortaan jaarlijks vooruitbetaald wordt en na de looptijd automatisch stopt. Eén maand voor de einddatum is het mogelijk om het abonnement te verlengen; hiervoor sturen we altijd een herinnering. Alle actieve abonnees hebben op 23 oktober bericht hierover ontvangen in de vorm van een e-mail en DM. De nieuwe abonnementen met jaarbetaling zijn inmiddels af te sluiten in onze aboshop.
De aanleiding hiervoor is zoals gezegd een wijziging bij onze interne betalingsprovider. We hebben een aantal scenario's uitgewerkt voor het betalen van Tweakers-abonnementen, waaronder ook automatische incasso's via derde partijen of andere systemen van DPG Media. Aan elk scenario zaten voor- en nadelen. Na een grondige overweging hebben we besloten alleen nog abonnementen aan te bieden met een eenmalige vooruitbetaling per jaar. Karmakorting blijft onverminderd van toepassing.
De jacht op de flaky test
Als developer bij Tweakers is het eenvoudig om je werk te deployen, doordat er veel geautomatiseerd is. Deployen is een kwestie van de code pushen en een automergerequest aanmaken. Het systeem doet de rest van testen, compileren en deployen.
Althans, dat is de bedoeling. Soms faalt een test, waardoor het deploymentproces wordt afgebroken. Als de code de test heeft stukgemaakt, is dit wenselijk. Het voorkomt immers dat er code wordt gedeployed die stuk is. Soms faalt er echter een test in een heel ander gebied dan waarin de developer heeft gewerkt, en slaagt de test wel als hij nog eens uitgevoerd wordt: een flaky test dus. Zo’n flaky test faalt willekeurig, waardoor je als developer niet kunt vertrouwen op geautomatiseerde deployment. Als developers niet kunnen vertrouwen op een goede werking, bestaat de kans dat ze hun pipelines in de gaten moeten houden, wat ten koste gaat van hun productiviteit.
In de testsuite van de Tweakers-codebase zat zo’n flaky test. We waren erop gebrand om deze op te lossen om de betrouwbaarheid van de pipeline te kunnen verbeteren. Dé manier om een bug op te lossen is door die eerst te reproduceren. Dit is bij een flaky test niet eenvoudig, omdat de test vaak wel goed gaat en slechts sporadisch faalt. Het betrouwbaar kunnen laten falen van zo'n flaky test is daarom essentieel om het probleem op te kunnen lossen. De desbetreffende flaky test zat in de forumcode. De test faalde soms als het laatste bericht in een forumthread 1 cijfer hoger lag dan verwacht. Zo’n bericht had bijvoorbeeld als waarde ‘1695042579’. Dit cijfer lijkt verdacht veel op een datum in aantal seconden sinds epoch en inderdaad, het cijfer omzetten in een datum geeft het tijdstip waarop de test werd uitgevoerd.
Met deze kennis dook onze developer de code in, waar hij constateerde dat de test gebruikmaakt van Chronos, de forumcode van de date-functie van de database. Het gebruik van twee verschillende manieren om met datums om te gaan zou een verklaring kunnen zijn waarom de test faalt, als de twee manieren maar nét genoeg van elkaar verschillen. De developer probeerde de Chronos-datum vast te zetten op een ander tijdstip dan de datumfunctie van de database zou teruggeven, maar hiermee bleef de test slagen. Dit was dus blijkbaar toch niet de oorzaak van het probleem.
Second-rollover
Tijdens het uitvoeren van een test loopt de systeemtijd van het besturingssysteem door. Als een test om 15:03:03 begint, kan het zijn dat het net 15:03:04 is geworden als de verwachte uitkomst wordt vergeleken met het resultaat. Als de test verwacht dat de datum een bepaalde waarde heeft, kan deze dus ondertussen anders zijn, waardoor een test (onterecht) faalt.
Ook het tactisch plaatsen van sleep(1)
in de testcode en de desbetreffende forumcode om een zogenoemde second-rollover (zie kader) te forceren, kon het probleem niet reproduceren; de test bleef slagen. Dit was het moment waarop de developer besloot om niet met z’n hoofd tegen de muur te beuken, maar om even een pauze te nemen met een warme douche.
Met nog natte haren besloot hij om de second-rollover nog niet uit te sluiten. De developer plaatste de sleep(1)
-calls in de parser van Chronos en toen faalde de test wel. Het moeilijkste zat erop; de developer was in staat om de test consequent te laten falen. Met nog wat meer experimenteren leek het probleem echter alsnog onverklaarbaar. Het deed zich voor als de second-rollover plaatsvond vóórdat de test werd uitgevoerd, maar de test draaide in isolatie, dus dat leek onverklaarbaar.
Nog wat later, de haren waren ondertussen droog, viel het kwartje bij de developer. Voordat de test wordt gedraaid, wordt de database gevuld met testdata. Als de second-rollover tijdens het vullen plaatsvond, faalde de test. Het bleek dat de testdata dus zelf incorrect was, waardoor de test faalde. Met de test zelf en de onderliggende code was er dus geen enkel probleem.
Het probleem was daarna eenvoudig opgelost; de developer zorgde ervoor dat de datum in een variable werd geplaatst bij het genereren van de testdata. Hiermee slaagde de test consequent, second-rollover of niet, en was de flaky test verholpen.
En verder
- Alle Twitter-verwijzingen en iconen hebben we vervangen door X.
- Op basis van een succesvolle a/b-test hebben we de ankeilers op de frontpage aangepast. Het categorielabel is verwijderd en de labels voor prijzen, productreviews en forumtopics zijn verplaatst naar linksboven. Geschreven reviews met een video zijn voortaan te herkennen aan het kleine video-icoon naast de subtitel. Bij video-items wordt nog steeds het grote video-icoon getoond.
- Een andere verbetering aan de ankeilers zit in het prijslabel. Dit toont voortaan de prijs van de uitvoering die daadwerkelijk is getest, in plaats van de laagste prijs uit de productserie.
- Bij het aanpassen van een V&A-beoordeling verscheen een 403. Dat is nu opgelost.
- Tags met slashes geven geen 404 meer.
- Reacties van dezelfde dag worden weer getoond in je eigen reactieoverzicht, naar aanleiding van deze bugmelding.
- Dankzij een aantal optimalisaties geven zoekopdrachten als 'x' geen time-out meer.
- Als gevolg van aanhoudende problemen met Feedburner hebben we besloten om RSS-feeds vanaf nu vanuit onszelf te gaan serveren.
- Door een fout in de feeds van enkele webshops hadden we een aantal prijzen van (meer dan) 1 miljoen euro in de Pricewatch staan. Deze prijzen zijn verwijderd en vervolgens hebben we de prijshistorie ook hersteld, zodat de prijsgrafiek weer bruikaar is en deze producten niet onbedoeld als prijsdaling worden getoond.