La prueba de la unidad falla en Ejecutar todo, pero no en Ejecutar pruebas seleccionadas con todas las seleccionadas

Estoy teniendo un comportamiento extraño. Si hago clic en "Ejecutar todo" en el Explorador de pruebas, falla una de mis pruebas unitarias, pero si selecciono todas las pruebas y hago clic en "Ejecutar pruebas seleccionadas", la prueba de la unidad pasa.

La prueba que está fallando está lanzando un error de reflexión:System.Reflection.TargetException: Non-static method requires a target. en un tipo que se define en el código dll que estoy probando. No parece haber nada extraño con la clase; hay muchas otras clases definidas en la dll con las que la reflexión está contenta. He incluido el seguimiento de pila de prueba a continuación.

NB Es una prueba compleja: lee entradas y respuestas esperadas de un archivo .xlsx, llena un LocalDb con datos del xlsx, realiza un cálculo utilizando los datos en el LocalDB y luego compara los valores calculados con los valores esperados. Sin embargo, como digo, está funcionando y funciona cuando ejecuto todas las pruebas (usando seleccionar todas> Ejecutar prueba seleccionada).

¿Qué tiene de diferente Run All? Cualquier apreciación sería apreciada.

He intentado una limpieza y reconstrucción sin suerte. El error de captura y registro de reflexión indica que la llamada GetValue se está lanzando para cada propiedad a la que intento acceder en el tipo, ¿pero solo cuando se ejecuta con "Ejecutar todo" y solo en este tipo? (Si detecto el error, todos los GetValues ​​tendrán éxito en todos los demás tipos).

Traza de pila

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
Solución

Así que resultó ser (a) mi problema: mi estado de prueba de unidad compartida con otra prueba de unidad y (b) un problema de orden. Tenga en cuenta que no es obvio en qué orden TestExplorer ejecutará sus pruebas. Creé un nuevo UnitTestProject con 2 x archivos Unit .est .est y tres TestMethods cada uno, es decir:

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() {}

Luego ejecutó estas pruebas a través de dos métodos, es decir (1) Ejecutar todo (2) Seleccionar todo y Ejecutar pruebas seleccionadas, y anotó el orden en que TestExplorer inició las pruebas. Los resultados para Ejecutar pruebas seleccionadas son bastante poco intuitivos:

-- 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

Respuestas a la pregunta(4)

Su respuesta a la pregunta