Question

Disons que j'ai un travailleur d'arrière-plan dans une classe qui effectue une requête de base de données dans un thread d'arrière-plan.

je veux tester cette classe

alors je me moque de ma base de données et retourne une collection jusqu'ici tout va bien, assurez-vous que mon travailleur de fond appelé le do work et que je veux m'assurer que la fin est aussi arrivée.

J'ai remarqué que le test réussissait et échouait de manière aléatoire (je pense que cela a quelque chose à voir avec les threads)

des suggestions

Était-ce utile?

La solution

Vous pouvez avoir une situation de concurrence critique entre le thread d'arrière-plan et l'assert / vérifie.

Par exemple:

[Test]
public void TestWithRaceCondition()
{
    bool called = false;
    new Thread(() => called = true).Start();
    Assert.IsTrue(called);
}

Le fil ne se termine pas nécessairement avant les assertions, parfois il le sera et parfois non. Une solution à ce problème consiste à rejoindre le fil d’arrière-plan:

[Test]
public void TestWithoutRaceCondition()
{
    bool called = false;
    var thread = new Thread(() => called = true);
    thread.Start();
    thread.Join()
    Assert.IsTrue(called);
}

Une façon de vérifier s'il s'agit d'une condition de concurrence critique est de retarder le thread de test (appelez Thread.Sleep pendant une longue période juste avant l'assertion) et si le test cesse d'échouer, c'est une bonne indication de la condition de concurrence critique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top