BDD Testing for .Net

So I decided to add tests to my current project. I had Behaviour-Driven Tests (BDT) in the previous Scala-based implementation, so I wanted to see if I can get something similar for .Net.

I found Xunit.Gherkin.Quick, which uses Gherkin files to specify test cases (which they call features). These are natural-language style scripts, which translate to a set of function calls implemented in an accompanying test class. We’ll see how this works out.

Thus, I wrote the following feature file:

Feature: StoryNames
  As the client
  I can generate Url Names for Stories,
  so that I can use those in Urls.

  Scenario: Generate simple Url Name
    Given a scenario named "Helms Schlund"
    When I generate the urlname
    Then the urlname should be helms-schlund

And added this implementation class:

using Xunit;
using Xunit.Gherkin.Quick;

namespace GoodNight.Service.Domain.Test
{
  [FeatureFile("StoryNames.feature")]
  public sealed class StoryNames : Feature
  {
    private Domain.Story.Story story;

    private string urlname;

    [Given(@"a scenario named ""(.*)""")]
    public void CreateScenarioNamed(string name)
    {
      story = new Domain.Story.Story(name);
    }

    [When(@"I generate the urlname")]
    public void GenerateTheUrlname()
    {
      urlname = story.Urlname;
    }
  
    [Then(@"the urlname should be (.*)")]
    public void TheUrlnameShouldBe(string expected)
    {
      Assert.Equal(expected, this.urlname);
    }
  }
}

The test runner finds the implementation class, which references the feature file through the FeatureFile annotation. The feature parts get run through the various methods on the class.

I’m rather curious if this works out for larger test bases. The feature files to seem to promise a better overview over existing test cases.

Addendum 1: One advantage are the smaller amounts of repetition. It is much simpler to repeat “Given an input of “[…]” When parsed by the parser” than repeating the bit of code that stores the input, creates and calls the parser and checks the result for null. Possibly more savings in larger code examples, I’d wager.

Records in C#

C# 9.0 supports records: Classes that receive auto-generated functions that faciliate a value-like comparison behaviour. They are well-suited for immutability, i.e. to not change after creation.

The introductory page shows a couple of usage patterns:

Declaration via positional parameters:

public class Duck(int Age, string Name);

Construction just like regular classes:

var myPetDuck = new Duck(3, "Peter Pan");

Copy updates (“non-destructive mutation”):

var petersPetDuck = myPetDuck with { Name = "Linkerbell" };

This copy is a shallow-copy, i.e. reference values are copied and link to the same sub-object.

Still to check:

  • Pattern matching with records

Benefits of Structured Logging

StackOverflow notes this question about structured logging, also known as semantic logging: https://softwareengineering.stackexchange.com/questions/312197/benefits-of-structured-logging-vs-basic-logging

Structured Logging stores log entries not as simple strings, but as the placeholder strings along with the values to input there, for example:

log("User {username} reached request limit {limit} /s", "Grumpel", 200);

It names two advantages of structured logs:

  • Events are implicitly grouped. The format string operates as a group for the entries it produces.
  • Data values are kept as data. The limit above stays an integer, allowing to query the logs for all entries with e.g. limit > 150.

Git(Hub) default branch name is now ‘main’

So, a little late to the party, but today I found GitHub’s default branch name to be main instead of the previous master. The change happens to switch to a less hurtful language, as can be read e.g. on the IETF document Terminology, Power and Oppressive Language. GitHub themselves switches all their repositories. Time to follow up, so I’ll start by updating all my repositories as well.

Addendum: Well, things spread. Even Firefox renamed the browser’s master password to primary password. Nice to see.

Mosers Detektei: Verlorenes Gold

Das dubiose Ende der Columbia ist gelöst, und das Team um Hans Moser kann beruhigt aufatmen. Die Verantwortlichen bei der HAPAG wurden zur Rechenschaft gezogen, und für ein paar Tage kehrt willkommende Ruhe in Mosers Privatdetektei ein.

Aber natürlich währt diese nicht lange: Gerüchte über einen gefunden Goldschatz, angebliche Unregelmäßigkeiten in den dreieckigen Notizbüchern und von verstörenden Flugblättern verängstigte Bürger rufen nach der Aufmerksamkeit der Detektive. Und in all diese aufregenden Neuigkeiten platzt plötzlich Albert Ballin, der Generaldirektor der HAPAG, erneut in Mosers Detektivbüro, und bittet die Helden, seine einzige Tochter wiederzufinden…


Die Geschichte geht weiter! Aufbauend auf unserem letzten Abenteuer steigen wir in eine etwas längere Geschichte ein, ich rechne mit 2 bis 3 Abenden zu je ungefähr 3 Stunden Spielzeit. Zur Abstimmung habe ich eine Terminplanung für die nächsten Spielabende eingerichtet.

Das Abenteuer kann die Helden der vorigen Runde weiterführen, oder auch neue Gestalten in den Dienst der Detektei nehmen. Ebenso könnt ihr das Thema mit beeinflussen. Schreibt mir dazu bitte, ob ihr euren Charakter weiterspielen wollt bzw. was sich an ihm ändert, und ein Thema, eine Figur / Gruppe / Gegenstand / Ort oder ein Ereignis, dass ihr euch in dieser Welt spannend vorstellen könnt.

Und nicht zuletzt werden wir auch etwas tiefer in Turbo Fate einsteigen, und uns Gedanken um mehr Aspekte und Stunts Gedanken machen!

Das dubiose Ende der Columbia

Am letzten Freitag war es wieder soweit: Auf dem öffentlichen Pen&Paper-Spieleabend des Ludo Liubice haben sich vier unerschrockene Detektive zusammengefunden, um das Schicksal des Schnelldampfers Columbia ­– zusammen mit ihrem Schwesterschiff der ganze Stolz der Hamburg-Amerikanischen Packetfahrt-Actien-Gesellschaft – zu untersuchen: Denn das Schiff wurde kurz nach dem Einlaufen in den Hafen versenkt!

Die Gruppe, bestehend aus einem pensionierten Polizisten, einem Polizeianwärter, einer Schiffsingeneurin und einem Bankier, lies sich überhaupt nicht vom Generaldirektor Ballin verwirren, der die Schuld auf die Norddeutsche Lloyd schieben wollte. Schnell vermuteten sie: Versicherungsbetrug! So sammelten sie Indizen: Überlange Wartungsintervalle und eine zu hohe Versicherungspolice! Zuletzt führte die Spur der Attentäter mithilfe einer Phantomzeichnung vorbei am Rauferei-Verein und einem Bordell wieder zurück zum persönlichen Sekretär des Generaldirektors! So konnten die Helden nach knapp vier Stunden Spielzeit ihren Erfolg auch gebührend befeiern.

Das Regelsystem Turbo Fate blieb im Hintergrund, um die Spürnasen nicht aufzuhalten, und so war der Erfolg garantiert. Aber natürlich ist für ein gutes Detektivteam nie wirklich Feierabend…

Wer mehr Details wissen möchte, findet sie im ausführlichen Beitrag auf Ludo Liubice.

Uranium Chef: Surf & Turf!

Auf dem öffentlichen Ludo-Liubice-Pen&Paper-Abend gestern haben sich vier wackere Helden gefunden, die härteste Herausforderung in dieser Galaxie zu bestehen: Sie traten an, um Uranium Chef zu werden!

Uranium Chef ist die beliebteste Kochshow-slash-Gladiatorenarena im Neurovid! Der Gewinner jeder Saison hat die unglaubliche Chance, am Ende gegen den amtierenden Uranium Chef anzutreten, und damit den begehrten Titel für sich zu gewinnen. Die Kandidaten dieser Show waren:

  • Marcon, ein ehrgeiziger Space-Vampir, der sich als Sommelier einen Namen gemacht hat, und durch seine direkte, offene Art überzeugt,
  • Jamie Bombliver, einer der letzten Bewohner der radioaktiv verseuchten Erde, der die mutierten Lebensformen dort jagt und konsequent zum Experten am Grill aufgeschwungen hat,
  • Deliah Blue, ein Xenomorph vom Planeten Skorm und überzeugter Vegetarier, das wirklich nicht versteht, warum Leute vor ihm Angst haben, und
  • Messbot7337, nicht nur ein, sondern der Messbot, der sich in der Verköstigung von tausenden über tausenden Soldaten hervorgetan und sogar Anhänger unter unseren eigenen Cam-Bots hat!

Im Studio auf Khulinari 5 angekommen begrüßte Holly Go-Light-Wave die Herausforderer. Die exzentrische Inhaberin Maalu Miris, Oktogillionärin, rief direkt den ersten Wettstreit aus: Die Top-Chefs sollen ein 3-Gänge-Menü nach der Idee des historischen Surf&Turf erstellen, passend aus Geleehaien und Schwarzschild-Mambas. Besondere Herausforderung: Die Teilnehmer müssen in Teams arbeiten, und werden gemeinsam gewertet!

Jamie begann direkt, seine mitgebrachte Eulenbärin Susie mit Hilfe seines Teamkollegens Delilah fachgerecht zu zerlegen und ein Souflé mit gefüllter Eulenbärleber aufzusetzen. Delilah verschwand daraufhin aus dem Studio ­– wie es uns später mitteilte, um ein freundliches Wort mit den Preisrichtern zu wechseln.

Macron und Messbot7337 haben ebenfalls keine Zeit verloren: Macron stibitzte bereits vor Beginn einen Geleehai aus seinem Aquarium, und begann umgehend, daraus eine Geleehai-Grütze zu kreieren. Messbot7337, Experte für Karamell, erstellte dazu eine gezuckerte und flambierte Cremé auf Basis von Xeno-Blut, dass bei der Auseinandersetzung mit der Eulenbärin, nun, freigeworden ist. Auf diese Weise gut vorbereitet, startete das Team kurz vor Ende der Zeit einen taktischen Überfall auf ihre Konkurrenten, was unter anderem zu der ungewollten Zutat Xenomorph-Nase im Souflé führte.

Leider konnte das ultra-gut gebratene Eulenbärensteak, dass Jamie und Delilah als kreative Nachspeise kredenzten (die Smart-Kitchen-Appliance leugnet strickt, jemals von Messbot7337 gehört zu haben) unsere harten Richter Hapax Legomenon und Magarete Mangosteen nicht überzeugen; die würzigen Hackbällchen a-lá Mamba in herzhafter Maggi-Soja-Sauce des Teams Messbot7337 und Macron hingegen konnten die Extraportion Bonuspunkte verdienen.

Schalten Sie auch nächstes Mal ein, wenn die beiden Gewinner dann gegeneinander antreten, um vielleicht bald Uranium Chef werden zu können! Bis dahin empfehlen wir: “Slopnar Soda – Der Geschmack der bleibt!