2016-06-16 25 views
1

Einigen Kontext ersten: Ich arbeite an einem mutation testing tool for C# + NUnit, und aus Gründen der Geschwindigkeit Ich bin eine interne Klasse von NUnit 2.6.4 Kernbaugruppe mit (RemoteTestRunner) zu run tests (siehe die DoTests Methode am unteren Rand) in einer separaten AppDomain.Endlosschleife bei Verwendung eines RemoteTestRunner mit optimierten Unit-Test-Code

Das Problem: Ich habe einen Komponententest, der eine Variable abfragt, bis sie nicht null wird. Diese Variable wird einem Dictionary als null zugewiesen und dann einem realen Wörterbuch durch eine Aktion neu zugeordnet, die von einem Timer ausgelöst wird. Wenn die Testbaugruppe mit Codeoptimierung erstellt wird, endet sie nie. Der problematische Code:

[Test] 
public void WeirdOne() 
{ 
    using (var accumulator = new Accumulator<string>(5, TimeSpan.FromMilliseconds(500))) 
    { 
     Dictionary<int, string> pack = null; 
     accumulator.NewPack += p => pack = p; 
     accumulator.Add("D"); 
     accumulator.Add("A"); 
     accumulator.Add("M"); 
     accumulator.Add("N"); 

     while (pack == null) ; 

     Assert.That(pack.Count, Is.EqualTo(4)); 
    } 
} 

Here ein Kern mit dem Accumulator implem, wenn nötig.

Was ich gefunden:

  • Wenn ich etwas in der while Schleife setzen (getestet mit einem Thread.Sleep und einem WriteLine), dann habe ich kein Problem mehr, den Test zu Ende laufen
  • Wenn ich die NewPack Aktion aus der Accumulator.Add Methode auslösen, geht der Test zum Ende
  • Nur um sicherzustellen, dass der Timer effektiv seine Arbeit macht, habe ich versucht, nur eine File.Create() hinzuzufügen bevor Sie die NewPack Aktion aufrufen. Die Datei wurde erstellt, mit oder ohne Code-Optimierung
  • Kein Problem beim Start mit nunit-Konsole (2.6.2/2.6.4), mit oder ohne Optimierung

Seit NUnit diese starten und auf dem Sprung Ich vermute, dass mir etwas fehlt, wenn ich die Umgebung von RemoteTestRunnner instanziiere.

Tritt jemand dieser Art debug/Release Build-Problem? Irgendwelche Hinweise darauf, was ich vermisse?

Danke fürs Lesen!

bearbeiten: Wie von Aleksey L.

wies

diese Variable als Instanz Feld definieren und als flüchtige

die Endlosschleife vermeiden, aber immer noch keinen Hinweis darüber, wie nunit- markieren Konsole funktioniert das

Antwort

2

Vielleicht Prozessor ist Caching pack Wert als null. Versuchen Sie diese Variable als Instanzfeld zu definieren und markieren Sie sie als volatile (auf der sicheren Seite). Obwohl dies nicht erklärt, warum Kein Problem beim Start mit Nunit-Konsole (2.6.2/2.6.4), mit oder ohne Optimierung