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 einemThread.Sleep
und einemWriteLine
), dann habe ich kein Problem mehr, den Test zu Ende laufen - Wenn ich die
NewPack
Aktion aus derAccumulator.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 dieNewPack
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.
wiesdiese 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