Der Komponententest schlägt bei "Alle ausführen" fehl, jedoch nicht bei "Ausgewählte Tests ausführen", wenn alle ausgewählt sind

Ich bekomme ein komisches Verhalten. Wenn ich im Test Explorer auf "Alle ausführen" klicke, schlägt einer meiner Komponententests fehl. Wenn ich jedoch alle Tests auswähle und auf "Ausgewählte Tests ausführen" klicke, besteht der Komponententest.

Der fehlgeschlagene Test löst einen Reflexionsfehler aus:System.Reflection.TargetException: Non-static method requires a target. auf einem Typ, der im DLL-Code definiert ist, den ich teste. An der Klasse scheint nichts Seltsames zu sein - in der DLL sind viele andere Klassen definiert, mit denen Reflection zufrieden ist. Ich habe den Teststapel-Trace unten eingefügt.

Hinweis: Es ist ein komplexer Test - er liest Eingaben und erwartete Antworten aus einer XLSX-Datei, füllt eine LocalDb mit Daten aus der XLSX-Datei, führt eine Berechnung anhand der Daten in der LocalDB durch und vergleicht die berechneten mit den erwarteten Werten. Aber wie gesagt, es funktioniert und funktioniert, wenn ich alle Tests durchführe (mit Alles auswählen> Ausgewählten Test ausführen).

Was ist anders an Run All? Alle Einsichten wäre dankbar.

Ich habe ein sauberes versucht und ohne Glück wieder aufgebaut. Reflexionsfehler beim Abfangen und Protokollieren zeigen an, dass der GetValue-Aufruf für jede Eigenschaft ausgelöst wird, auf die ich versuche, auf den Typ zuzugreifen - aber nur, wenn sie von "Run All" und nur auf diesem einen Typ ausgeführt wird? (Wenn ich den Fehler abfange, sind alle GetValues ​​bei allen anderen Typen erfolgreich).

Stack Trace

Test Name:  IT_CheckCashOnly1DepositOutputValues
Test FullName:  Lib.AE.Tests.Integration.CalculationTests.IT_CheckCashOnly1DepositOutputValues
Test Source:    c:\netreturn.co.za\Main\NetReturn\Lib.AE.Tests\IntegrationTests\CalculationTest.cs : line 23
Test Outcome:   Failed
Test Duration:  0:00:00.1661906

Result Message: 
Test method Lib.AE.Tests.Integration.CalculationTests.IT_CheckCashOnly1DepositOutputValues threw exception: 
System.Reflection.TargetException: Non-static method requires a target.
Result StackTrace:  
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at Lib.AE.Xlsx.XlsxHelper.Compare[T](T expected, T calculated, ExcelWorksheet ws, Int32 r, Int32 colStart, Boolean& valid) in c:\netreturn.co.za\Main\NetReturn\Lib.AE\Xlsx\XlsxHelper.cs:line 101
at Lib.AE.Xlsx.XlsxWorkSheet_SharePNL.CompareXlsx(ExcelPackage pck, List`1 expectedXlsx, ValuationCalculation calc) in c:\netreturn.co.za\Main\NetReturn\Lib.AE\Xlsx\XlsxSharePNL.cs:line 143
at Lib.AE.Tests.Integration.CalculationTests.CheckCalculationResults(String xlsxDocToLoad, WorkSheets testingScenarios) in c:\netreturn.co.za\Main\NetReturn\Lib.AE.Tests\IntegrationTests\CalculationTest.cs:line 64
at Lib.AE.Tests.Integration.CalculationTests.IT_CheckCashOnly1DepositOutputValues() in c:\netreturn.co.za\Main\NetReturn\Lib.AE.Tests\IntegrationTests\CalculationTest.cs:line 23
Lösung

Dies stellte sich als (a) mein Problem heraus - mein Einheitentest, der mit einem anderen Einheitentest geteilt wurde, und (b) ein Bestellproblem. Beachten Sie, dass nicht klar ist, in welcher Reihenfolge TestExplorer Ihre Tests ausführt. Ich habe ein neues UnitTestProject mit 2 x UnitTest .cs-Dateien und jeweils drei TestMethods erstellt, d. H .:

UnitTest1.cs

    [TestMethod]
    public void ONE_AAA() {}

    [TestMethod]
    public void ONE_BBB() {}

    [TestMethod]
    public void ONE_CCC() {}

UnitTest2.cs

    [TestMethod]
    public void TWO_CCC() {}

    [TestMethod]
    public void TWO_BBB() {}

    [TestMethod]
    public void TWO_AAA() {}

Führen Sie diese Tests dann mit zwei Methoden aus, d. H. (1) Alle ausführen (2) Alle auswählen und Ausgewählte Tests ausführen, und protokollieren Sie die Reihenfolge, in der die Tests von TestExplorer gestartet wurden. Die Ergebnisse für die Ausführung ausgewählter Tests sind ziemlich uninteressant:

-- Run All
2013-01-16 11:53:47.4062 INFO TestInitialize: ONE_AAA
2013-01-16 11:53:47.4122 INFO TestCleanup: ONE_AAA
2013-01-16 11:53:47.4122 INFO TestInitialize: ONE_BBB
2013-01-16 11:53:47.4122 INFO TestCleanup: ONE_BBB
2013-01-16 11:53:47.4122 INFO TestInitialize: ONE_CCC
2013-01-16 11:53:47.4282 INFO TestCleanup: ONE_CCC
2013-01-16 11:53:47.4282 INFO TestInitialize: TWO_CCC
2013-01-16 11:53:47.4282 INFO TestCleanup: TWO_CCC
2013-01-16 11:53:47.4282 INFO TestInitialize: TWO_BBB
2013-01-16 11:53:47.4282 INFO TestCleanup: TWO_BBB
2013-01-16 11:53:47.4282 INFO TestInitialize: TWO_AAA
2013-01-16 11:53:47.4282 INFO TestCleanup: TWO_AAA

-- Select All > Run Selected
2013-01-16 11:55:26.0139 INFO TestInitialize: TWO_BBB
2013-01-16 11:55:26.0139 INFO TestCleanup: TWO_BBB
2013-01-16 11:55:26.0249 INFO TestInitialize: ONE_BBB
2013-01-16 11:55:26.0249 INFO TestCleanup: ONE_BBB
2013-01-16 11:55:26.0249 INFO TestInitialize: TWO_AAA
2013-01-16 11:55:26.0249 INFO TestCleanup: TWO_AAA
2013-01-16 11:55:26.0249 INFO TestInitialize: TWO_CCC
2013-01-16 11:55:26.0249 INFO TestCleanup: TWO_CCC
2013-01-16 11:55:26.0249 INFO TestInitialize: ONE_CCC
2013-01-16 11:55:26.0249 INFO TestCleanup: ONE_CCC
2013-01-16 11:55:26.0249 INFO TestInitialize: ONE_AAA
2013-01-16 11:55:26.0249 INFO TestCleanup: ONE_AAA

Antworten auf die Frage(4)

Ihre Antwort auf die Frage