Domanda

diciamo che ho un lavoratore in background in una classe che esegue query db in un thread in background.

Voglio testare questa classe

quindi prendo in giro il mio db e restituisco un po 'di raccolta finora così bene, assicurati che il mio background worker abbia chiamato do do work e poi voglio assicurarmi che anche il traguardo sia avvenuto.

Ho notato che il test passa e fallisce in modo casuale (penso che abbia qualcosa a che fare con i thread)

eventuali suggerimenti

È stato utile?

Soluzione

Potresti avere una condizione di competizione tra il thread in background e gli assert / verifica.

Ad esempio:

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

Il thread non finisce necessariamente prima delle affermazioni, a volte lo farà e a volte no. Una soluzione a questo caso è quella di unire il thread in background:

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

Un modo per verificare se si tratta di una condizione di gara è ritardare il thread di test (chiamare Thread.Sleep per lungo tempo appena prima dell'asserzione) e se il test smette di fallire, questa è una buona indicazione per le condizioni di gara.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top