Laden...

NUnit 3.2 mit VS 2013 Express - GUI Runner gesucht

Erstellt von Blaster vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.784 Views
B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 8 Jahren
NUnit 3.2 mit VS 2013 Express - GUI Runner gesucht

Hallo!

In der aktuellle Version von NUnit 3.2 steige ich in der Struktur leider nicht mehr durch.
Mittlerweise wurde ja ein VS Adapter für NUnit entwickelt, der wird aber nur für die kostenpflichtigen Versionen VS Express 2012+ unterstützt. Was ich suche ist mehr die alten NUnit.exe Runner und die Mini-GUi Versionen:
http://www.nunit.org/index.php?p=nunit-gui&r=2.5
Weiß einer, wo ich die /bin davon downloaden kann. Ich meine nicht den source code:
https://github.com/xunit/xunit

Mittlerweise habe ich das Tool gefunden
http://testdriven.net/quickstart.aspx
Aber für $169 für eine prof. Lizenz finde ich für eine GUI schon ganz schön teuer.
Hat damit schon jemand gearbeitet?

Wie komme ich an einem gescheiten GUI/Runner Tool für die obrige Umgebung? Was könnt Ihr empfehlen? - Danke.

F
10.010 Beiträge seit 2004
vor 8 Jahren

Da sind bei dir aber ziemlich viele Informationen durcheinander.

  1. Das NUnit keinen Adapter für Express hat, liegt daran das Express keine Addins unterstützt, nicht an NUnit

  2. XUnit und NUnit sind zwei vollkommen unterschiedliche Produkte.

  3. Wenn ich "nunit gui 3" in die suchmaschine meiner Wahl eintrage ist der erste Punkt eine Diskussion auf googlegroups der (weiter unten ) zu einer GUI auf Github verweist ( was der dritte link in der suche gewesen wäre).

  4. Warum die veraltete 2012 Express wenn du auch 2015 CE benutzen kannst die auch addins unterstützt?

B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 8 Jahren

Hi FZelle,

danke für Deine Antworten.

Zu 2: Ja, weiß ich. Aber die GUI kann funktionieren, wenn der Export der API für XUnit und NUnit gleich ist oder eingestellt werden kann.

zu 4: VS 2015 CE werde ich mir anschauen, aber unsere "Dienstanweisung" lautet keine Cloud-Entwicklung. Deshalb uss ich mir erst mal anehen wie Cloud arbeitet.

zu 3: Lese ich mir danach durch.

Grüße
Blaser

T
314 Beiträge seit 2013
vor 8 Jahren

CEsteht nicht für Cloud Edition sondern Community Edition 😃

16.842 Beiträge seit 2008
vor 8 Jahren

Die .NET Welt und die Technologien von Microsoft orientieren sich aufgrund Cross-Plattform eher in Richtung XUnit. Die Macher kommen von NUnit.
XUnit ist Open Source (Apache), kostenlos und muss nicht extern installiert werden; alles kommt über NuGet Pakete - auch die verschiedenen Runner.

Das nur als Hinweis und Tipp.

  1. Warum die veraltete 2012 Express wenn du auch 2015 CE benutzen kannst die auch addins unterstützt?

Community Edition hat Beschränkungen, die in der Regel bereits mittelgroße Firmen nicht erfüllen.
Umsatz (auch die der Mutterunternehmen) maximal 1 Mio Euro und maximal 250 PCs im Unternehmen (Außer für Open Source Projekte und akademische Zwecke).
1 Mio Euro überschreitet man oft schon mit 10 Mitarbeitern.

Express unterstützt aber keine Erweiterungen.
Mit diesen Beschränkungen muss man leben und eben das Geld in ein VS-Abo oder eine VS-Lizenz investieren.
Man entwickelt damit schließlich Produkte.

B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 8 Jahren

Danke für die Tipps.

Habe jetzt VS 2015 CE aufgespielt und mit NuGet den NUnit Adapter geladen und eingebunden.
In der Ausgabe-Shell von VS CE wird der UnitTest ausgeführt, aber von der schönen Unit Test Explorer Ansicht keine Spur:
http://nunit.org/index.php?p=vsTestAdapter&r=2.6
Auch in der in der Hauptmenue-Leiste ist Unit Test nicht zu sehen. Weiß einer wieso?

Das mit der Bedingung unter 1M € Umsatz ist ein Problem.
XUnit habe ich noch nicht ausprobiert.
Aber das ursprüngliche Problem ist die GUI Anbindung an VS Express 2013.
Muss nächste Woche mal mit den EK über Volllizenzen reden ...

74 Beiträge seit 2014
vor 8 Jahren

Sowohl NUnit als auch xUnit.net haben jeweils einen VS Runner, den man über NuGet installieren kann. Hier ist das Package für NUnit. So braucht nicht jeder Entwickler das Plugin installieren und das Projekt ist etwas mehr self-contained.

B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 8 Jahren

Sowohl NUnit als auch xUnit.net haben jeweils einen VS Runner, den man über NuGet installieren kann.
>
ist das Package für NUnit. So braucht nicht jeder Entwickler das Plugin installieren und das Projekt ist etwas mehr self-contained.

Genau das hatte ich ja gemacht! - Der optische Efekt war nicht gegeben.

74 Beiträge seit 2014
vor 8 Jahren

Hast du auch das Fenster "Testexplorer" geöffnet? So wie hier gezeigt?

B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 8 Jahren

Hallo zusammen!

Hier nochmal einen abschließenden Bericht über die gemachte Erfahrungen:

  1. Ich kann ein Upgrade auf VS 2015 CE empfehlen. Eine kommerzielle Lizenz VS 2015 Enterprise gekauft ca. $6000/ geleased $3000/y ,$250/m. Die Installation über den NuGet Manager ist einfach nur cool. Die Diagnosetools die man dann zur Verfügung hat sind großartig. Ist auch nicht so cloud-gierig wie angenommen. Firewall unterdrückt, es wenn nötig ist.

  2. Wenn man NUnit verwenden will, das Testprojekt im Konfig-Manager auf x86 Plattform einstellen, sonst gibt es Konflikte mit der Nunit.framework.dll

  3. Wichtig bei der Installation: Nicht die unten die Konsole des Package-Managers, die Optionen unter Extras-> GetNu Manager oder Extras-> Tool- und Erweiterungsmanager nutzen, sondern
    a) nutzt den Projektmapen-Explorer
    b) Rechts-click auf Eurer Projekt
    c) Links-click auf "NuGet Parkete verwalten"
    d) rechts oben in dem Suchfeld "Nunit" oder "XUnit" eingeben
    e) dann findet Ihr alle konfigurationsgerechten Frameworks, Runner, Konsolen etc und müsst nicht erst über die Projekt HPs gehen und könnt direkt installieren.

Ich weiß nicht, warum es über die anderen Wege nicht funktioniert hat.

4)XUNit scheint in der Tat mehr Unterstützung zu erfahren als NUnit.
http://xunit.github.io/
http://xunit.github.io/docs/getting-started-desktop.html
http://xunit.github.io/docs/comparisons.html

Der Test Explorer zeigt dann die Testergebnisse in beiden Fällen schön an.

Technisch habe noch ein kleines Problem, weil ich eine .exe teste.
Kennt Ihr zum Thema IPC und Mocks, Shunts und Hubs zum Unit Testing vielleicht schöne Tuts für VS 2015?
Danke.

16.842 Beiträge seit 2008
vor 8 Jahren

Eine kommerzielle Lizenz VS 2015 Enterprise gekauft ca. $6000/ geleased $3000/y ,$250/m.

Die Preise für VS starten bei 45$ für die Pro Version als Abo bzw. 500$ als Kaufvariante ohne Azure-Benefits.
Die Enterprise-Variante benötigen nur die wenigsten; und gerade wegen des Preises haben das auch nur die wenigsten.

  1. Wichtig bei der Installation: Nicht die unten die Konsole des Package-Managers, die Optionen unter Extras-> GetNu Manager oder Extras-> Tool- und Erweiterungsmanager nutzen, sondern
    a) nutzt den Projektmapen-Explorer

Der NuGet Package Explorer nutzt die gleiche Exe für das Installieren des Pakets wie Package Manager CLI.

Ich weiß nicht, warum es über die anderen Wege nicht funktioniert hat.

Vermutlich lags am Nutzer, denn die meisten nutzen i.d.R. nur die CLI Variante 😉
Den NuGet Explorer hab ich ewig nicht mehr benutzt und ich hab nie Probleme damit (nur als Hinweis).

Kennt Ihr zum Thema IPC und Mocks, Shunts und Hubs zum Unit Testing vielleicht schöne Tuts für VS 2015?

Das ist kein spezifisches Thema für VS2015, sondern einfach .NET.

Und Moq ist sehr verbreitet bei C#/.NET für Mocking. Was genau meinst Du mit Shunts und Hubs?
Das kenn ich nur im Zusammenhang von Whitebox Tests, was nochmal ein anderer Kapitel ist. Oder meinst Du Stubs & Moles?

NUnit vs. XUnit:
ich vermute, dass NUnit nicht mehr soo lange eine Rolle in .NET spielen wird.
Die Richtung geht ganz klar XUnit (sowie weiterhin MSBuild, wobei das eben nicht X-plat ist).

B
Blaster Themenstarter:in
66 Beiträge seit 2013
vor 8 Jahren

Kennt Ihr zum Thema IPC und Mocks, Shunts und Hubs zum Unit Testing vielleicht schöne Tuts für VS 2015?
Das ist kein spezifisches Thema für VS2015, sondern einfach .NET.

Und Moq ist sehr verbreitet bei C#/.NET für Mocking. Was genau meinst Du mit Shunts und Hubs?
Das kenn ich nur im Zusammenhang von Whitebox Tests, was nochmal ein anderer Kapitel ist. Oder meinst Du Stubs & Moles?

War auch Stubs, nicht Shunts... war ja SW, statt HW. Sorry.🙂
Edit: Stopp! Zurück! 8) Es gibt im TDD auch Self Shunts. Nicht nur HW:
http://whiteboxtest.com/Test-Pattern-SelfShunt.php

Stub-Objekte; "Mitwirkende Objekte, die selbst nicht direkt getestet werden sollen und von denen wir unter Umständen auch nicht wissen, ob sie wirklich funktionieren, werden zur Isolation im Test durch Imitationen ersetzt ("Dummy") ." [Frank Westphal - Testgetriebene Entwicklung mit Junit & FIT (2006)] - http://www.frankwestphal.de/ftp/Westphal_Testgetriebene_Entwicklung.pdf
Stub (Programmierung)

Hub:
Hub and Spoke
IPC wird wohl ein Kampf werden.

MOQ werde ich mit mal anschauen. Danke,
Die Preise habe ich worst case angenommen, bei A.-Karte zur Kompartibilität.
Die XUnit Tests nutzen den NUnit VS Adaper be mir ... wohl einfach nur die Tags ausgetauscht
Lag wirklich am Nutzer (DAU). 👅

Sitze i.M. an der Archtektur für die Datenübertragung der Test Suite...

Noch einen abschießenden Bericht zu IPCs:

=============================================
Notiz an die Küche - Xunit 2.1 mit WPF und Multi-Threading - 30/3/15
=============================================
Die V2.1 kennt die Timeout Funktion nicht mehr. Daher kann man das Threading Modell nicht mehr mit diesen Hack auf ein STA-Thread (Single-Thread-Appartment - s. COM+) drücken:
http://haacked.com/archive/2014/11/20/xunit-and-sta/
Der Author hat das Problem in einer Weiterentwicklung, die V2.2 beta1 genannt wird, gelöst
https://github.com/xunit/xunit/issues/103
Das letzte Release des Codes ist hier zu finden:
https://github.com/xunit/samples.xunit
Dort findet Ihr viele praktische Beispiele zur XUnit 2.2.

Hier ein von mir erweiterter Beispielcode für Testen von Multithreading und WPF des Testbeispiele des Autors:


using System.Threading;
using System.Threading.Tasks;
using Xunit;
using xxxxxxx; / meine App .exe (noch)

namespace STAExamples
{
    public class Samples
    {
        [Fact]
        public static void Fact_OnMTAThread()
        {
            
            Assert.Equal(ApartmentState.MTA, Thread.CurrentThread.GetApartmentState());
        }

        [WpfFact]
        public static async void WpfFact_OnSTAThread()
        {
            
            Assert.Equal(ApartmentState.STA, Thread.CurrentThread.GetApartmentState());
            await Task.Yield();
            Assert.Equal(ApartmentState.STA, Thread.CurrentThread.GetApartmentState()); // still there
        }

        [WpfTheory]
        [InlineData(0)]
        public static async void WpfTheory_OnSTAThread(int unused)
        {
            Assert.Equal(ApartmentState.STA, Thread.CurrentThread.GetApartmentState());
            await Task.Yield();
            Assert.Equal(ApartmentState.STA, Thread.CurrentThread.GetApartmentState()); // still there
        }

        [WpfTheory]
        [InlineData(26)]
        public static async void MyMediatorThreadTest_OnSTAThread(int zahl)
        {
            yyyyyyyyy uT_BCM = new yyyyyyyyy(); // Klasse in meiner App
            string temp = uT_BCM.UnitTestCheck(zahl); // um erst mal nicht am Sichbarkeitsbereich zu fummeln. Gibt +10 als String zurück.

            Assert.Equal(ApartmentState.STA, Thread.CurrentThread.GetApartmentState());
            await Task.Yield();
            Assert.Equal(ApartmentState.STA, Thread.CurrentThread.GetApartmentState()); // still there
            Assert.Equal("36", temp);
        }

        [WpfTheory]
        [InlineData(26)] // Test schlägt einzig und allein fehl
        [InlineData(27)]
        public static /* async */ void MyMediatorTest_OnSTAThread(int zahl)
        {
            // Threadeinfluß ausnehmen
            yyyyyyyyy uT_BCM = new yyyyyyyyy(); 
            string temp = uT_BCM.UnitTestCheck(zahl);
                       
            // await Task.Yield();
            
            Assert.Equal("37", temp);
        }
    }
}

/* Unterstützende Klassen des Autors 
 * Haacked in de er die SDK nutzt */

using System;
using Xunit;
using Xunit.Sdk;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
[XunitTestCaseDiscoverer("STAExamples.WpfFactDiscoverer", "STAExamples")]
public class WpfFactAttribute : FactAttribute { }

// --------------------------------

using System.Collections.Generic;
using System.Linq;
using Xunit.Abstractions;
using Xunit.Sdk;

namespace STAExamples
{
    public class WpfFactDiscoverer : IXunitTestCaseDiscoverer
    {
        readonly FactDiscoverer factDiscoverer;

        public WpfFactDiscoverer(IMessageSink diagnosticMessageSink)
        {
            factDiscoverer = new FactDiscoverer(diagnosticMessageSink);
        }

        public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
        {
            return factDiscoverer.Discover(discoveryOptions, testMethod, factAttribute)
                                 .Select(testCase => new WpfTestCase(testCase));
        }
    }
}

//-------------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;
using Xunit.Abstractions;
using Xunit.Sdk;

namespace STAExamples
{
    /// <summary>
    /// Wraps test cases for FactAttribute and TheoryAttribute so the test case runs on the WPF STA thread
    /// </summary>
    [DebuggerDisplay(@"\{ class = {TestMethod.TestClass.Class.Name}, method = {TestMethod.Method.Name}, display = {DisplayName}, skip = {SkipReason} \}")]
    public class WpfTestCase : LongLivedMarshalByRefObject, IXunitTestCase
    {
        IXunitTestCase testCase;

        public WpfTestCase(IXunitTestCase testCase)
        {
            this.testCase = testCase;
        }

        /// <summary/>
        [EditorBrowsable(EditorBrowsableState.Never)]
        [Obsolete("Called by the de-serializer", error: true)]
        public WpfTestCase() { }

        public IMethodInfo Method
        {
            get { return testCase.Method; }
        }

        public Task<RunSummary> RunAsync(IMessageSink diagnosticMessageSink,
                                         IMessageBus messageBus,
                                         object[] constructorArguments,
                                         ExceptionAggregator aggregator,
                                         CancellationTokenSource cancellationTokenSource)
        {
            var tcs = new TaskCompletionSource<RunSummary>();
            var thread = new Thread(() =>
            {
                try
                {
                    // Set up the SynchronizationContext so that any awaits
                    // resume on the STA thread as they would in a GUI app.
                    SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext());

                    // Start off the test method.
                    var testCaseTask = this.testCase.RunAsync(diagnosticMessageSink, messageBus, constructorArguments, aggregator, cancellationTokenSource);

                    // Arrange to pump messages to execute any async work associated with the test.
                    var frame = new DispatcherFrame();
                    Task.Run(async delegate
                    {
                        try
                        {
                            await testCaseTask;
                        }
                        finally
                        {
                            // The test case's execution is done. Terminate the message pump.
                            frame.Continue = false;
                        }
                    });
                    Dispatcher.PushFrame(frame);

                    // Report the result back to the Task we returned earlier.
                    CopyTaskResultFrom(tcs, testCaseTask);
                }
                catch (Exception e)
                {
                    tcs.SetException(e);
                }
            });

            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            return tcs.Task;
        }

        public string DisplayName
        {
            get { return testCase.DisplayName; }
        }

        public string SkipReason
        {
            get { return testCase.SkipReason; }
        }

        public ISourceInformation SourceInformation
        {
            get { return testCase.SourceInformation; }
            set { testCase.SourceInformation = value; }
        }

        public ITestMethod TestMethod
        {
            get { return testCase.TestMethod; }
        }

        public object[] TestMethodArguments
        {
            get { return testCase.TestMethodArguments; }
        }

        public Dictionary<string, List<string>> Traits
        {
            get { return testCase.Traits; }
        }

        public string UniqueID
        {
            get { return testCase.UniqueID; }
        }

        public void Deserialize(IXunitSerializationInfo info)
        {
            testCase = info.GetValue<IXunitTestCase>("InnerTestCase");
        }

        public void Serialize(IXunitSerializationInfo info)
        {
            info.AddValue("InnerTestCase", testCase);
        }

        private static void CopyTaskResultFrom<T>(TaskCompletionSource<T> tcs, Task<T> template)
        {
            if (tcs == null)
                throw new ArgumentNullException("tcs");
            if (template == null)
                throw new ArgumentNullException("template");
            if (!template.IsCompleted)
                throw new ArgumentException("Task must be completed first.", "template");

            if (template.IsFaulted)
                tcs.SetException(template.Exception);
            else if (template.IsCanceled)
                tcs.SetCanceled();
            else
                tcs.SetResult(template.Result);
        }
    }
}

//----------------------------------------------------------

using System;
using Xunit;
using Xunit.Sdk;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
[XunitTestCaseDiscoverer("STAExamples.WpfTheoryDiscoverer", "STAExamples")]
public class WpfTheoryAttribute : TheoryAttribute { }

// -----------------------------------------------------------------

using System.Collections.Generic;
using System.Linq;
using Xunit.Abstractions;
using Xunit.Sdk;

namespace STAExamples
{
    public class WpfTheoryDiscoverer : IXunitTestCaseDiscoverer
    {
        readonly TheoryDiscoverer theoryDiscoverer;

        public WpfTheoryDiscoverer(IMessageSink diagnosticMessageSink)
        {
            theoryDiscoverer = new TheoryDiscoverer(diagnosticMessageSink);
        }

        public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
        {
            return theoryDiscoverer.Discover(discoveryOptions, testMethod, factAttribute)
                                   .Select(testCase => new WpfTestCase(testCase));
        }
    }
}

NUint 3.2 wird in der VS 2015 CE mit dem VS Adapter nicht ausreichend unerstützt, wie in:
http://nunit.org/index.php?p=requiresSTA&r=2.6.3
Aber das kann am User liegen ! 😁
===========================================================

Grüße
Blaster