8

Umwelt

  • Visual Studio 2012 Premium-Update 3
  • Team Foundation Server 2012 Update 3
  • bearbeiten: .NET Framework 4
  • Default (DefaultTemplate.11.1.xaml)
    • Visual Studio Test Runner
      • Zielplattform: X86

Problem

Ich habe 2 Unit-Test-Baugruppen:Microsoft Fake & TFS 2012 Visual Studio Test Runner - Einheit Test nicht sporadisch

  • ExtensionTests
  • UserTests

beide verwenden das Microsoft Fakes Framework (mit Stubs und Shims).

Ausführen der Unit-Tests arbeitet lokal feine (auf 4 verschiedene Maschinen getestet, auch auf dem Visual Studio auf dem Build-Server installiert ist), aber wenn wir einen Build-Agenten bauen mit, einig Unit-Test mit Ausnahme fehlschlägt, zB :

Unable to create instance of class UserTests.ClientUserTest. Error: System.TypeLoadException: Could not load type 'WorldDirect.CCM.Shared.Backend.SmartClassic.Fakes.StubClient' from assembly 'WorldDirect.Smart.Backend.Fakes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

oder das gleiche für eine Shim:

Test method ExtensionTests.ExtensionTests.UpdateExtensionValidate_NoGrnp_ChecksIpPbxDependencies threw exception: System.TypeLoadExceptio: Could not load type    'WorldDirect.CCM.Shared.Backend.SmartClassic.Fakes.ShimIpPbxRemoteDestination' from assembly 'WorldDirect.Smart.Backend.Fakes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

das interessante daran ist, sie nicht ein wenig Statistik sporadisch habe, habe ich versucht zu bilden:

#  | Outcome   | Comment 
19 | 64/64 passed | only 'UserTests'-UnitTests run, 'ExtensionTests' inactive 
20 | 37/64 passed | same source code as #19 
21 | 64/64 passed | same source code as #19 

22 | 64/66 passed | all 'UserTests' run as well as 2 'ExtensionTests', others still inactive; the 2 ExtensionTests failed with ShimIpPbxRemoteDestination-TypeLoadException 
23 | 38/65 passed | same source code as #22, notice NOTHING has changed, however 1 unit test was not even run in 'ExtensionTests'; however the second succeeds; all unit tests in 'UserTests' using MS Fakes fail with a StubClient-TypeLoadException 
24 | 38/65 passed | same source code as #22 

new day - no more luck :-(

    1  | 37/64 passed | uncommented the 2 'ExtensionTests', so same code as #19 
    2  | 37/64 passed | so same code as #1 
    3  | 64/64 passed | so same code as #1; suddenly they all work again 

Beachten Sie, dass neben den genannten Änderungen niemand den Quellcode geändert hat.
Alle Builds wurden mit einer detaillierten Log-Ebene erstellt; Shim Diagnostic = "wahr";
Nur explizit benötigte Shims/Stubs sind in der .fakes-Datei enthalten (sonst konnte MSBUILD den Exit-Code 1 nicht verwenden).

Es scheint alles ziemlich magisch zu sein, möglicherweise hat jemand schon die gleichen Probleme erlebt oder jemand hat einen Hinweis.

Vielen Dank im Voraus

+1

Bitte senden Sie einen Fehler mit einem kleinen Projekt, das das Problem reproduziert unter http://connect.Microsoft.com/VisualStudio. –

+1

Bug ist offen, siehe https://connect.microsoft.com/VisualStudio/feedback/details/794458/microsoft-fakes-tfs-2012-visual-studio-test-runner-unit-test-fail-sporadically – shadowrunner

+0

Vielen Dank . Wir haben heute damit begonnen, daran zu arbeiten. –

Antwort

9

Ich glaube, ich weiß, wo das Problem liegt, die TypeNotFoundException korrekt, wurden nicht generiert die entsprechenden Typen zumindest war (wie durch Reflector gezeigt), das machte mir denken. Genauer gesagt gibt es nur eine generierte Fake-Datei, die pro Assembly unter [buildName] \ Binaries erstellt wurde und da beide Assemblies dieselbe Assembly (backend.dll) vortäuschten - dies führte höchstwahrscheinlich zu einer Race Condition - die eine Assembly, die wurde später gebaut als der andere hatte seine endgültigen Shims/Stubs generiert; Das klärt jedoch nicht alle Probleme.

Der Grund, warum dies nicht auf einem regulären VS-Build angezeigt wird, ist, weil die Assemblys in ihrem jeweiligen [Assembly] \ FakeAssemblies-Verzeichnis generiert werden, keinen anderen Unit-Test beeinflussen (so wie es sein soll) .

Also meine Idee, dieses Problem zu umgehen, war, ALLE Shims/Stubs, die von beiden Test-Assemblies verwendet wurden, in beide .fakes-Konfigurationsdateien zu schreiben; Reflektor zeigte, dass wirklich alle benötigten Beilagen/Stubs zu dieser Zeit erzeugte bekam jedoch die Build fehlgeschlagen mit

Exception Message: MSBuild error 1 has ended this build. 

Ohne weitere Informationen in jeder (detailliert) log. Dieses Problem wird dadurch verursacht, dass ein generiertes Shim/Stub-Objekt, das in der .fakes-Datei angegeben ist, nicht verwendet wird (und natürlich ist das auch ein Problem, das gerade vom Build-Server angezeigt wird, wäre sonst zu langweilig ;-)).

Die endgültige Lösung, die ich gefunden habe, ist, ALLEN Code, der Shims/Stubs nutzt, in dieselbe Baugruppe zu setzen, wo nur 1 .fakes-file die fake-Assembly konfiguriert.

Jetzt funktioniert es gut :-), aber ich denke das MS-Dev-Team hat noch etwas zu tun, habe es aber nicht mit TFS2013 getestet; werde sowieso einen Fehler einreichen (wie ich schon 2 entdeckt habe)

Hoffe das hilft jemandem mit dem gleichen Problem.

Verwandte Themen