2010-05-09 9 views
14

Chciałbym użyć NUnit do uruchamiania testów jednostkowych w mojej wtyczce, ale musi być uruchamiany w kontekście mojej aplikacji. Aby rozwiązać ten problem, starałem się opracować wtyczkę, która uruchamia NUnit, która z kolei wykona moje testy w kontekście aplikacji.Jak uruchomić NUnit z mojego kodu

nie znalazłem konkretnej dokumentacji na ten temat, więc wykopał kawałek informacji tu i tam i wyszedłem z poniższego fragmentu kodu (który jest podobny do jednego znalazłem tutaj w StackOverflow):

public static void Main() 
    { 
     SimpleTestRunner runner = new SimpleTestRunner(); 
     TestPackage package = new TestPackage("Test"); 
     string loc = Assembly.GetExecutingAssembly().Location 
     package.Assemblies.Add(loc); 
     if(runner.Load(package)) 
     { 
      TestResult result = runner.Run(new NullListener()); 
     } 
    } 

Zmienna wyniku mówi "nie ma TestFixture", chociaż wiem na pewno, że tam jest. W rzeczywistości mój plik testowy zawiera dwa testy.

Używanie innego podejścia znalazłem, która jest streszczona przez następujący kod:

TestSuiteBuilder builder = new TestSuiteBuilder(); 
TestSuite testSuite = builder.Build(package); 

// Run tests 
TestResult result = testSuite.Run(new NullListener(), NUnit.Core.TestFilter.Empty); 

widziałem NUnit struktur danych z tylko 1 badanie i miałem ten sam błąd.

Dla większej kompletności używam najnowszej wersji nunit, która jest 2.5.5.10112.

Czy ktoś wie, czego mi brakuje? Kod przykładowy byłby doceniony. Moja Klasa testu jest:

[TestFixture] 
public class UnitTests 
{ 
    public UnitTests() 
    { 
    } 

    [Test] 
    public void TestEqual() 
    { 
     long a = 10; 
     long b = 10; 
     Assert.AreEqual(a, b); 
    } 

    [Test] 
    public void TestNotEqual() 
    { 
     long a = 10; 
     long b = 11; 
     Assert.AreNotEqual(a, b); 
    } 
} 
+1

można zbudować mały, ale kompletny program + wtyczki i pokazać nam kod, który replikuje problem? A może możesz opublikować plik klasy swojej wtyczki, którą próbujesz przetestować? –

+0

Czy to możliwe, że twoja wtyczka jest skompilowana z inną wersją NUnit? Rozumiem, że nie jest to z tego, co napisałeś w pytaniu, ale nadal ... spowodowałoby to, że typy atrybutów byłyby niezgodne. –

+0

jeśli zrobię Console.WriteLine (loc), wypisze nazwę konsoli exe. Próbowałem załadować bibliotekę klasy i dostałem "Access is denied". Następnie, gdy robię Console.WriteLine (result.ResultState), drukuje "Inconclusive". W jaki sposób otrzymujesz komunikat "nie ma textfixture"?Również w jaki sposób sprawdzić, czy to faktycznie ładowanie biblioteki testowej. Być może brakuje mi tu czegoś oczywistego. –

Odpowiedz

9

ja pisał moje pytanie na forum NUnit i Charlie dał mi wskazówkę, w jaki sposób znaleźć problem. Myślę, że dobrym pomysłem byłoby opublikowanie go tutaj, aby inni mogli zapobiec spędzeniu go dużo czasu. Rozwiązaniem było zainicjowanie podstawowych usług najpierw za pomocą następującej linii:

CoreExtensions.Host.InitializeService(); 

dziękuję wszystkim.

1

Miałem też wiele problemów z klasą SimpleTestRunner(). Na koniec przełączyłem się na klasę RemoteTestRunner() dla programowego wykonywania testów jednostkowych. Implementacja jest znacznie łatwiejsza i najlepsza ze wszystkich działa.

TestPackage package = new TestPackage(@"C:\YourProject.Tests.dll"); 
RemoteTestRunner remoteTestRunner = new RemoteTestRunner(); 
remoteTestRunner.Load(package); 
TestResult result = remoteTestRunner.Run(new NullListener()); 

Trzeba odwoływać się następujące zespoły:

  • nunit.core.dll
  • nunit.core.interfaces.dll

I oczywiście nunit.framework.dll musi znajdować się w folderze ze swoim zespołem badawczym.

+0

Powinieneś przekazać do remoteTestRunner.Run jakiś rodzaj detektora zdarzeń w celu przechwycenia danych wyjściowych z przypadków testowych. Każdy przykład, który widziałem w Internecie, wykorzystuje NullListener (w tym twój), który nie przechwyciłby danych wyjściowych. Czy masz pojęcie, jak skonfigurować detektor zdarzeń do przechwytywania wyjścia? – Justin

+0

Czy dane wyjściowe "TestResult" nie wystarczą? Czego ci brakuje? –

13

Poniższy kod pomóc rozwiązać ten problem

public static void Main() 
{ 
    CoreExtensions.Host.InitializeService(); 
    SimpleTestRunner runner = new SimpleTestRunner(); 
    TestPackage package = new TestPackage("Test"); 
    string loc = Assembly.GetExecutingAssembly().Location; 
    package.Assemblies.Add(loc); 
    if(runner.Load(package)) 
    { 
     TestResult result = runner.Run(new NullListener(), 
      TestFilter.Empty, false, LoggingThreshold.Off); 
    } 
} 
+0

Działa dla mnie od NUnit 2.6.3. Aby zdiagnozować niektóre problemy podczas uruchamiania testów, pisanie wyników może być użyteczne: 'nowy XmlResultWriter (@" C: \ Temp \ TestResult.xml "). SaveTestResult (wynik)' – ceztko

+0

Podczas próby uruchomienia testów w moim własnym zestawie, otrzymuję błąd z informacją, że brakuje funkcji nunit.core. Dodałem pakiety NUnit' i 'NUnit Test Adapter' z nuget i chociaż nunit.core pojawia się na liście referencji, kod nie może go znaleźć .. – Ziv

Powiązane problemy