Teste de unidade falha em Executar tudo, mas não em Executar testes selecionados com todos os selecionados

Estou com algum comportamento estranho. Se eu clicar em "Executar tudo" no Test Explorer, então um dos meus testes de unidade falhará, mas se eu selecionar todos os testes e clicar em "Executar testes selecionados", o teste da unidade será aprovado.

O teste que está falhando está lançando um erro de reflexão:System.Reflection.TargetException: Non-static method requires a target. em um tipo que é definido no código dll que estou testando. Não parece haver nada de estranho com a classe - há muitas outras classes definidas na dll com as quais a reflexão é feliz. Eu incluí o rastreio da pilha de teste abaixo.

Nota: É um teste complexo - lê entradas e respostas esperadas de um arquivo .xlsx, preenche um LocalDb com dados do xlsx, executa um cálculo usando os dados no LocalDB e compara os valores calculados com os esperados. No entanto, como eu digo, ele está funcionando e funciona quando eu executo todos os testes (usando selecionar todos> Executar teste selecionado).

O que é diferente no Run All? Quaisquer ideias serão apreciadas.

Eu tentei limpar e reconstruir sem sorte. Erro de reflexão de captura e registro indica que a chamada GetValue está jogando para cada propriedade que eu tento acessar no tipo - mas apenas quando executado por "Executar tudo" e somente neste tipo? (se eu pegar o erro, então todos os GetValues ​​serão bem-sucedidos em todos os outros tipos).

Rastreamento de pilha

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
Solução

Então, isso acabou sendo (a) meu problema - meu teste de unidade compartilhou estado com outro teste de unidade e (b) um problema de ordem. Esteja ciente de que não é óbvio em qual ordem o TestExplorer executará seus testes. Criei um novo UnitTestProject com 2 arquivos UnitTest .cs e três TestMethods, por exemplo:

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

Em seguida, executou esses testes por meio de dois métodos, ou seja, (1) Executar Tudo (2) Selecionar todos e Executar Testes Selecionados e registrou a ordem em que os testes foram iniciados pelo TestExplorer. Os resultados para Executar Testes Selecionados são bastante pouco 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

questionAnswers(4)

yourAnswerToTheQuestion