Фейки TFS построения модульных тестов сбой


У нас есть решение VS2013 .net 5.0 (VS2013 Premium) со всеми модульными тестами, проходящими нормально локально, но не выполняющими несколько тестов при запуске в VS Test Loader сборкой TFS с этим или подобным исключением: System.TypeLoadException: Could not load type 'System.Diagnostics.Fakes.ShimEventLog' from assembly 'System.4.0.0.0.Fakes, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0ae41878053f6703'. Вот пример неудачного теста:

    [TestMethod]
    public void WriteToEventLogTest_HappyPath()
    {
        EventLogEntryType eTypeInfo = EventLogEntryType.Information;
        bool sourceExistCalled = false;
        bool writeEntrycalled = false;

        using (ShimsContext.Create())
        {
            ShimEventLog.SourceExistsString = s =>
            {
                sourceExistCalled = true;
                return true;
            };

            ShimEventLog.AllInstances.WriteEntryStringEventLogEntryType = (@this, str, et) =>
            {
                writeEntrycalled = true;
            };

            Logging.WriteToEventLog(IpAddress, eTypeInfo);
            Assert.IsTrue(sourceExistCalled, "SourceExist() not called");
            Assert.IsTrue(writeEntrycalled, "WriteEntry() not called");
        }
    }`

Мы используем TFS 2013 update 5 под управлением Windows Server 2012 R2. Есть ли что-нибудь, что может вызвать эту проблему? Следует ли нам обновить TFS до последней версии, которая на данный момент является обновлением 5?

3 7

3 ответа:

Проблема была решена путем совместного использования файлов конфигурации фейков между тестовыми проектами на уровне решения

В нашей ситуации мы запускали несколько библиотек модульных тестов через VSTest в Jenkins.

Пример вызова:

"c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" 
"./TestDLL1.UnitTests/bin/Debug/TestDLL1.UnitTests.dll" 
"./TestDLL2.UnitTests/bin/Debug/TestDLL2.UnitTests.dll" 
"./TestDLL3.UnitTests/bin/Debug/TestDLL3.UnitTests.dll" 
/Enablecodecoverage /UseVsixExtensions:false /Logger:trx

Некоторые тестовые проекты имели подделки для одной и той же библиотеки DLL, причем большинство из них были настроены на подделку всего. Один тестовый проект подделывал только один класс, как показано ниже в XML, чтобы предотвратить предупреждение о том, что " некоторые подделки не могут быть сгенерированы."

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="Utilities"/>
  <StubGeneration>
    <Clear />
  </StubGeneration>
  <ShimGeneration>
    <Clear />
    <Add FullName="UIUtils.ExceptionDisplay"/>
  </ShimGeneration>
</Fakes>
По какой-то причине VSTest использовал эту версию для других тестовых проектов. Изменение одного тестового проекта для генерации всех подделок Исправлена проблема с системой.исключение TypeLoadException. Мы можем консолидировать наши подделки в будущем, чтобы легче было ограничить, какие классы подделываются, но сейчас это было гораздо более быстрым решением проблемы.

Если бы только был более простой способ подавить предупреждение "некоторые подделки не могут быть созданы"...

Просто имеет аналогичную проблему при использовании оболочек в нескольких отдельных проектах модульного тестирования. Очевидно, сгенерированные оболочки могут перезаписывать друг друга или что-то в этом роде.

Вот инструкции, которым я следовал, чтобы исправить это: прокрутите до середины этой страницы: https://msdn.microsoft.com/en-us/library/hh708916.aspx

Он находится под заголовком оптимизировать время сборки, но использовать его, чтобы решить вашу проблему тоже.

Поскольку такие сборки редко меняются на вашей машине, вы можете повторно используйте созданные сборки подделок в других проектах. Из ваших проектов модульного тестирования вы можете просто взять ссылку на скомпилированные сборки подделок, которые помещаются под сборками FakesAssemblies в папке проекта.

  • Создайте новую библиотеку классов с соответствующей версией среды выполнения .NET ваши тестовые проекты. Назовем это подделками.Предварительная сборка. Удалить класс1.cs-файл из проекта, не требуется.

    Добавьте ссылку на все системные и сторонние сборки, которые вы используете. необходимость Подделки для. и генерировать подделки, редактировать .файл подделок, если хотите, и сборка для создания поддельных сборок.

    Из ваших проектов модульного тестирования просто убедитесь, что у вас есть ссылка к fakes runtime DLL: C:\Program файлы\Microsoft Visual Studio 12.0\Common7\IDE\PublicAssemblies\Microsoft.Качественные инструменты.Тестирование.Подделки.dll

    Затем для каждой сборки, для которой вы создали подделки, добавьте ссылка на соответствующий файл DLL в Подделки.Папка Prebuild\FakesAssemblies о вашем проекте. (Эта папка получить созданный при компиляции)

    Для подтверждения вам нужно будет добавить ссылку, перейдя на страницу сгенерированный поддельный сборки..